OBS: Para ver o slide em qualidade melhor, fazer o download
Apresentação: Falando de Micro Serviços - Configurações
Código fonte de exemplo: https://github.com/justiandre/exemplo.springcloudconfig
Contatos:
- Linkedin: https://www.linkedin.com/in/andrejusti/
- Github: https://github.com/justiandre
- E-mail: andre.justi@gmail.com
3. Problema
Com adoção em grande escala de micro serviços nas empresas, fica cada
vez mais difícil garantir e gerenciar as configurações das aplicações, com
essa adoção vem a facilidade de se utilizar inúmeras tecnologías (Go, Java,
Groovy, JS, Python, Kotlin etc), tendo em vista também que cada tecnologia
tem sua forma de configuração, isso torna a gestão de configuração ainda
mais problemática
Exemplo:
service 04
JS
+ Node
service 01
JS
+ Node
service 05
Java
+ Spring
service 03
Python
+ Django
service 06
Python
+ Django
settings.py
service 02
Java
+ Spring
application.yml
node.env
node.env
application.yml
settings.py
Serviços com tecnologias
e características de
configurações diferentes
4. Problema
Outros problemas comuns:
● Dificuldade de gerenciar as configurações de cada tipo de ambiente,
como, desenvolvimento, homologação, produção etc
● Dificuldade de saber quais configurações necessárias para executar
cada sistema/serviço
● Dificuldade de atualizar as configurações do sistema, sem necessidade
de gerar uma nova versão do sistema, ou atualizá lo
● Dificuldade de centralizar as configurações em um local único e seguro
5. Padrões
O que diz o The Twelve-Factor App sobre isso:
A configuração de uma aplicação é tudo que varia entre deploys
(homologação, produção, ambientes de desenvolvimento, etc). Isto inclui:
● Recursos para o DB, Memcached, e outros serviços de apoio
● Credenciais para serviços externos como Amazon S3 ou Twitter
● Valores por deploy como o nome canônico do host
6. Padrões
Aplicações às vezes armazenam as configurações no código como
constantes. Isto é uma violação dos 12 fatores, a qual exige uma estrita
separação entre configuração e código. Configuração varia
substancialmente entre deploys, código não.
A prova de fogo para saber se uma aplicação tem todas as configurações
corretamente consignadas fora do código, é saber se a base de código
poderia ter seu código aberto ao público a qualquer momento, sem
comprometer as credenciais ou endereçamentos.
7. Padrões
O que diz o Chris Richardson do microservices.io sobre isso:
Contexto
Um aplicativo geralmente usa uma ou mais infraestruturas e serviços de
terceiros.
● Exemplos de serviços de infraestrutura incluem: um registro de serviço
um intermediário de mensagem e um servidor de banco de dados.
● Exemplos de serviços de terceiros incluem: processamento de
pagamentos, email e mensagens, urls, etc.
8. Padrões
Problema
Como habilitar um serviço para ser executado em vários ambientes sem
modificar seu código?
Solução
Externalize toda a configuração do aplicativo, incluindo as credenciais do
banco de dados e a localização da rede. Na inicialização, um serviço irá ler
a configuração de uma fonte externa, como por exemplo, as variáveis de
ambiente do sistema operacional ou um config server.
Assim não será necessário nenhuma alteração no código fonte de
ambiente para ambiente.
9. Padrões
Atualmente é considerado um Anti Pattern de Microservice a configuração
dentro de cada aplicação.
MicroServices Anti-Pattern
service 04
JS
+ Node
service 01
JS
+ Node
service 05
Java
+ Spring
service 03
Python
+ Django
service 06
Python
+ Django
settings.py
service 02
Java
+ Spring
application.yml
node.env
node.env
application.yml
settings.py
Exemplo de vários
serviços, cada um com
suas configurações
Ecossistema de uma aplicação com microservices
10. Padrões
MicroServices Pattern
Externalized configuration
Exemplo de vários serviços,
com todas as configurações
centralizadas
Ecossistema de uma aplicação com microservices
service 01
JS
+ Node
service 05
Java
+ Spring
service 06
Python
+ Django
service 04
JS
+ Node
service 03
Python
+ Django
Config
Server
service 02
Java
+ Spring
get configurations
11. Ferramentas
Existem muitas ferramentas para resolver a gestão de configuração em
sistemas.
Algumas resolvem o problema a nível de infraestrutura, como Kubernetes
ConfigMap & Secrets e outras a nível de código, como, Spring Cloud Config
que será detalhada em seguida.
12. Ferramentas
Spring Cloud Config
Spring Cloud Config é uma aplicação feita sobre Spring Boot que provê
uma solução centralizada para gerenciamento de configuração. Entre suas
vantagens estão:
Atualização das configurações em tempo real
É possível atualizar as configurações das aplicações sem a necessidade de
criação de uma nova versão da mesma ou de se realizar um restart. Dessa
forma, uma única ação é realizada e está atualizará as configurações de
uma aplicação em todos os seus nodos.
+ +
13. Ferramentas
Consumo via API REST
Como a solução é baseada em REST, é simples para qualquer aplicação, de
qualquer linguagem ou natureza, consumir os dados do Spring Cloud
Config. Existe uma facilidade para aplicações JVM com Spring Boot porque
já possui um cliente que facilita a recuperação das configurações.
Versionamento das configurações
Como as configurações normalmente ficam armazenadas no GIT, é simples
saber quais foram as alterações realizadas, quem fez, quando e porque
aconteceram.
14. Ferramentas
Configurações baseadas em perfis
As configurações no Spring Cloud Config são armazenadas baseadas em
perfis. Dessa forma também conseguimos definir um perfil default com as
configurações padrão e um perfil específico, alterando só o conteúdo de
algumas configurações.
Arquitetura stateless
Como a base arquitetural do Spring Cloud Config é totalmente stateless é
muito simples escalar a solução.
15. Ferramentas
Arquitetura Spring Cloud Config
Ecossistema de uma aplicação com microservices
service
01
service
02
service
03
get configurations
Repo
Configs
Config
Server
Atualizador
Por padrão o repositório de
configurações é o GIT, mas
pode ser usado SVN, Banco
de dados etc
Por padrão o atualizar é o
RabbitMQ, mas pode ser usado
Kafka ou Redis, o atualizador
também é de uso opcional.
16. Ferramentas
Estrutura do repositório GIT e arquivos:
● application.yml: Arquivo com configurações carregadas por todas
aplicações, independente do perfil, utilizado para configurações
gerais.
● application-{profile}.yml: Arquivo com configurações carregadas
por todas aplicações, mas para um perfil específico. Carrega e
sobrescrever as configurações do arquivo application.yml
17. Ferramentas
● {appName}.yml: Arquivo com configurações de uma aplicação
específica, independente do perfil, sobrescreve as configurações dos
arquivos application.yml e application-{profile}.yml
● {appName}-{profile}.yml: Arquivo com configurações de uma
aplicação específica e de um perfil específico, sobrescreve as
configurações dos arquivos application.yml, application-{profile}.yml e
{appName}-{profile}.yml
OBS: Os arquivos podem ser na extensão .properties e podem ser criadas
pastas para dividir a configuração de cada aplicativo.
18. Ferramentas
Acessando as configurações
O Config Server disponibiliza APIs baseadas nos arquivos de configurações.
Com isso, as configurações podem ser requisitadas das seguintes formas:
● GET /{appName}/{profile}/{key}: Recupera uma propriedade de uma
aplicação de um perfil específico.
● GET /{appName}-{profile}.yml: Recupera todas as propriedades de
uma aplicação de um perfil específico.
● GET /{appName}-default.yml: Recupera todas as propriedades sem
perfil de uma aplicação.
OBS: As propriedades podem ser recuperadas tanto no formato .json quanto
no .properties. Para isso, basta alterar o sufixo da URL.
19. Ferramentas
Processo de carregamento das configurações com atualização em
tempo real
Config
Server
Atualizador
Repo
Configs service
app
client
Alteração na
configuração
5
6
8
1 3 , 9
4
2
7
Lê todas as configurações
Se inscreve na fila para notificar as atualizações
Carrega as configurações da aplicação
Se inscreve na fila para receber as atualizações
Faz alteração de uma configuração
Dispara WebHook para Config Server informando a atualização
ConfigServer envia uma notificação de atualização
App Cliente recebe a notificação de atualização
Recarrega as configurações
1
2
3
4
5
6
7
8
9
Passos: