Esse playground é para aprender Spring Cloud e Kotlin através de exemplos.
Leia em outros idiomas:
- На русском - Russo
- Bahasa Indonesia - Indonésio
- In het Nederlands - Holândes
- In English - Inglês
💚 Comece aqui.
Cloud-native é uma abordagem para construir e executar aplicativos que exploram as vantagens do modelo de computação em nuvem.
Microservices é uma abordagem de arquitetura para desenvolver um aplicativo como uma coleção de pequenos serviços; cada serviço implementa recursos de negócios, é executado em seu próprio processo e se comunica por meio de uma API HTTP. Cada microsserviço pode ser implantado, atualizado, dimensionado e reiniciado independentemente de outros serviços no aplicativo, geralmente como parte de um sistema automatizado.
Estamos dividindo grandes aplicações em partes menores chamadas "serviços". E cada um desses serviços pode ser implantado e dimensionado por conta própria. Como um serviço localiza outro?
Módulo | URL |
---|---|
discovery-server | http://host:8761/eureka |
Existem diversas maneiras que você pode descobrir serviços no Spring Cloud:
Este projeto se concentra especificamente no último, o projeto Spring Cloud Netflix. A gigante norte-americana de serviços de streaming de mídia baseados em nuvem, a Netflix, abriu sua estrutura de ferramentas de microsserviço.
Por uma questão de simplicidade, temos aqui uma única instância do servidor Eureka. Portanto, o servidor Eureka está configurado para não tentar se registrar com seus pares. Você pode querer ter vários servidores de descoberta para alta disponibilidade em produção. Para isso, altere as seguintes propriedades:
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true
A Eureka está constantemente garantindo que os serviços sejam saudáveis e estejam disponíveis. E também garante que, caso o Discovery Server fique inativo, todos os clientes continuem operando.
Eureka foi construído com o objetivo de entregar alta disponibilidade
- O registro é distribuído (armazenado em cache localmente em cada cliente).
- Cliente podem operar sem o Discovery Server (se o servidor estiver indisponível).
- O Cliente busca os deltas para atualizar o registro.
O Eureka possui um painel de controle web habilitado por padrão. Ele exibe informação úteis a respeito do servidor.
Em ambiente local, o painel de controle está disponível no caminho http://localhost:8761
Módulo | URL |
---|---|
weather-service | http://host:port/weather |
A anotação @EnableDiscoveryClient
é usada para transformar o WeatherServiceApplication
num cliente do Discovery Server e faz com que ele se registre no Discovery Server em sua inicialização.
Módulo | URL |
---|---|
weather-app | http://host:port/current/weather |
Módulo | URL |
---|---|
datetime-service | http://host:port/datetime |
A anotação @EnableDiscoveryClient
é usada para transformar o DatetimeServiceApplication
num cliente do Discovery Server e faz com que ele se registre no Discovery Server em sua inicialização.
Módulo | URL |
---|---|
datetime-app | http://host:port/current/datetime |
Módulo | URL |
---|---|
client | http://host:port |
A anotação @EnableDiscoveryClient
é usada para transformar o ClientApplication
num cliente do Discovery Server.
O Cliente não precisa se registrar com Eureka porque ele não quer que ninguém o descubra. Portanto a segiunte propriedade é configurada como false
eureka.client.register-with-eureka=false
Em Sistemas Distribuídos existe apenas uma certeza... FALHAS SÃO INEVITÁVEIS.
Um efeito particularmente ruim em falhas de sistemas distribuídos é a falha em cascata. Traduzido da Wikipedia:
É um processo em um sistema de partes interconectadas em que a falha de uma ou poucas partes pode desencadear a falha de outras partes e assim por diante.
Como aceitar falhas?
- Tolerância ao erro
- Degradação elegante (
Graceful degradation
) - Restringir recursos
Padrão de Projeto Circuit Breaker é um padrão de design usado no desenvolvimento de software moderno. É usado para detectar falhas e encapsula a lógica de evitar que uma falha se repita constantemente.
(From Wikipedia)
Netflix Hystrix é uma biblioteca de latência e tolerância a falhas projetada para isolar pontos de acesso a sistemas remotos, serviços e bibliotecas de terceiros, interromper a falha em cascata e permitir a resiliência em sistemas distribuídos complexos onde a falha é inevitável.
See How it works.
Module | URL |
---|---|
hystrix-dashboard | http://host:port/hystrix |
Documentation: Circuit Breaker: Hystrix Dashboard
Module | URL |
---|---|
turbine | http://host:3000/turbine.stream |
O painel Hystrix só pode monitorar um microsserviço de cada vez. Se houver muitos microservices, o painel do Hystrix que aponta para o serviço deve ser alterado toda vez que o micro-serviço for alternado para o monitor. Isso é tedioso.
Turbine (fornecido pelo projeto Spring Cloud Netflix), agrega várias instâncias de streams de métricas do Hystrix, para que o painel possa exibir uma visualização agregada.
Exemplo de configuração:
turbine.app-config=weather-app,datetime-app
turbine.cluster-name-expression='default'
Antes do primeiro build será necessário executar os seguintes passos adicionais:
- Clonar o repositório
- Definir variáveis de ambiente
- 📗 TODO
Você tem liberdade para escolher sua ferramenta de build: Gradle ou sua IDE favorita. IntelliJ IDEA, STS / Eclipse, ou NetBeans devem lidar com essa tarefa sem problemas.
./gradlew :discovery-server:bootRun
./gradlew :weather-service:bootRun
./gradlew :weather-app:bootRun
./gradlew :client:bootRun
./gradlew :datetime-service:bootRun
./gradlew :datetime-app:bootRun
./gradlew :turbine:bootRun
./gradlew :hystrix-dashboard:bootRun
- Importe o projeto raiz para o IntelliJ IDEA
- Sincronize o projeto com o Gradle (a sincronização inicial pode ocorrer automaticamente)
- Agora você deve ter diversas configurações de execução para cada módulo. Execute-os um por um:
- DiscoveryServerApplication
- WeatherServiceApplication
- WeatherAppApplication
- ClientApplication
- DatetimeServiceApplication
- DatetimeAppApplication
- TurbineApplication
- HystrixDashboardApplication
Dica: Certifique-se de executá-los em portas diferentes e que essas portas estejam livres, caso contrário você receberá um erro.
📗 TODO
Travis CI |
---|
Este projeto é licenciado sob os termos da licença GNU GPL v3.