Um dos principais problemas no desenvolvimento e operação subseqüente de microsserviços é a configuração competente e precisa de suas instâncias. Na minha opinião, a nova estrutura
microconfig.io pode ajudar. Ele permite resolver de maneira bastante elegante algumas das tarefas rotineiras de configuração de aplicativos.
Se você possui muitos microsserviços e cada um deles possui seus próprios arquivos / configurações, é provável que cometa um erro em um deles, o que sem destreza adequada e sistema de registro pode ser muito difícil de detectar. A principal tarefa que a estrutura define por si mesma é minimizar configurações de instância duplicadas, reduzindo assim a probabilidade de adicionar um erro.
Vejamos um exemplo. Suponha que exista um aplicativo simples com um
arquivo de configuração
yaml . Pode ser qualquer microsserviço em qualquer idioma. Vamos ver como a estrutura pode ser aplicada a este serviço.
Mas primeiro, para maior comodidade, criaremos um projeto vazio no Idea IDE instalando primeiro o plug-in microconfig.io:

Nós configuramos a configuração de inicialização do plug-in, você pode usar a configuração padrão, como na captura de tela acima.
Nosso serviço é chamado de pedido; em um novo projeto, criaremos uma estrutura semelhante:

Na pasta com o nome do serviço, colocamos o arquivo de configuração -
application.yaml . Todos os microsserviços são lançados em algum tipo de ambiente; portanto, além de criar a configuração do próprio serviço, é necessário descrever o próprio ambiente: para isso, crie a pasta
envs e adicione um arquivo com o nome do nosso ambiente de trabalho. Assim, a estrutura criará arquivos de configuração para serviços no ambiente de desenvolvimento, pois esse parâmetro é definido nas configurações do plug-in.
A estrutura do arquivo
dev.yaml será bastante simples:
mainorder: components: - order
A estrutura trabalha com configurações agrupadas. Para o nosso serviço, selecione um nome para o grupo de
pedidos principais . A estrutura localiza cada grupo de aplicativos no arquivo de ambiente e cria configurações para todos eles nas pastas correspondentes.
No próprio arquivo de configurações do serviço de
pedidos , indicaremos até agora apenas um parâmetro:
spring.application.name: order
Agora execute o plugin e ele irá gerar a configuração desejada do nosso serviço para nós, de acordo com o caminho especificado nas propriedades:

Você pode
fazer sem instalar o plug-in simplesmente baixando o kit de distribuição da estrutura e executando-o na linha de comando.
Esta solução é adequada para uso no servidor de construção.
Vale ressaltar que a estrutura entende perfeitamente a sintaxe da
propriedade , ou seja, os arquivos de propriedades comuns que podem ser usados juntos nas configurações do
yaml .
Adicione mais um serviço de
pagamento e complique o existente ao mesmo tempo.
Em
ordem :
eureka: instance.preferIpAddress: true client: serviceUrl: defaultZone: http://192.89.89.111:6782/eureka/ server.port: 9999 spring.application.name: order db.url: 192.168.0.100
Em
pagamento :
eureka: instance.preferIpAddress: true client: serviceUrl: defaultZone: http://192.89.89.111:6782/eureka/ server.port: 9998 spring.application.name: payments db.url: 192.168.0.100
O principal problema com essas configurações é a presença de uma grande quantidade de pasta de cópia nas configurações de serviço. Vamos ver como a estrutura ajuda a se livrar dela. Vamos começar com o mais óbvio - a presença da configuração
eureka na descrição de cada microsserviço. Crie um novo diretório com o arquivo de configurações e adicione uma nova configuração a ele:

E em cada um de nossos projetos, adicionaremos a linha
#include eureka .
A estrutura encontrará automaticamente a configuração do eureka e a copiará para os arquivos de configuração de serviço, enquanto uma configuração separada do eureka não será criada, pois não a especificaremos no
arquivo de ambiente
dev.yaml .
Ordem de serviço:
#include eureka server.port: 9999 spring.application.name: order db.url: 192.168.0.100
Também podemos fazer as configurações do banco de dados em uma configuração separada, alterando a linha de importação para
#include eureka, oracle .
É importante notar que cada alteração durante a regeneração dos arquivos de configuração que a estrutura monitora e coloca em um arquivo especial ao lado do arquivo de configuração principal. A entrada em seu log é assim: “A propriedade armazenada 1 muda para
order / diff-application.yaml ”. Isso permite detectar rapidamente alterações em grandes arquivos de configuração.
A remoção das partes comuns da configuração permite que você se livre de muitas cópias e colagens desnecessárias, mas não permite que você crie uma configuração flexível para vários ambientes - os pontos de extremidade de nossos serviços são únicos e codificados permanentemente, isso é ruim. Vamos tentar removê-lo.
Uma boa solução seria manter todos os pontos de extremidade em uma configuração que outros pudessem referenciar. Para fazer isso, o suporte para espaços reservados foi introduzido na estrutura. Veja como o arquivo de configuração
eureka muda:
client: serviceUrl: defaultZone: http://${endpoints@eurekaip}:6782/eureka/
Agora vamos ver como esse espaço reservado funciona. O sistema localiza um componente chamado
endpoints e procura por
eurekaip nele e o substitui em nossa configuração. Mas e os diferentes ambientes? Para fazer isso, crie o arquivo de configurações nos
pontos de extremidade do seguinte tipo
application.dev.yaml . A estrutura independentemente, por extensão de arquivo, decide em qual ambiente essa configuração pertence e a carrega:

