Simples cadastro de campanha usando micro serviços
Simples CRUD para o cadastro do time
Metodo | Path | Descrição |
---|---|---|
GET | /times/{id} | Retorna o time pelo Id |
GET | /times | Retorna todos os time |
PUT | /times/ | Altera o time |
POST | /times/ | Registra novo time |
Simples CRUD para a campanha
Metodo | Path | Descrição |
---|---|---|
GET | /campanhas/{id} | Retorna a campanha pelo Id |
GET | /campanhas | Retorna todas as campanhas ativas pela data da vigencia |
PUT | /campanhas/ | Altera a campanha |
POST | /campanhas/ | Registra nova campanha |
Serviço que controla as interaçoes do torcedor com campanha
Metodo | Path | Descrição |
---|---|---|
GET | /torcedores/{id} | Retorna o torcedor pelo Id |
GET | /torcedores | Retorna todos os torcedores |
GET | /torcedores{id}/associar/{idCampanha} | Associa o torcedor pela campanha |
PUT | /torcedores/ | Altera o torcedor |
POST | /torcedores/ | Registra novo torcedor |
- Cada microserviço tem o seu próprio banco de dados usando a tecnologia MONGODB
- A comunicação entre os microserviços está sendo utilizada apenas API REST
Usando os frameworks disponibilizados via Spring cloud para a construção dos serviços.
Esta é uma única entrada para todo o sistema, usada para redirecionar todas requisições para cada microserviço.
Utilizando o framework ZUUL parte no Netflix OSS, e com o Spring Cloud com uma simples annotation se pode a habilitar o Zuul @EnableZuulProxy
. Aqui uma simples configuração para o serviço de Campanha:
zuul:
routes:
campanha-service:
path: /campanhas/**
serviceId: campanha-service
stripPrefix: false
Isso significa que todas as chamadas iniciando /campanhas
irão ser redirecionados para o serviço de Campanha.
Outra parte da arquitetura é o serviço de descoberta. Estou usando o framework Netflix Eureka. Esse framework é um bom exemplo do client-side discovery pattern, onde o cliente é responsável em derterminar a sua localização.
Com Spring Cloud para habilitar o Eureka Registry apenas precisar adicionar a annotation @EnableDiscoveryClient
e adicionar simples configurações ao projeto.
Exemplo do serviço discovery habilitado com @EnableDiscoveryClient
annotation e com a configuração no arquivo bootstrap.yml
:
spring:
application:
name: campanha-service
No Netflix OSS possui boas ferramentas para isso.
Ribbon é um client side load balancer.
Ao usar o Spring Cloud e o Serviço de Descoberta, o Ribbon já está integrado.
Hystrix é a implementação Circuit Breaker pattern, que controla a latencia e falha de dependencias.
Com o Hystrix é possível adicionar metodos de fallback, caso falhe a chamada de algum serviço.
Feign é um cliente HTTP, que integra direto com Ribbon e Hystrix. Com a annotation @EnableFeignClients
, já fica configurado Load Balancer, Circuit Breaker e HTTP Client.
Aqui um exemplo do Serviço de Campanha, com comando para Fallback:
@FeignClient(name = "time-service", fallback = TimeServiceClientImpl.class )
public interface TimeServiceClient {
@RequestMapping(method = RequestMethod.GET, value = "/times/{id}", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
String findTime(@PathVariable("id") String id);
}
- Tudo que precisa é uma interface e implementar um classe com o metodo de fallback
Nas configurações do projetos, cada microserviço com Hystrix envia metricas para o Turbine via Spring Cloud Bus (with AMQP broker). O projeto de monitoração é apenas um projeto usando Spring Boot com Turbine e Hystrix Dashboard.
Usando Serviço de Mensagens para enviar as mensagens dos serviços para o Monitor Dashboar e também utilizado para avisar possíveis serviços quando uma Campanha no Serviço de Campanha é alterada. Segue o exemplo de chamada e configuração no Serviço de Campanha:
@EnableBinding(CampanhaMessage.class)
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
private void enviaCampanhasAlteradas(Collection<Campanha> campanhas) {
campanhas.stream().forEach(c -> {
Message<Campanha> m = MessageBuilder.withPayload(c).build();
channel.output().send(m);
});
}
Para rodar tudo você precisa de no mínimo 4 Gb
de RAM, uma vez que tem 8 aplicações Spring Boot, 4 instancias de MongoDB e RabbitMQ.
- Instalar Java 8
- Instalar Maven 3.3 ou acima
- Instlar Docker e Docker Compose
./maven-all.sh
./maven-test-all.sh
docker-compose up -d
- http://localhost:80 - Gateway
- http://localhost:8761 - Eureka Dashboard
- http://localhost:9000/hystrix - Hystrix Dashboard (cole o link do turbine)
- http://localhost:8989 - Turbine stream (source para o Hystrix Dashboard)
- http://localhost:15672 - RabbitMq (login/password: guest/guest)