Jaimail





O legado
- Aplicação Monolítica
- Java EE
- Weblogic
- JMS
- Escalabilidade com alto custo
- Tratamento de erros ineficiente
- Sem prioridade
- Janelas de atualização

Jaimail 2.0
- Escalabilidade horizontal
- Por aplicação cliente
- Por Funcionalidade
- Microservices
- Stack Netflix
- Spring Cloud
- Concorrência
- Tratamento de erros efetivo
- Docker
- DevOps










Escalabilidade

Microservices



Desenvolvimento
- POC Spring Cloud + Docker
- Router
- Kafka
- Sender (Mail + SMS)
- Security
- Sidecar (Legado)
- Error Message
- Callback (Zenvia)
- Bounce
- RMA (Remote Message Access)
-
Statistics
- Azkaban
- Hive
- Hadoop
-
Admin
- API
- Rubeus
- Angular 5+
-
Tracing + Logging + Monitoring
- Zipkin
- ELK / Splunk / Graylog
- Hystrix Dashboard + Turbine


POC
Spring Cloud + Docker
- Servidor de configuração: Spring Cloud Config
- Serviço de registry e discovery: Eureka
- Comunicação entre serviços com load balance: Feign, Ribbon
- Servidor de borda: Zuul API gateway
- Disponibilidade: Circuit breaker com Hystrix + Turbine
- Rastreabilidade: Tracing com Sleuth + Zipkin
- Deploy e escalabilidade: Containers Docker
Eureka

Hystrix Dashboard + Turbine



Hystrix Dashboard + Turbine
Zipkin

Zipkin


POC
Dependências
Para rodar Eureka (client) e Ribbon (Load Balancer) em um microserviço
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
Para rodar Eureka server (registry | discovery)
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
POC
Dependências
Para rodar o API Gateway (Zuul)
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>
Para rodar o servidor de configuração
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
POC
Dependências
Como o Hystrix utiliza o RabbitMQ para se comunicar entre o Circuit breaker e Dashboard (aplicação de monitoração), é necessário utilizar as dependências do RabbitMQ com o Hystrix. Certifique-se que o RabbitMQ está com o apontamento correto senão o Turbine não funcionará.
Para rodar o Hystrix
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-hystrix-amqp</artifactId>
</dependency>
POC
Dependências (monitor-dashboard)
Para habilitar o hystrix dashboard
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
</dependency>
Para coletar as métricas do hystrix via HTTP
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-turbine</artifactId>
</dependency>
Para coletar as métricas via streaming
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-turbine-amqp</artifactId>
</dependency>
POC
Dependências (tracing-server)
Para habilitar o Zipkin
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-autoconfigure-ui</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-zipkin-stream</artifactId>
</dependency>
Para habilitar o Sleuth
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-stream</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream-binder-rabbit</artifactId>
</dependency>
POC
Anotações
Eureka Server (registry | discovery)
@EnableEurekaServer
Config Server
@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
}
}
Zuul Server (API Gateway)
@EnableZuulProxy
@EnableDiscoveryClient
Habilitar Circuit Breaker
@EnableCircuitBreaker
Habilitar Interfaces Feign
@EnableFeignClients
POC
Docker Commands / Scripts
Build (build-images.sh)
docker build -t registry.vivotools.com.br/config-server ./config-server
Start containers (start-containers.sh)
export APP_CONFIG_DIR=/home/app/jaimail-microservices/config
export APP_LOGGING_DIR=/home/app/jaimail-microservices/logs
docker-compose up -d
Push image to registry (push-images.sh)
docker push registry.vivotools.com.br/config-server
POC
Docker Commands
Stop containers
docker-compose down
Run microservice
docker-compose up config-server -d
Scale
docker-compose scale jaimail-router=3
Boas práticas
- Conjunto pequeno de regras de negócio por microserviço
- Utilizar API Gateway - Microserviços não precisam ficar expostos
- Utilizar Service & Discovery
- Utilizar configuração centralizada - Sem restart
- Utilizar logs centralizados e tracing
- Mensageria na comunicação - Evite requisições http
- Não aplique contexto transacional entre microserviços
- Um serviço por container
- Tenha uma estratégia de tolerância a falha - Circuit Breaker
- Escreva testes unitários
- Integração contínua
- Um banco de dados por microserviço
Dificuldades
- Mais complexidade
- Desenvolvimento
- Distribuição
- Operações
- Testes integrados
- Troubleshooting
- Múltiplos bancos de dados
- Transações
- Duplicação de código
... e irão surgir novos problemas
Referências
- http://projects.spring.io/spring-cloud
- https://github.com/Netflix
- https://start.spring.io
- https://docs.docker.com
Referências
- https://www.youtube.com/watch?v=L9jAXd9ZnO4
- https://www.youtube.com/watch?v=NqBSGizP-dk
- https://www.youtube.com/watch?v=tUl2xjhU4As
- https://www.youtube.com/watch?v=ZyK5QrKCbwM
Jaimail
By Rodolfo Chaves Fernandes
Jaimail
Jaimail 2.0 e microservices
- 402