Gerencie facilmente configurações de microsserviços com o microconfig.io

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:

imagem

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 .

Source: https://habr.com/ru/post/pt473078/


All Articles