tdc 2016 - arquitetura java - spring cloud
TRANSCRIPT
![Page 1: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/1.jpg)
Construindo Microservices com
Spring Cloud
Arquitetura Java
Claudio Eduardode Oliveira
![Page 2: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/2.jpg)
About meClaudio 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 / SpringContatos:
Email: [email protected]: https://br.linkedin.com/in/claudioedoliveiraTwitter: @claudioedBlog: www.claudioliveira.com
![Page 3: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/3.jpg)
![Page 4: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/4.jpg)
Eat your
own
Dog Food
![Page 5: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/5.jpg)
AgendaMotivação
Microservices
Spring Boot + Spring Cloud
Portifólio de projetos
Spring Cloud Config
Spring Cloud Eureka
Spring Cloud Bus
Spring Cloud Hystrix
Spring Cloud Zuul
![Page 6: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/6.jpg)
Motivação
http://www.infoworld.com/article/3075880/application-development/microservice-architecture-is-agile-software-architecture.html
motivacao
![Page 7: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/7.jpg)
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
![Page 8: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/8.jpg)
- Desacoplamento
- Agilidade na entrega de
Valor- Deploy independente
- Diversidade tecnológica
Vantagens
http://martinfowler.com/articles/microservice-trade-offs.html
microservices
![Page 9: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/9.jpg)
- Complexidade Operacional
- Comunicação
- Consistência Eventual
Desvantagens
http://martinfowler.com/articles/microservice-trade-offs.html
microservices
![Page 10: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/10.jpg)
microservices
- Configurações Centralizadas
- Service Registry / Service
Discovery
- Circuit Breaker
- API Proxy
![Page 11: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/11.jpg)
![Page 12: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/12.jpg)
Spring Cloud Netflix OSS
+
![Page 13: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/13.jpg)
Advice
![Page 14: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/14.jpg)
spring boot
![Page 15: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/15.jpg)
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 bootfeatures
![Page 16: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/16.jpg)
spring cloud
spring cloud
=
spring boot+
steroids
![Page 17: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/17.jpg)
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/
![Page 18: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/18.jpg)
spring cloud config
- Configurações Centralizadas- Service Registry / Service
Discovery
- Circuit Breaker
- API Proxy
![Page 19: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/19.jpg)
- HTTP resource based API
- encrypt / Decrypt
- integração Spring Boot
@EnableConfigServer
- suporte múltiplos ambiente
(dev, qa, prod)
- arquivos (github / filesystem)
spring cloud config
![Page 20: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/20.jpg)
- spring cloud server
- spring cloud client
spring cloud config
![Page 21: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/21.jpg)
spring cloud configConfig ServerDependência
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId></dependency>
![Page 22: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/22.jpg)
spring cloud configConfig ServerSetup/*** @author Claudio E. de Oliveira.*/@SpringCloudApplication@EnableConfigServerpublic class ConfigApplication {
public static void main(String[] args) { SpringApplication.run(ConfigApplication.class, args); } }
![Page 23: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/23.jpg)
spring cloud configConfig ServerSetup (bootstrap.yml)spring: application: name: configserver
![Page 24: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/24.jpg)
spring cloud config
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId></dependency>
Config ClientDependência
![Page 25: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/25.jpg)
spring cloud configConfig ClientSetup (bootstrap.yml)spring: profiles: default application: name: predictors cloud: config: uri: http://configserver:8001/
server: port: 7003
![Page 26: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/26.jpg)
Cloud Busspring cloud bus
![Page 27: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/27.jpg)
- Push de configurações
- RabbitMQ
spring cloud busConfig Client BusFuncionamento
![Page 28: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/28.jpg)
spring cloud busCloud BusDependência
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bus-amqp</artifactId></dependency>
![Page 29: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/29.jpg)
spring cloud busConfig Client BusSetupinfo: component: Predictor MicroService
spring: rabbitmq: host: localhost port: 5672 username: guest password: guest
![Page 30: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/30.jpg)
spring cloud busConfig Client BusExemplo
@Service@RefreshScopepublic class ParticipantService {
@Autowired private RestTemplate restTemplate;
@Value("${services.user.info}") private String url;
}
![Page 31: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/31.jpg)
spring cloud busConfig Client BusExemplo
services: user: info: http://USERS/ event: info: http://EVENTS/
![Page 32: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/32.jpg)
spring cloud eureka
- Configurações Centralizadas
- Service Registry / Service
Discovery- Circuit Breaker
- API Proxy
![Page 33: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/33.jpg)
spring cloud eurekaService DiscoveryConceito
● clientes se registram no servidor
● servidor lista os clientes● clientes conhecem são
reconhecidos por outros clientes
![Page 34: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/34.jpg)
spring cloud eurekaService DiscoveryDesafios
● # de chamadas a microservices● configuração manual
impraticável● # de instâncias de serviços● resolver dependências em
runtime
![Page 35: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/35.jpg)
- “lookup” de serviços
- clientes enviam heartbeats
- remoção de clientes não
funcionais
- testado em produção pelo
Netflix
spring cloud eureka
![Page 36: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/36.jpg)
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId></dependency>
spring cloud eurekaEureka ServerDependência
![Page 37: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/37.jpg)
spring cloud eurekaEureka ServerSetup@SpringBootApplication@EnableEurekaServer@EnableDiscoveryClientpublic class DiscoveryApplication{
public static void main(String[] args) { SpringApplication.run(DiscoveryApplication.class, args); } }
![Page 38: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/38.jpg)
spring cloud eurekaEureka ServerExemplo
![Page 39: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/39.jpg)
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId></dependency>
spring cloud eurekaEureka ClientDependência
![Page 40: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/40.jpg)
spring cloud eurekaEureka ClientSetup
info: component: Ranking MicroService
server: port: 7002
eureka: client: serviceUrl: defaultZone: http://discovery:8761/eureka/
![Page 41: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/41.jpg)
spring cloud eurekaEureka ClientSetup
@SpringCloudApplicationpublic class RankingApplication {
public static void main(String[] args) throws Exception { SpringApplication.run(RankingApplication.class, args); }
}
![Page 42: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/42.jpg)
spring cloud eurekaEureka ClientSetup@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@SpringBootApplication@EnableDiscoveryClient@EnableCircuitBreakerpublic @interface SpringCloudApplication {}
![Page 43: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/43.jpg)
spring cloud hystrix
- Configurações Centralizadas
- Service Registry / Service
Discovery
- Circuit Breaker- API Proxy
![Page 44: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/44.jpg)
Falácias da Computação Distribuída
spring cloud hystrix
1. A rede é confíavel2. A latência é zero3. A largura da banda é infinita4. A rede é segura5. A topologia não se altera6. Existe apenas um administrador7. Custo de transporte é zero8. A rede é homogênea
![Page 45: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/45.jpg)
spring cloud hystrixCascading FailuresProblema
● # número de dependências pode levar ao “cascading failures”
● sistemas distribuídos por padrão tem mais chances de falhar
![Page 46: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/46.jpg)
Circuit BreakerConceito
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
![Page 47: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/47.jpg)
Netflix Hystrixspring cloud hystrix
● provê mecanismo de “fallback”
● “fallbacks” podem ser encadeados (cuidado!!!)
● fácil integração com Spring (via annotations)
● fechamento automático do circuito
![Page 48: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/48.jpg)
spring cloud hystrix
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix</artifactId></dependency>
Cloud HystrixDependência
![Page 49: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/49.jpg)
spring cloud hystrixCloud HystrixSetup
@SpringCloudApplication@EnableHystrixpublic class PredictorApplication {
public static void main(String[] args) throws Exception { SpringApplication.run(PredictorApplication.class, args); }
}
![Page 50: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/50.jpg)
spring cloud hystrixCloud HystrixExemplo (command)
@Service@RefreshScopepublic 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; }
}
![Page 51: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/51.jpg)
spring cloud hystrixCloud HystrixExemplo (fallback)
@Service@RefreshScopepublic 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;}
}
![Page 52: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/52.jpg)
spring cloud hystrix
● microservices sem monitoramento torna-se
impraticável
● hystrix provê dashboards
● @EnableHystrixDashboard
Cloud HystrixMonitoramento
![Page 53: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/53.jpg)
spring cloud zuul
- Configurações Centralizadas
- Service Registry / Service
Discovery
- Circuit Breaker
- API Proxy
![Page 54: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/54.jpg)
spring cloud zuulAPI ProxyProblemas
● API internas “expostas”● segurança● CORS● Roteamento● Versionamento● Cache● # excessivo de chamadas remotas
![Page 55: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/55.jpg)
spring cloud zuulAPI ProxySpring Cloud Zuul
● filtros (pre/pos)● roteamento para serviços● versionamento de APIs● CORS● integração Eureka (service name)
![Page 56: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/56.jpg)
spring cloud zuul
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zuul</artifactId></dependency>
Cloud ZuulDependência
![Page 57: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/57.jpg)
spring cloud zuulCloud ZuulSetup
@SpringCloudApplication@Controller@EnableZuulProxypublic class GatewayApplication {
public static void main(String[] args) { SpringApplication.run(GatewayApplication.class, args); } }
![Page 58: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/58.jpg)
spring cloud zuulCloud ZuulSetup
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
![Page 59: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/59.jpg)
spring cloud zuulCloud ZuulExemplo (client)@SpringCloudApplication@EnableZuulProxypublic class EventApplication {
public static void main(String[] args) throws Exception { SpringApplication.run(EventApplication.class, args); }
}
![Page 60: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/60.jpg)
#tip
![Page 61: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/61.jpg)
![Page 62: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/62.jpg)
email: [email protected]
linkedin: https://br.linkedin.com/in/claudioedoliveira
twitter: @claudioed
blog: www.claudioliveira.com
github: https://github.com/claudioed
Claudio Eduardo de Oliveira
![Page 63: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/63.jpg)
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/
![Page 64: TDC 2016 - Arquitetura Java - Spring Cloud](https://reader035.vdocuments.mx/reader035/viewer/2022062310/5878238e1a28aba12d8b70d3/html5/thumbnails/64.jpg)