O conteúdo do arquivo dev:
eurekaip: 192.89.89.111 dbip: 192.168.0.100
Podemos criar a mesma configuração para as portas de nossos serviços:
server.port: ${ports@order}.
Todas as configurações importantes estão em um único local, reduzindo assim a probabilidade de um erro devido aos parâmetros dispersos nos arquivos de configuração.
A estrutura fornece muitos espaços reservados prontos, por exemplo, você pode obter o nome do diretório em que o arquivo de configuração está localizado e atribuí-lo:
#include eureka, oracle server.port: ${ports@order} spring.application.name: ${this@name}
Devido a isso, não há necessidade de especificar adicionalmente o nome do aplicativo na configuração e também pode ser movido para um módulo comum, por exemplo, para o mesmo eureka:
client: serviceUrl: defaultZone: http://${endpoints@eurekaip}:6782/eureka/ spring.application.name: ${this@name}
O arquivo de configuração do
pedido será reduzido para uma linha:
#include eureka, oracle server.port: ${ports@order}
Caso não precisemos de nenhuma configuração da configuração pai, podemos especificá-la em nossa configuração e ela será aplicada durante a geração. Ou seja, se por algum motivo precisarmos de um nome exclusivo para o serviço de pedidos, deixe o parâmetro
spring.application.name .
Digamos que você precise adicionar configurações de log personalizadas ao serviço, que são armazenadas em um arquivo separado, por exemplo,
logback.xml . Crie um grupo separado de configurações para ele:

Na configuração básica, indicaremos a estrutura onde colocar o arquivo de configurações de log necessário, usando o
espaço reservado @ConfigDir:
microconfig.template.logback.fromFile: ${logback@configDir}/logback.xml
No arquivo
logback.xml , configuramos
anexos padrão, que por sua vez também podem conter espaços reservados, que a estrutura mudará durante a geração de configurações, por exemplo:
<file>logs/${this@name}.log</file>
Adicionando a importação de
logback na configuração do serviço, obtemos automaticamente o log configurado para cada serviço:
#include eureka, oracle, logback server.port: ${ports@order}
É hora de se familiarizar com todos os espaços reservados da estrutura disponíveis em mais detalhes:
$ {this @ env} - retorna o nome do ambiente atual.
$ {... @ name} - retorna o nome do componente.
$ {... @ configDir} - retorna o caminho completo para o diretório de configuração do componente.
$ {... @ resultDir} - retorna o caminho completo para o diretório de destino do componente (os arquivos recebidos serão colocados nesse diretório).
$ {this @ configRoot} - retorna o caminho completo para o diretório raiz do armazenamento de configuração.
O sistema também permite obter variáveis de ambiente, por exemplo, o caminho para java:
$ {env @ JAVA_HOME}Ou, como a estrutura é escrita em
JAVA , podemos obter variáveis do sistema semelhantes à chamada
System :: getProperty usando uma construção como esta:
${system@os.name}Vale mencionar o suporte ao idioma de extensão
Spring EL . Na configuração, expressões semelhantes se aplicam:
connection.timeoutInMs: #{5 * 60 * 1000} datasource.maximum-pool-size: #{${this@datasource.minimum-pool-size} + 10}
e você pode usar variáveis locais em arquivos de configuração usando a expressão
#var :
#var feedRoot: ${system@user.home}/feed folder: root: ${this@feedRoot} success: ${this@feedRoot}/archive error: ${this@feedRoot}/error
Assim, a estrutura é uma ferramenta bastante poderosa para a configuração fina e flexível de microsserviços. A estrutura executa perfeitamente sua principal tarefa - eliminar copiar e colar nas configurações, consolidar as configurações e, como resultado, minimizar possíveis erros, além de facilitar a combinação de configurações e alterações para diferentes ambientes.
Se você estiver interessado nessa estrutura, recomendo que você visite sua página oficial e leia a
documentação completa ou procure a fonte
aqui .