Spring Cloud

Basis Tecnologia da Informação S.A. - 2019

Agenda

  • 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

Apresentação de Spring Cloud

  • 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

Overview do Spring Cloud

  • 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

Gestão de Configuração

  • Possibilidades para Configuração:

    • Empacotadas com a aplicação

    • No sistema de arquivo

    • Solução específica de fornecedor de Cloud

Configuração

  • Configuração:

    • Localização dos recursos

    • Conexão com Banco de Dados

    • Conexão com Fila de Mensagens

Spring Cloud Config

  • Configuração Centralizada

  • Suporte Versionamento

  • Conexão com vários backends, ex: Repositório Git

  • Atualização Automática

Spring Cloud Config - Server Side

Anotação: @EnableConfigServer

Dependência:

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-config-server</artifactId>
</dependency>
spring cloud config server dep

Spring Cloud Config - Client Side

  • 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:8888

Spring Cloud Config - Client Side

Convenções para nomes de arquivo:

<nomeaplicacao>-<perfil>.yml

Onde:

nomeaplicacao ⇒ spring.application.name perfil ⇒ spring.profiles.active

Spring Cloud Config - Client Side

URL para recuperação de configuração do servidor:

Resolução de Configuração

spring.application.name=clientconfig
spring.profiles.active=prod
Nome ArquivoRetornadoObs./Pos.

clientconfig-default.yml

não

tem perfil prod especificado

clientconfig.yml

sim

posição 2

clientconfig-prod.yml

sim

posição 1

clientconfig-homolog.yml

não

tem perfil prod especificado

clientconfig.properties

sim

posição 4

catalogo-prod.yml

não

trata-se de outra aplicação

application.yml

Sim

posição 3

Spring Cloud Config - Client Side

Dependências:

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-config</artifactId>
</dependency>
spring cloud config client dep

Registro e Descoberta de Serviços

  • Spring Cloud Discovery - Netflix

    • Eureka Server

    • Alternativas: Consul, Etc

  • Descoberta passiva dos serviços

    • Serviços clientes:

    • Se registram sozinhos

    • Enviam HeartBeat

Spring Cloud Eureka Server

Anotação: @EnableEurekaServer

Dependência:

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
spring cloud eureka server dep

Spring Cloud Discovery Client

  • Configuração genérica, integrada com vários servidores

  • Bibliotecas para manipulação das instâncias de serviços

Spring Cloud Eureka Discovery Client

Anotação: @EnableDiscoveryClient

Dependência:

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
spring cloud eureka client dep

Load Balancer

  • Existem vários tipos de Load Balancer

    • Software: Apache, Nginx, HA Proxy

    • Hardware: BigIP, F5

São soluções Server-Side…​

Load Balancer: Ribbon

  • 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

Spring Cloud Ribbon

Injetar LoadBalancer:

@Autowired
LoadBalancerClient client

Dependência:

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>

Circuit Breaker - Hystrix

  • 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

Circuit Breaker - Hystrix

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!)

Circuit Breaker - Hystrix

Evitar a propagação de falhas

hystrix propagacao falhas

Spring Cloud Hystrix

Anotação: @EnableHystrix

Dependência:

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>

Hystrix - Exemplo

@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 declarativas - Feign

  • 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

Feign

  • Interface marcada com anotações, seleciona o serviço

  • Anotações Spring MVC para especificar os endpoints

  • Habilita: Hystrix, Ribbon e Eureka Client

Spring Cloud Feign Client

Anotação: @EnableFeignClients

Dependência:

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
spring cloud feign dep

Spring Cloud Feign - Exemplos

@FeignClient("catalogo")
public interface CatalogoClient {
   @RequestMapping(
       method = RequestMethod.GET,
       value = "/api/item/{id}")
   Item getItem(@PathVariable("id")Long id);
}

API Gateway

  • Chamar muitos serviços, requer:

    • Configuração de CORS

    • Conhecimento de muitos detalhes, endereços

    • Gestão de segurança “espalhada”

API Gateway

  • Simplifica acesso aos serviços:

    • Ponto de contato único

    • Gestão centralizada da autenticação

    • Não precisa de CORS

  • Utiliza Netflix Zuul

api gateway

Spring Cloud Zuul

Anotação: @EnableZuulProxy

Dependência:

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>

Spring Cloud Zuul

Exemplo de configuração:

zuul:
  routes:
    first:
      path: /first/**
      url: https://first.example.com/api/
    legacy:
      path: /**
      url: https://legacy.example.com/

JHipster

  • Projeto iniciado em 10/2013

  • Atualmente na versão 6.2.0

  • Gerador de Projetos Spring Boot/Spring Cloud

  • Extensível com módulos

  • Ferramentas em cima do Spring Cloud

jhipster1

JHipster

Gerador baseado no yeoman

Instalação:

npm install -g yo
npm install -g generator-jhipster

Arquivos jdl

Permitem:

  • Definir as entidades que devem ser geradas

  • Descrever os microsserviços que compõem uma aplicação

Exemplo de jdl

application {
  config {
    baseName vcitatualizacao
    packageName br.com.sistema.servico
    applicationType microservice
    devDatabaseType h2Memory
    prodDatabaseType mssql
    serviceDiscoveryType eureka
    blueprint nuvem-java
  }
}