O Nacos transcende seu papel como mero centro de registro de serviços, servindo também como uma robusta plataforma para centralização de configurações. Este guia detalha como integrar o Nacos para gerenciar as configurações de aplicações Spring Cloud Alibaba.
Inclusão de Dependências no Projeto
Para habilitar a funcionalidade de configuração do Nacos em seu módulo consumidor (ou qualquer módulo Spring Boot que precise de configurações centralizadas), adicione as seguintes dependências ao arquivo pom.xml:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>3.1.1</version> <!-- Verifique a versão compatível com sua Spring Cloud -->
</dependency>
A dependência spring-cloud-starter-bootstrap é crucial, pois o Nacos carrega configurações durante a fase de inicialização do contexto bootstrap, que ocorre antes do contexto application principle.
Configuração do Servidor Nacos
As configurações iniciais do Nacos devem ser especificadas no arquivo bootstrap.properties (ou bootstrap.yml) localizado em src/main/resources. Isso garante que o aplicativo saiba onde encontrar o servidor Nacos antes de carregar outras configurações.
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
Certifique-se de que o endereço e a porta correspondam à sua instância do Nacos.
Criação de Configurações no Console Nacos
Acesse o console administrativo do Nacos. Navegue até "Configurações" > "Lista de Configurações" e clique no botão para criar uma nova configuração.
- Data ID: Geralmente, segue o padrão do nome do serviço, por exemplo,
consumer-service.properties. - Group: Define um grupo lógico para as configurações, com
DEFAULT_GROUPsendo o padrão. - Content: O conteúdo da sua configuração.
Acesso a Propriedades Simples com @Value
Para buscar valores de propriedades diretamente do Nacos, use a anotação @Value em seus componentes Spring. No entanto, para que as atualizações de configuração em tempo real sejam refletidas sem reiniciar a aplicação, é necessário adicionar a anotação @RefreshScope à classe.
Considere um controlador que expõe uma mensagem configurável:
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RefreshScope // Habilita a atualização dinâmica das propriedades
@RestController
@RequestMapping("/app-config")
public class AppConfigController {
@Value("${welcome.message:Mensagem padrão}")
private String welcomeMessage;
@GetMapping("/message")
public String displayWelcomeMessage() {
return "Mensagem do servidor: " + welcomeMessage;
}
}
No Nacos, crie uma configuração com Data ID: consumer-service.properties (se seu spring.application.name for consumer-service) e adicione o conteúdo:
welcome.message=Bem-vindo ao serviço consumidor!
Ao acessar http://localhost:7001/app-config/message (assumindo a porta 7001 para o serviço consumidor), você verá a mensagem configurada. Se você modificar a propriedade welcome.message no Nacos e publicá-la, a alteração será refletida automaticamente na próxima requisição ao endpoint, sem a necessidade de reiniciar a aplicação, graças ao @RefreshScope.
Configurações Específicas de Perfil
O Spring permite gerenciar configurações distintas para diferentes ambientes (desenvolvimento, teste, produção) usando perfis. Para ativar um perfil específico, adicione a seguinte linha ao seu bootstrap.properties:
spring.profiles.active=dev
No Nacos, você deve criar um Data ID que inclua o nome do perfil. Por exemplo, para o perfil dev, o Data ID seria consumer-service-dev.properties. O Nacos carrega primeiro o Data ID base (consumer-service.properties) e, em seguida, aplica as configurações específicas do perfil, sobrescrevendo as propriedades duplicadas.
Suporte a Formato YAML
O Nacos também suporta configurações no formato YAML, que é mais legível. Para usar YAML, configure a extensão do arquivo no bootstrap.properties:
spring.application.name=consumer-service
spring.profiles.active=dev
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.file-extension=yml
No console do Nacos, ao criar a configuração, certifique-se de que o Data ID termine com .yml (ex: consumer-service-dev.yml) e insira o conteúdo em formato YAML:
welcome:
message: "Olá do ambiente de Desenvolvimento (YAML)!"
Vinculação de Propriedades a Objetos Java com @ConfigurationProperties
Para uma organização mais estruturada das configurações, é preferível vincular grupos de propriedades a objetos POJO (Plain Old Java Objects) usando @ConfigurationProperties. Esta abordagem simplifica o gerenciamento de configurações complexas e de vários valores.
Crie uma classe POJO para representar suas configurações, por exemplo, ServiceSettings:
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Data
@Component
@ConfigurationProperties(prefix = "app.service") // Prefixo para as propriedades no Nacos
public class ServiceSettings {
private String name;
private String version;
private int timeoutMillis;
}
Para que o Spring detecte e processe esta classe, adicione @EnableConfigurationProperties à sua classe de inicialização principal do Spring Boot:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
@SpringBootApplication
@EnableConfigurationProperties({ServiceSettings.class})
public class ConsumerServiceApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerServiceApplication.class, args);
}
}
Agora, no controlador, você pode injetar e usar este objeto:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/service-info")
public class ServiceInfoController {
@Autowired
private ServiceSettings serviceSettings;
@GetMapping("/details")
public ServiceSettings getServiceDetails() {
return serviceSettings;
}
}
No Nacos, adicione as configurações correspondentes (ex: Data ID: consumer-service.yml):
app:
service:
name: "Meu Serviço Consumidor"
version: "1.0.0"
timeoutMillis: 5000
Ao acessar http://localhost:7001/service-info/details, você verá os detalhes do serviço. Uma vantagem significativa do @ConfigurationProperties é que ele geralmente **não requer @RefreshScope** para refletir as alterações dinâmicas. As propriedades vinculadas a essas classes são automaticamente atualizadas pelo Nacos.
Isolamento com Namespaces e Grupos Personalizados
Namespaces são usados para isolar completamente as configurações entre diferentes ambientes ou inquilinos, enquanto grupos oferecem uma granularidade menor dentro de um namespace. No Nacos, é possível criar namespaces (por exemplo, "dev", "prod").
Para usar um namespace específico, primeiro crie-o no console do Nacos (ex: um namespace chamado "development" com ID some-unique-namespace-id). Em seguida, configure-o no bootstrap.properties, juntamente com um grupo personalizado, se desejado:
spring.application.name=consumer-service
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.file-extension=yml
spring.cloud.nacos.config.namespace=some-unique-namespace-id
spring.cloud.nacos.config.group=CUSTOM_APP_GROUP
Ao criar uma configuração no Nacos, selecione o namespace correspondente e, se especificado, insira o nome do grupo personalizado. Por exemplo, para o ServiceSettings anterior no namespace "development" e no grupo "CUSTOM_APP_GROUP", o conteúdo pode ser:
app:
service:
name: "Serviço Consumidor - DEV"
version: "1.0.1-SNAPSHOT"
timeoutMillis: 6000
Com essa configuração, o aplicativo buscará as propriedades apenas do namespace e grupo especificados, garantindo um isolamento robusto entre ambientes.