Construindo
Microservices com
Spring Cloud
Arquitetura Java
Claudio Eduardo
de Oliveira
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
SOBRE
ADTSYS
Eat your
own
Dog Food
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
MOTIVAÇÃO
http://www.infoworld.com/article/3075880/application-development/microservice-architecture-is-agile-software-architecture.html
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
MICROSERVICE
S
VANTAGENS
- Desacoplamento
- Agilidade na entrega de Valor
- Deploy independente
- Diversidade tecnológica
http://martinfowler.com/articles/microservice-trade-offs.html
MICROSERVICE
S
DESVANTAGEN
S- Complexidade Operacional
- Comunicação
- Consistência Eventual
http://martinfowler.com/articles/microservice-trade-offs.html
MICROSERVICE
S
- Configurações Centralizadas
- Service Registry / Service
Discovery
- Circuit Breaker
- API Proxy
Nuvem
Híbrida
Nuvem
Híbrida
Spring Cloud
Netflix OSS
+
Nuvem
Híbrida
SPRING BOOT
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
spring cloud
spring cloud
=
spring boot
+
steroids
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/
spring cloud config
- Configurações Centralizadas
- Service Registry / Service
Discovery
- Circuit Breaker
- API Proxy
- HTTP resource based API
- encrypt / Decrypt
- integração Spring Boot
@EnableConfigServer
- suporte múltiplos ambiente
(dev, qa, prod)
- arquivos (github / filesystem)
spring cloud config
- spring cloud server
- spring cloud client
spring cloud config
spring cloud config
Config Server
Dependência
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
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);
}
}
spring cloud configConfig Server
Setup (bootstrap.yml)
spring:
application:
name: configserver
spring cloud config
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
Config Client
Dependência
spring cloud configConfig Client
Setup (bootstrap.yml)
spring:
profiles: default
application:
name: predictors
cloud:
config:
uri: http://configserver:8001/
server:
port: 7003
Cloud Bus
spring cloud bus
- Push de configurações
- RabbitMQ
spring cloud bus
Config Client Bus
Funcionamento
spring cloud busCloud Bus
Dependência
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
spring cloud busConfig Client Bus
Setup
info:
component: Predictor MicroService
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
spring cloud busConfig Client Bus
Exemplo
@Service
@RefreshScope
public class ParticipantService {
@Autowired
private RestTemplate restTemplate;
@Value("${services.user.info}")
private String url;
}
spring cloud bus
Config Client Bus
Exemplo
services:
user:
info: http://USERS/
event:
info: http://EVENTS/
spring cloud eureka
- Configurações Centralizadas
- Service Registry / Service
Discovery
- Circuit Breaker
- API Proxy
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
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
- “lookup” de serviços
- clientes enviam heartbeats
- remoção de clientes não
funcionais
- testado em produção pelo
Netflix
spring cloud eureka
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-
server</artifactId>
</dependency>
spring cloud eurekaEureka Server
Dependência
spring cloud eureka
Eureka Server
Setup
@SpringBootApplication
@EnableEurekaServer
@EnableDiscoveryClient
public class DiscoveryApplication{
public static void main(String[] args) {
SpringApplication.run(DiscoveryApplication.class,
args);
}
}
spring cloud eurekaEureka Server
Exemplo
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
spring cloud eurekaEureka Client
Dependência
spring cloud eurekaEureka Client
Setup
info:
component: Ranking MicroService
server:
port: 7002
eureka:
client:
serviceUrl:
defaultZone: http://discovery:8761/eureka/
spring cloud eurekaEureka Client
Setup
@SpringCloudApplication
public class RankingApplication {
public static void main(String[] args) throws
Exception {
SpringApplication.run(RankingApplication.class,
args);
}
}
spring cloud eureka
Eureka Client
Setup
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker
public @interface SpringCloudApplication {
}
spring cloud hystrix
- Configurações Centralizadas
- Service Registry / Service
Discovery
- Circuit Breaker
- API Proxy
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
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
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
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
spring cloud hystrix
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
Cloud Hystrix
Dependência
spring cloud hystrixCloud Hystrix
Setup
@SpringCloudApplication
@EnableHystrix
public class PredictorApplication {
public static void main(String[] args) throws Exception {
SpringApplication.run(PredictorApplication.class, args);
}
}
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;
}
}
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;
}
}
spring cloud hystrix
● microservices sem monitoramento torna-se
impraticável
● hystrix provê dashboards
● @EnableHystrixDashboard
Cloud Hystrix
Monitoramento
spring cloud zuul
- Configurações Centralizadas
- Service Registry / Service
Discovery
- Circuit Breaker
- API Proxy
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
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)
spring cloud zuul
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>
Cloud Zuul
Dependência
spring cloud zuulCloud Zuul
Setup
@SpringCloudApplication
@Controller
@EnableZuulProxy
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class,
args);
}
}
spring cloud zuulCloud Zuul
Setup
info:
component: API Gateway (Zull Proxy)
eureka:
registryFetchIntervalSeconds: 5
serviceUrl:
defaultZone:
http://${eureka.host:localhost}:${eureka.port:8761}/eureka/
zuul:
routes:
users:
path: /api/v1/users/**
serviceId: users
spring cloud zuulCloud Zuul
Exemplo (client)
@SpringCloudApplication
@EnableZuulProxy
public class EventApplication {
public static void main(String[] args) throws Exception {
SpringApplication.run(EventApplication.class, args);
}
}
#tip
email: claudioed.oliveira@gmail.com
linkedin: https://br.linkedin.com/in/claudioedoliveira
twitter: @claudioed
blog: www.claudioliveira.com
github: https://github.com/claudioed
Claudio Eduardo de Oliveira
Referências
http://martinfowler.com/articles/microservices.html
http://microservices.io/
http://microservices.io/patterns/apigateway.html
http://projects.spring.io/spring-boot/
https://cloud.spring.io/spring-cloud-netflix/
http://callistaenterprise.se/blogg/teknik/2015/04/10/building-microservices-with-spring-cloud-
and-netflix-oss-part-1/
TDC2016SP - Construindo Microserviços usando Spring Cloud

TDC2016SP - Construindo Microserviços usando Spring Cloud

Editor's Notes

  • #17 Salientar à respeito das métricas Undertow non blocking Standalone pode rodar com docker de maneira mais fácil @EnableAutoConfiguration
  • #18 Com steroids para sistemas distribuídos Baseados em padrões de projeto Não gera código fonte
  • #19 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
  • #24 @EnableConfigServer indica que este microservice é um “provedor” de configurações
  • #27 configserver já denota a idéia do service discovery é sensível ao profile bootstrap.yml é lido ao aplicação “subir” antes do application.yml
  • #29 Atualização de properties em Runtime Beans do spring são destruídos e construídos com os novos valores
  • #31 rabbit é usado para fazer o “push” das novas configurações
  • #32 @RefreshScope indica ao Spring que esse bean pode ser “atualizado” por alguma trigger
  • #33 exemplo de configurações que conectam no Eureka
  • #36 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
  • #37 clientes
  • #39 @EnableEurekaServer indica que este microservice é uma instância do Eureka load balance é para end-user (web traffic) , enquanto eureka fica átras do Load Balance
  • #43 @SpringCloudApplication anotação “mágica”
  • #47 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
  • #48 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
  • #49 Fechamento automático baseado nas configurações Fallbacks quando há falhas try catch sofisticado
  • #56 Falar do “lookup”
  • #57 Falar do “lookup”
  • #58 Falar do “lookup”
  • #59 Falar do “lookup”
  • #60 Falar do “lookup”
  • #61 Falar do “lookup”
  • #62 Falar do “lookup”