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