Construindo
Microservices com
Spring Cloud
Arquitetura Java
Claudio Eduardo
de Oliveira
About me
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
Contatos:
Email: claudioed.oliveira@gmail.com
Linkedin: https://br.linkedin.com/in/claudioedoliveira
Twitter: @claudioed
Blog: www.claudioliveira.com
Eat your
own
Dog Food
Agenda
Motivação
Microservices
Spring Boot + Spring Cloud
Portifólio de projetos
Spring Cloud Config
Spring Cloud Eureka
Spring Cloud Bus
Motivação
http://www.infoworld.com/article/3075880/application-development/microservice-architecture-is-agile-
software-architecture.html
motivacao
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
http://martinfowler.com/articles/microservices.html
microservices
- Desacoplamento
- Agilidade na entrega de
Valor
- Deploy independente
- Diversidade tecnológica
Vantagens
http://martinfowler.com/articles/microservice-trade-offs.html
microservices
- Complexidade Operacional
- Comunicação
- Consistência Eventual
Desvantagens
http://martinfowler.com/articles/microservice-trade-offs.html
microservices
microservices
- Configurações Centralizadas
- Service Registry / Service
Discovery
- Circuit Breaker
- API Proxy
Spring Cloud
Netflix OSS
+
Advice
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 configConfig 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 busConfig 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 busConfig 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
● clientes se registram no
servidor
● servidor lista os clientes
● clientes conhecem são
reconhecidos por outros
clientes
spring cloud eureka
Service Discovery
Desafios
● # de chamadas a microservices
● configuração manual
impraticável
● # de instâncias de serviços
● 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 eurekaEureka 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 eurekaEureka 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 hystrixCloud 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
● API internas “expostas”
● segurança
● CORS
● Roteamento
● Versionamento
● Cache
● # excessivo de chamadas remotas
spring cloud zuulAPI Proxy
Spring Cloud Zuul
● filtros (pre/pos)
● roteamento para serviços
● versionamento de APIs
● CORS
● 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/
TDC 2016 - Arquitetura Java - Spring Cloud

TDC 2016 - Arquitetura Java - Spring Cloud

Editor's Notes

  • #5 Construção de softwares voltados para à nuvem Expertise em nuvem
  • #8 Deploys independentes Foco negócios e na organização Bancos de dados independentes Sistemas poliglota “linguagens”
  • #9 Agilidade para o negócio Sistemas tendem à terem maior desacoplamento Interface Uniforme (REST) Deploy independente , posso realizar deploy de uma nova feature sem ter de parar a aplicação (caracteristica presente em aplicações monoliticas) Não se prender uma linguagem de programação específica, podendo explorar as potencialidades de cada uma Enfatizar que o DDD pode ajudar na entrega de valor, e definir os “bounded contexts”
  • #10 Falar brevemente das dificuldades, explorar as dificuldades que são o foco da apresentação Gestão de Configurações Service Discovery / Service Registry API Proxy Pior erro que você pode cometer é aquele que você não sabe que esta cometendo Regra do “Depende”...
  • #11 Configurações Centralizadas Muitos Serviços tendem a ficar difícil de gerenciar ambientes Atualização de configurações, (a aplicação deve “ficar fora” por causa disso) !
  • #12 Explorar as vantagens para o negócio que viabiliza a adoção de microservices
  • #13 Quem poderá nos ajudar?? Foco no ambiente de execução (replicas…) Spring cloud conjunto de subprojetos do spring, que tem foco em resolver problemas comuns a ambientes de aplicações distribuídas Netflix OSS conjunto de ferramentas do netflix para resolver problemas de ambientes distribuídos, especialmente nuvem
  • #14 isso não vai resolver todos seus problemas pode ser víavel se você já tem familiaridade com spring
  • #15 Spring boot Extinção de xml Desenvolvimento rápido Série de projetos, que oferecem “facilidades” desde persistência, integração e construção de projetos
  • #16 Salientar à respeito das métricas Undertow non blocking Standalone pode rodar com docker de maneira mais fácil @EnableAutoConfiguration
  • #17 Com steroids para sistemas distribuídos Baseados em padrões de projeto Não gera código fonte
  • #18 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
  • #23 @EnableConfigServer indica que este microservice é um “provedor” de configurações
  • #26 configserver já denota a idéia do service discovery é sensível ao profile bootstrap.yml é lido ao aplicação “subir” antes do application.yml
  • #28 Atualização de properties em Runtime Beans do spring são destruídos e construídos com os novos valores
  • #30 rabbit é usado para fazer o “push” das novas configurações
  • #31 @RefreshScope indica ao Spring que esse bean pode ser “atualizado” por alguma trigger
  • #32 exemplo de configurações que conectam no Eureka
  • #35 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
  • #36 clientes
  • #38 @EnableEurekaServer indica que este microservice é uma instância do Eureka load balance é para end-user (web traffic) , enquanto eureka fica átras do Load Balance
  • #42 @SpringCloudApplication anotação “mágica”
  • #46 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
  • #47 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
  • #48 Fechamento automático baseado nas configurações Fallbacks quando há falhas try catch sofisticado
  • #55 Falar do “lookup”
  • #56 Falar do “lookup”
  • #57 Falar do “lookup”
  • #58 Falar do “lookup”
  • #59 Falar do “lookup”
  • #60 Falar do “lookup”
  • #61 Falar do “lookup”