Introdução
O gerenciamento de configurações em um aplicativo em vários ambientes é uma das preocupação dos desenvolvedores quando estão desenvolvendo e implantando aplicativos Spring Boot.
Quando desenvolvemos um aplicativo Spring Boot, geralmente mantermos vários ambientes para o mesmo projeto. Isso ocorre porque usamos infraestruturas diferentes para diferentes etapas do projeto, como acontece nos ambientes de local, desenvolvimento(dev), teste(testing), teste de aceitação do usuário(UAT), preparação(stating, homologação, pré-prod ou demo) e produção(prod). Cada ambiente tem seu conjunto de configurações, como por exemplo as definições de banco de dados, níveis de log ou outras propriedades personalizadas para o ambiente.
Nesse artigo vamos apresentar o que é e como usar os perfis do Spring Boot.
O que é perfil Spring Boot?
Os perfis do Spring Boot são um conjunto de propriedades de configuração e que podem ser ativados com base em diferentes ambientes ou condições. Essas propriedades de configuração pertencem a um ambiente específico. Se todas as propriedades de configuração pertencerem ao ambiente de desenvolvimento, podemos, por exemplo chamá-lo de um perfil de desenvolvimento.
Os perfis permitem separar e ajustar as configurações, garantindo que seu aplicativo se comporte de forma ideal em vários cenários sem exigir alterações de código.
Ao ativar diferentes perfis, você pode controlar como seu aplicativo Spring Boot se comporta, tornando-o versátil e adaptável a diferentes ambientes de implantação.
Quais são os usos de perfis no aplicativo Spring Boot?
- Personalize propriedades de configuração para cada ambiente, como endereços de banco de dados e níveis de registros(logs).
- Configure pontos de extremidades, clientes, regiões, localizações, credenciais ou tempos limite de API para diferentes serviços usados em vários ambientes.
- Ajuste tamanhos de “pool de threads”, estratégias de cache ou configurações de “pool de conexões" para diferentes ambientes.
- Configure balanceadores de carga, limites de tempos ou dimensionamentos em vários cenários de implantação.
- Personalize as configurações para microsserviços, implantações em contêineres ou configurações específicas da nuvem.
dentre outras.
O que é um perfil padrão?
O Spring Boot vem com um arquivo de propriedades, chamado “application.properties” por padrão. Um perfil padrão é um arquivo de propriedade com extensão “.properties” ou uma variante YAML, por exemplo o arquivo “application.properties / application.yml”.
Se uma propriedade for definida no perfil padrão, mas não no perfil de produção (prod), o valor da propriedade será preenchido a partir do perfil padrão. Isso é muito útil para definir valores padrões que são válidos em todos os perfis. Portanto, devemos manter todas as propriedades no perfil padrão que são comuns em todos os perfis.
Qual a ordem de precedência dos arquivos de propriedades de configuração?
Os arquivos de propriedades de configuração são considerados na seguinte ordem:
- propriedades do aplicativo empacotadas dentro do seu jar. Ex.: application.properties.
- propriedades do aplicativo específicas do perfil empacotadas dentro de seu jar. Ex.: application-{perfil}.properties, onde {perfil} é o nome do ambiente.
- propriedades do aplicativo fora do jar empacotado. Ex.: application.properties.
- propriedades de aplicativo específicas do perfil fora do jar empacotado Ex.: application-{perfil}.properties, onde {perfil} é o nome do ambiente.
O Spring Boot encontrará e carregará automaticamente os arquivos application.properties/application.yml(ou variante YAML) dos seguintes locais quando seu aplicativo for iniciado:
- No endereço de classe(classpath):
- Na raiz do endereço de classe.
- No pacote endereço de classe/config.
- No diretório atual:
- No diretório atual.
- No subdiretório config/ no diretório atual.
- Nos diretórios imediatos do subdiretório config/
Como criar um perfil Spring?
Para usar propriedades definidas em application.properties ou variante YAML, precisamos criar esses arquivos. O local mais comum é src/main/resources.
Criando arquivos de propriedade separados para cada perfil
Crie arquivos de propriedade nomeados separados para cada perfil que você deseja definir.
Em vez de alterar o perfil padrão a cada vez, criaremos um arquivo dedicado separado para cada ambiente. Além disso, podemos ativar o perfil necessário alterando apenas uma única entrada no perfil padrão. Exemplos:
- application.properties ou application-default.properties: para propriedades de configurações comuns a todos os perfis.
- application-local.properties: para propriedades de configurações em desenvolvimento na sua máquina.
- application-dev.properties: para propriedades de configurações em desenvolvimento no ambiente remoto para testes unitários e de integração de novas funcionalidades.
- application-test.properties: para propriedades de configurações em testes no ambiente remoto para equipes de qualidade de aplicações(QA).
- application-uat.properties: para propriedades de configurações em testes no ambiente remoto para aceitação pelo usuário.
- application-stage.properties: para propriedades de configurações no ambiente remoto para preparar para implantação em produção. Teste por usuário externo podem ser realizados, demonstrações, ou pré produção. Testar os scripts e desempenho e carga podem ser realizados.
- application-prod.properties: para propriedades de configurações no ambiente de produção.
Se não implementarmos perfis separados, teremos que acomodar todas as entradas acima em um único arquivo application.properties. Além disso, se quisermos mudar para um perfil diferente, teremos que fazer muitas mudanças todas as vezes. Assim, manter um perfil separado para cada ambiente economiza muito esforço.
Outros ambientes podem ser provisionados seguindo as necessidades do seu projeto.
Definindo configurações
Use o arquivo principal application.properties ou variante YAML para especificar as configurações comuns a todos os perfis.
Em cada arquivo de propriedades do perfil, especifique as configurações relevantes para esse ambiente. Por exemplo, você pode definir diferentes endereços de banco de dados, níveis de log ou outras propriedades específicas do ambiente.
Neste ponto, você pode estar se perguntando, o que acontece quando a mesma propriedade é especificada na configuração específica do perfil application-prod.properties e na configuração comum application.properties.
Nesse caso, a configuração mais específica sempre vencerá, portanto, em nosso exemplo, o valor de application-prod.properties.
Agora, vamos inserir algumas propriedades de configuração nesses arquivos. Por exemplo, vamos inserir configurações de banco de dados que são diferentes em cada arquivo. Suponha que h2 DB em desenvolvimento, MySQL em teste e Oracle DB em produção. Vamos atualizar as entradas como mostrado abaixo:
Em application-dev.properties:
app.info= As propriedades de configuração do ambiente de desenvolvimento.
spring.h2.console.enabled=true
spring.h2.console.path=/h2
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:mem:db
spring.datasource.userName=sa
spring.datasource.password=sa
Em application-test.properties
app.info= As propriedades de configuração do ambiente de teste.
spring.datasource.url=jdbc:mysql://localhost:3306/db
spring.datasource.username=root
spring.datasource.password=root123
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
Em application-prod.properties
app.info= As propriedades de configuração do ambiente de produção.
spring.datasource.url=jdbc:oracle:thin:@localhost:1521:xe
spring.datasource.username=username
spring.datasource.password=password
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.datasource.driver-class-name=oracle.jdbc.OracleDriver
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
Como ativar determinado perfil?
Embora, temos várias maneiras de tornar um determinado perfil ativo. Vamos discutir alguns deles um por um.
Definindo spring.profile.active em application.properties
O arquivo application.properties serão principal entre todos os arquivos de propriedades. Aqui vamos especificar qual perfil está ativo, definindo o valor da propriedade spring.profiles.active. Por exemplo, abaixo o arquivo application.properties nos diz que atualmente o perfil desenvolvimento(dev) está ativo.
Em application.properties
spring.application.name = Demo Perfis do Spring
spring.profiles.active = dev
app.info= As propriedades de configuração padrão
No código anterior, o valor da propriedade spring.profiles.active informa ao Spring qual perfil usar. Aqui definimos o perfil do ambiente de desenvolvimento como ativo. Essa é a abordagem mais comumente usada para tornar um determinado perfil ativo.
Definindo no parâmetro do sistema JVM
Também podemos passar o nome do perfil em um parâmetro do Sistema JVM como abaixo. O perfil especificado será ativado durante a inicialização do aplicativo.
Dspring.profiles.active=dev
Definindo perfis ativos no pom.xml
Também podemos ativar o perfil de Spring através de perfis Maven especificando a propriedade “spring.profile.active”, conforme mostrado abaixo.
<profiles>
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<spring.profiles.active>dev</spring.profiles.active>
</properties>
</profile>
<profile>
<id>test</id>
<properties>
<spring.profiles.active>test</spring.profiles.active>
</properties>
</profile>
</profiles>