This document discusses microservices architecture and how to build microservices using Spring Cloud. It introduces microservices concepts and benefits/disadvantages. It then covers various Spring Cloud Netflix projects like Spring Cloud Config for centralized configurations, Spring Cloud Eureka for service discovery, Spring Cloud Hystrix for circuit breaking, and Spring Cloud Zuul for API gateway proxying. Code samples and dependencies are provided for setting up each Spring Cloud project.
2. About
Me
Acionistas
Claudio Eduardo de Oliveira
Java Developer @ ADTsys
Bacharel em Ciência da Computação
Cursando MBA em Arquitetura de Soluções em Tecnologia (DeVry/Metrocamp)
Entusiasta Docker / Spring
6. Agenda
Motivação
Microservices
Spring Boot + Spring Cloud
Portifólio de projetos
o Spring Cloud Config
o Spring Cloud Eureka
o Spring Cloud Bus
o Spring Cloud Hystrix
o Spring Cloud Zuul
8. MICROSERVICE
S
The term "Microservice Architecture" has
sprung up over the last few years to describe
a particular way of designing software
applications as suites of independently
deployable services. While there is no
precise definition of this architectural style,
there are certain common characteristics
around organization around business
capability, automated deployment,
intelligence in the endpoints, and
decentralized control of languages and
data
16. spring boot
- criação de aplicações standalone
spring
- NO xml
- configuração automática
- métricas e health checks
- tomcat, jetty ou undertow embed
spring boot
features
18. spring cloud
- spring cloud config
- spring cloud netflix
- spring cloud security
- spring cloud bus
- spring cloud consul
- spring cloud sleuth
- spring cloud stream
- spring cloud zookeeper
- ...
portifólio
http://projects.spring.io/spring-cloud/
19. spring cloud config
- Configurações Centralizadas
- Service Registry / Service
Discovery
- Circuit Breaker
- API Proxy
20. - HTTP resource based API
- encrypt / Decrypt
- integração Spring Boot
@EnableConfigServer
- suporte múltiplos ambiente
(dev, qa, prod)
- arquivos (github / filesystem)
spring cloud config
21. - spring cloud server
- spring cloud client
spring cloud config
22. spring cloud config
Config Server
Dependência
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
23. spring cloud configConfig Server
Setup
/**
* @author Claudio E. de Oliveira.
*/
@SpringCloudApplication
@EnableConfigServer
public class ConfigApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigApplication.class,
args);
}
}
28. - Push de configurações
- RabbitMQ
spring cloud bus
Config Client Bus
Funcionamento
29. spring cloud busCloud Bus
Dependência
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
31. spring cloud busConfig Client Bus
Exemplo
@Service
@RefreshScope
public class ParticipantService {
@Autowired
private RestTemplate restTemplate;
@Value("${services.user.info}")
private String url;
}
32. spring cloud bus
Config Client Bus
Exemplo
services:
user:
info: http://USERS/
event:
info: http://EVENTS/
33. spring cloud eureka
- Configurações Centralizadas
- Service Registry / Service
Discovery
- Circuit Breaker
- API Proxy
34. spring cloud eureka
Service Discovery
Conceito
o clientes se registram no
servidor
o servidor lista os clientes
o clientes conhecem são
reconhecidos por outros
clientes
35. spring cloud eureka
Service Discovery
Desafios
o # de chamadas a microservices
o configuração manual impraticável
o # de instâncias de serviços
o resolver dependências em runtime
36. - “lookup” de serviços
- clientes enviam heartbeats
- remoção de clientes não
funcionais
- testado em produção pelo
Netflix
spring cloud eureka
38. spring cloud eureka
Eureka Server
Setup
@SpringBootApplication
@EnableEurekaServer
@EnableDiscoveryClient
public class DiscoveryApplication{
public static void main(String[] args) {
SpringApplication.run(DiscoveryApplication.class,
args);
}
}
42. spring cloud eurekaEureka Client
Setup
@SpringCloudApplication
public class RankingApplication {
public static void main(String[] args) throws
Exception {
SpringApplication.run(RankingApplication.class,
args);
}
}
43. spring cloud eureka
Eureka Client
Setup
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker
public @interface SpringCloudApplication {
}
44. spring cloud hystrix
- Configurações Centralizadas
- Service Registry / Service
Discovery
- Circuit Breaker
- API Proxy
45. Falácias da Computação
Distribuída
spring cloud hystrix
1. A rede é confíavel
2. A latência é zero
3. A largura da banda é infinita
4. A rede é segura
5. A topologia não se altera
6. Existe apenas um administrador
7. Custo de transporte é zero
8. A rede é homogênea
46. spring cloud hystrix
Cascading Failures
Problema
● # número de dependências pode levar ao “cascading failures”
● sistemas distribuídos por padrão tem mais chances de falhar
47. Circuit Breaker
Conceito
spring cloud hystrix
● Mesmo comportamento de um circuito elétrico
● “Aberto” falha na operação e a mesma não deve
ser chamada
● “Fechado” funcionamento normal, a operação
pode ser chamada
● “Parcialmente Aberto” pode haver chamada mas
serão auditadas para ver se o problema ainda
persiste
48. Netflix Hystrix
spring cloud hystrix
● provê mecanismo de “fallback”
● “fallbacks” podem ser encadeados (cuidado!!!)
● fácil integração com Spring (via annotations)
● fechamento automático do circuito
50. spring cloud hystrixCloud Hystrix
Setup
@SpringCloudApplication
@EnableHystrix
public class PredictorApplication {
public static void main(String[] args) throws Exception {
SpringApplication.run(PredictorApplication.class, args);
}
}
51. spring cloud hystrix
Cloud Hystrix
Exemplo (command)
@Service
@RefreshScope
public class ParticipantService {
@HystrixCommand(fallbackMethod = "getParticipantInCache")
public Participant getUserInfo(String participantId){
log.info("[REQUEST-PARTICIPANT-INFO] Request event info ");
ResponseEntity<Participant> response = this.restTemplate.getForEntity(this.url
+ participantId, Participant.class);
final Participant participant = response.getBody();
cache.put(participant.getId(),participant);
return participant;
}
}
52. spring cloud hystrixCloud Hystrix
Exemplo (fallback)
@Service
@RefreshScope
public class ParticipantService {
public Participant getParticipantInCache(String participantId){
Participant cachedParticipant = cache.getIfPresent(participantId);
if(Objects.isNull(cachedParticipant)){
log.error(String.format("[REQUEST-PARTICIPANT-INFO] CACHE - Error on
retrieve participant %s information", participantId));
throw new InvalidParticipant(participantId);
}
return cachedParticipant;
}
}
53. spring cloud hystrix
● microservices sem monitoramento torna-se
impraticável
● hystrix provê dashboards
● @EnableHystrixDashboard
Cloud Hystrix
Monitoramento
54. spring cloud zuul
- Configurações Centralizadas
- Service Registry / Service
Discovery
- Circuit Breaker
- API Proxy
55. spring cloud zuulAPI Proxy
Problemas
o API internas “expostas”
o segurança
o CORS
o Roteamento
o Versionamento
o Cache
o # excessivo de chamadas remotas
56. spring cloud zuul
API Proxy
Spring Cloud Zuul
o filtros (pre/pos)
o roteamento para serviços
o versionamento de APIs
o CORS
o integração Eureka (service name)
Salientar à respeito das métricas
Undertow non blocking
Standalone pode rodar com docker de maneira mais fácil
@EnableAutoConfiguration
Com steroids para sistemas distribuídos
Baseados em padrões de projeto
Não gera código fonte
Sleuth para gerenciamento de tracing em sistemas distribuídos , like transactionID
Eureka, consul & zookeeper para service discovery
Stream para aplicações que consomem streams, integração kafka e rabbitMQ (dependendo do classpaht)
Security oauth2, basic http e outroe métodos de autenticação/autorização
@EnableConfigServer indica que este microservice é um “provedor” de configurações
configserver já denota a idéia do service discovery
é sensível ao profile
bootstrap.yml é lido ao aplicação “subir” antes do application.yml
Atualização de properties em Runtime
Beans do spring são destruídos e construídos com os novos valores
rabbit é usado para fazer o “push” das novas configurações
@RefreshScope indica ao Spring que esse bean pode ser “atualizado” por alguma trigger
exemplo de configurações que conectam no Eureka
Falar do “lookup” em runtime]
# das instâncias ficam impossíveis de configurações manuais
microservices tendem a ser comunicar com outros microservices essa comunicação pode ser dolorosa se for manual
clientes
@EnableEurekaServer indica que este microservice é uma instância do Eureka
load balance é para end-user (web traffic) , enquanto eureka fica átras do Load Balance
@SpringCloudApplication anotação “mágica”
Sistemas distribuídos tendem a falhar mais que aplicações monoliticas
Dependência entre microservices tendem acontecer naturalmente
Monitoramento se torna essencial
E se algum desses serviços falhar
Falar sobre o número de threads que podem “ficar” esperando , pode travar outro sistema
Comportamento de um circuito elétrico residencial, porém com potencialidades
Altamente configurável, por porcentagem de erros e janela de tempo
É uma defesa da aplicação
Fechamento automático baseado nas configurações
Fallbacks quando há falhas
try catch sofisticado