Basis Tecnologia da Informação S.A. - 2019
Apresentação de Spring Cloud
Configuração Centralizada
Registro e Descoberta de Serviços
Load Balancing
Circuit Breaker
Chamada Declarativa de Serviços
API Gateway
JHipster
Guarda-Chuva de Projetos (em baixo do Guarda-Chuva Spring)
Facilitar desenvolvimento de Aplicações distribuídas
Integração de componentes testados no campo de batalha
Todos os Projetos Spring Cloud são baseados no Spring Boot
Gestão de dependências no estilo Spring Boot
Inicialização do ApplicationContext modificada
| O conceito de Cliente/Servidor é relativo |
Possibilidades para Configuração:
Empacotadas com a aplicação
No sistema de arquivo
Solução específica de fornecedor de Cloud
Configuração:
Localização dos recursos
Conexão com Banco de Dados
Conexão com Fila de Mensagens
Configuração Centralizada
Suporte Versionamento
Conexão com vários backends, ex: Repositório Git
Atualização Automática
Anotação: @EnableConfigServer
Dependência:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>

Usa o Environment do Spring, com um novo tipo de PropertySource
Mudança na inicialização do contexto de aplicação
Bootstrap, examinado mais cedo
Arquivo bootstrap.properties com:
spring.application.name=configclient
spring.cloud.config.uri=http://localhost:8888Convenções para nomes de arquivo:
<nomeaplicacao>-<perfil>.yml
Onde:
nomeaplicacao ⇒ spring.application.name
perfil ⇒ spring.profiles.active
URL para recuperação de configuração do servidor:
spring.application.name=clientconfig
spring.profiles.active=prod
| Nome Arquivo | Retornado | Obs./Pos. |
|---|---|---|
| não | tem perfil prod especificado |
| sim | posição 2 |
| sim | posição 1 |
| não | tem perfil prod especificado |
| sim | posição 4 |
| não | trata-se de outra aplicação |
| Sim | posição 3 |
Dependências:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>

Spring Cloud Discovery - Netflix
Eureka Server
Alternativas: Consul, Etc
Descoberta passiva dos serviços
Serviços clientes:
Se registram sozinhos
Enviam HeartBeat
Anotação: @EnableEurekaServer
Dependência:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>

Configuração genérica, integrada com vários servidores
Bibliotecas para manipulação das instâncias de serviços
Anotação: @EnableDiscoveryClient
Dependência:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>

Existem vários tipos de Load Balancer
Software: Apache, Nginx, HA Proxy
Hardware: BigIP, F5
São soluções Server-Side…
Balanceamento do lado do cliente
Pode usar critérios como Round Robin ou Tempo de Resposta
Integrado com Eureka, utilizado para saber as instâncias UP ou DOWN
Injetar LoadBalancer:
@Autowired
LoadBalancerClient client
Dependência:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>Proteção com as falhas em cascata
Abre o circuito em caso de falha = tira componente com defeito
Padrão: 20 falhas em 5 segundos
Fecha o circuito de volta depois de um intervalo
Padrão: depois de 5 segundos
Uso de Fallbacks em caso de falha
Com um uptime de 99,95%:
Único serviço: 22 min. de downtime/mês
30 serviços: 11 horas de downtime/mês
100 serviços: 36 horas de downtime/mês (ouch!)
Evitar a propagação de falhas

Anotação: @EnableHystrix
Dependência:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>@Service
public class PessoaService {
private PessoaRepository repository;
@HystrixCommand(fallbackMethod = "getPessoaFromCache")
public Pessoa getPessoa(String nome) {
return repository.findByNome(nome);
}
public Pessoa getPessoaFromCache(String nome) {
return new Pessoa();
}
}Chamadas REST facilitadas
Utiliza o estilo declarativo (o quê)
Não precisa de implementação (o como)
| O código é implementado pelo Spring Cloud em tempo de execução |
Interface marcada com anotações, seleciona o serviço
Anotações Spring MVC para especificar os endpoints
Habilita: Hystrix, Ribbon e Eureka Client
Anotação: @EnableFeignClients
Dependência:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>

@FeignClient("catalogo")
public interface CatalogoClient {
@RequestMapping(
method = RequestMethod.GET,
value = "/api/item/{id}")
Item getItem(@PathVariable("id")Long id);
}Chamar muitos serviços, requer:
Configuração de CORS
Conhecimento de muitos detalhes, endereços
Gestão de segurança “espalhada”
Simplifica acesso aos serviços:
Ponto de contato único
Gestão centralizada da autenticação
Não precisa de CORS
Utiliza Netflix Zuul

Anotação: @EnableZuulProxy
Dependência:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>Exemplo de configuração:
zuul:
routes:
first:
path: /first/**
url: https://first.example.com/api/
legacy:
path: /**
url: https://legacy.example.com/
| ![]() |
Gerador baseado no yeoman
Instalação:
npm install -g yo
npm install -g generator-jhipsterPermitem:
Definir as entidades que devem ser geradas
Descrever os microsserviços que compõem uma aplicação
application {
config {
baseName vcitatualizacao
packageName br.com.sistema.servico
applicationType microservice
devDatabaseType h2Memory
prodDatabaseType mssql
serviceDiscoveryType eureka
blueprint nuvem-java
}
}