Ferramentas necessárias:
Para iniciarmos nossa aplicação, será necessário preparar o ambiente local para termos acessos as tecnologias utilizadas, vamos utilizar a magia do Docker e rodar o kafka, activemq, elasticsearch com kibana para visualizarmos dados do elasticsearch, redis e postgres.
Crie uma pasta com o nome a seu gosto e dentro da mesma crie outra pasta com o nome de ambiente, dentro da pasta ambiente crie um arquivo com o nome docker-compose.yaml e dentro deste arquivo copie o seguinte codigo.
version: '3'
services:
mqseries:
image: ibmcom/mq:latest
ports:
- "1414:1414"
- "9443:9443"
hostname: mq
environment:
- LICENSE=accept
- MQ_QMGR_NAME=QM1
- MQ_ADMIN_PASSWORD=admin
container_name: mqserver
stdin_open: true
tty: true
restart: always
mq:
image: rmohr/activemq
container_name: mq
ports:
- 8161:8161
- 61616:61616
- 5672:5672
- 1883:1883
- 61613:61613
zookeeper:
image: "confluentinc/cp-zookeeper:5.2.1"
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
ZOOKEEPER_SYNC_LIMIT: 2
kafka:
image: "confluentinc/cp-kafka:5.2.1"
ports:
- 9092:9092
depends_on:
- zookeeper
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: "zookeeper:2181"
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:29092,PLAINTEXT_HOST://localhost:9092
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: "1"
KAFKA_AUTO_CREATE_TOPICS_ENABLE: "true"
postgres:
image: 'postgres:alpine'
volumes:
- postgres-volume:/var/lib/postgresql/data
ports:
- 5432:5432
environment:
POSTGRES_USER: bootcamp
POSTGRES_PASSWORD: password
POSTGRES_DB: bootcamp
POSTGRES_HOST: postgres
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.3.1
container_name: elasticsearch
environment:
- node.name=ws-es-node
- discovery.type=single-node
- cluster.name=ws-es-data-cluster
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms1024m -Xmx1024m"
# - xpack.security.enabled='false'
# - xpack.monitoring.enabled='false'
# - xpack.watcher.enabled='false'
# - xpack.ml.enabled='false'
# - http.cors.enabled='true'
# - http.cors.allow-origin="*"
# - http.cors.allow-methods=OPTIONS, HEAD, GET, POST, PUT, DELETE
# - http.cors.allow-headers=X-Requested-With,X-Auth-Token,Content-Type, Content-Length
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- vibhuviesdata:/usr/share/elasticsearch/data
ports:
- 9200:9200
- 9300:9300
networks:
- esnet
kibana:
image: docker.elastic.co/kibana/kibana:7.3.1
container_name: kibana
environment:
SERVER_NAME: 127.0.0.1
ELASTICSEARCH_HOSTS: http://elasticsearch:9200
# XPACK_GRAPH_ENABLED: false
# XPACK_ML_ENABLED: false
# XPACK_REPORTING_ENABLED: false
# XPACK_SECURITY_ENABLED: false
# XPACK_WATCHER_ENABLED: false
ports:
- "5601:5601"
networks:
- esnet
depends_on:
- elasticsearch
restart: "unless-stopped"
redis:
image: 'bitnami/redis:latest'
ports:
- 6379:6379
environment:
- ALLOW_EMPTY_PASSWORD=yes
volumes:
grafana-volume:
prometheus-volume:
postgres-volume:
vibhuviesdata:
driver: local
networks:
esnet:
Agora dentro da pasta ambiente execute o seguinte comando docker-compose up -d
Dentro do console docker você devera visualizar os containers rodando para cada tecnologia que utilizaremos.
Agora vamos utilizar o spring starter para criar nossa primeira estrutura de API.
Feito isso, vamos configurar nosso tópico kafka que ira produzir a mensagem através do arquivo de properties da aplicação, defina o arquivo de application.yml igual o código abaixo.
#APP SPECIFIC CUSTOM PROPERTIES
order:
topic: cadastra-usuario
#SPRING PROPERTIES
spring:
kafka:
bootstrap-servers: localhost:9092
#properties:
#Server host name verification is disabled by setting ssl.endpoint.identification.algorithm to an empty string
#ssl.endpoint.identification.algorithm:
#ssl:
# protocol: SSL
# trust-store-location: classpath:/app/store/truststore.jks
# trust-store-password: <TURST_STORE_PASSWORD>
# key-store-location: classpath:/app/store/keystore.jks
# key-store-password: <KEY_STORE_PASSWORD>
# key-password: <KEY_PASSWORD>
producer:
retries: 1
acks: all
group-id: group-id
key-serializer: org.apache.kafka.common.serialization.StringSerializer
value-serializer: org.apache.kafka.common.serialization.StringSerializer
auto:
create:
topics:
enable=true:
Vamos entender estas configuraçoes:
- Definição do nome do topico kafka onde a mensagem sera produzida.
- Definição do endpoint de acesso ao kafka. Obs: Por ser localhost não será necessário configurarmos o certificado ssl, porem deixamos as configs comentada.
- Configurações do producer kafka como o tipo de serialização que a mensagem sera produzida, no caso utilizaremos String, quantidades de tentativas para produzir esta mensagem e o id identificador de um grupo de producers.
- Habilita a auto criação de um topico kafka
Documentação api de producer do kafka
Após isto criamos uma classe controller que ira receber a requisição e chamar um serviço de salvar usuário responsável por produzir e enviar os dados do usuário como mensagem, segue o link do github onde a aplicação esta armazenada para que possam conferir.
Top comments (0)