Nacos proporciona un centro de registro y un centro de configuración. Los siguientes dos ejemplos se utilizan para ilustrar el uso del centro de configuración.
Tabla de contenido
Caso 1: uso del Centro de configuración
Configurar contenido manualmente en Nacos
Caso 2: división y reutilización de la configuración
Descripción de la división y multiplexación de la configuración
Agregar dependencias a pom.xml
Elimine application.properties y agregue bootstrap.properties
Anexo 1: directorio de almacenamiento temporal del cliente de configuración de Nacos
Anexo 2: concepto de jerarquía de aislamiento de configuración de Nacos
Caso 1: uso del Centro de configuración
Configurar contenido manualmente en Nacos
Definido manualmente en Nacos de la siguiente manera
Data ID: firstapp-dev.properties
Group : DEFAULT_GROUP
配置格式: Properties
配置内容: weather=sun
temperature=20.55
La regla de comando de Data ID es: nombre de la aplicación-nombre del perfil del entorno.sufijo del archivo
- Nombre de la aplicación (prefijo de ID de datos) : el valor predeterminado es ${spring.application.name}, también puede usar ${spring.cloud.nacos.config.prefix} para configurar
- Nombre del perfil del entorno : el entorno especificado por ${spring.profiles.active}. Si no se distingue el entorno, es posible que la línea discontinua delante de este contenido no exista.
- Sufijo de archivo : tanto la extensión del archivo de configuración en SpringBoot como el formato de configuración en Nacos.
uso del cliente
Cree un nuevo proyecto o módulo. Agregue dependencias nacos-config y bootstrap al pom.xml predeterminado generado . como sigue
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.6</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>firstapp</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>firstapp</name>
<description>firstapp</description>
<properties>
<java.version>1.8</java.version>
<springcloud.version>3.1.5</springcloud.version>
<springcloudalibaba.version>2021.0.4.0</springcloudalibaba.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>${springcloudalibaba.version}</version>
<exclusions>
<exclusion>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>${springcloudalibaba.version}</version>
<exclusions>
<exclusion>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>1.4.5</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>${springcloud.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
Cree un archivo bootstrap.properties (almacenado en el mismo directorio que el archivo application.properties), y la secuencia de carga de bootstrap.properties es anterior a application.properties.
El contenido del archivo bootstrap.properties es el siguiente:
spring.application.name=firstapp
#Data ID的前缀(如果不指定,则默认取 ${spring.appliction.name})
spring.cloud.nacos.config.prefix=firstapp
#指定为开发环境
spring.profiles.active=dev
#Nacos配置中心服务端的地址和端口(形式ip:port,ip:port,...) 前个地址不可用时,才会自动重连下一个地址
spring.cloud.nacos.config.server-addr=39.100.80.168:8848
#命名空间(由于Nacos自身Bug:若这里显示指定为public会导致高频刷,不显示指定或者指定其他命名空间均正常。 Bug链接 https://github.com/alibaba/nacos/issues/3460)
#spring.cloud.nacos.config.namespace=public
#配置组(如果不指定,则默认为DEFAULT_GROUP)
spring.cloud.nacos.config.group=DEFAULT_GROUP
#指定文件后缀(如果不指定,则默认为properties)
spring.cloud.nacos.config.file-extension=properties
Para la clase de inicio de SpringBoot, agregue el código para obtener y generar elementos de configuración.
@SpringBootApplication
public class FirstappApplication {
public static void main(String[] args) throws InterruptedException {
ConfigurableApplicationContext applicationContext = SpringApplication.run(FirstappApplication.class, args);
while (true) {
String weather = applicationContext.getEnvironment().getProperty("weather");
String temperature = applicationContext.getEnvironment().getProperty("temperature");
System.err.println("weather:" + weather + "; temperature: " + temperature);
TimeUnit.SECONDS.sleep(3);
}
}
}
Después de iniciar y ejecutar, puede ver que el programa SpringBoot ha obtenido el valor del centro de configuración de Nacos.
Al mismo tiempo, si el valor del elemento de configuración se ajusta manualmente en la interfaz de la consola de Nacos, SpringBoot obtendrá automáticamente el valor más reciente de inmediato. Porque Nacos tiene una función de actualización automática.
spring.cloud.nacos.config.refresh.enabled=false
La actualización automática se puede desactivar mediante la configuración
Caso 2: división y reutilización de la configuración
fondo
Este caso se basa en el caso anterior ( https://blog.csdn.net/zyplanke/article/details/120849248 ) para modificar el centro de registro.
Descripción de la división y multiplexación de la configuración
Configure los siguientes tres ID de datos en nacos:
- commonshare.properties pone la configuración pública de cada servicio
- paymentService.properties pone la configuración requerida por el servicio de pago
- orderService.properties coloca la configuración requerida por el servicio de pedidos
Defina manualmente los tres ID de datos anteriores en Nacos, y el contenido es el siguiente:
commonshare.properties:
pagoServicio.propiedades:
orderService.propiedades:
Agregar dependencias a pom.xml
------ 前面省略 ------
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>${springcloudalibaba.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>${springcloud.version}</version>
</dependency>
------ 后面省略 ------
Elimine application.properties y agregue bootstrap.properties
Elimine los archivos application.properties en los servicios de pago y pedido, respectivamente.
Agregue un archivo bootstrap.properties en el servicio de pago y obtenga la configuración de la aplicación desde el centro de configuración. El contenido de bootstrap.properties es el siguiente:
spring.application.name=payment
#配置中心服务器地址
spring.cloud.nacos.config.server-addr=39.100.80.168:8848
#Data ID的前缀(如果不指定,则默认取 ${spring.appliction.name})
spring.cloud.nacos.config.prefix=paymentService
spring.cloud.nacos.config.group=DEFAULT_GROUP
#指定文件后缀(如果不指定,则默认为properties)
spring.cloud.nacos.config.file-extension=properties
#通用共享配置的信息
spring.cloud.nacos.config.shared-configs[0].data-id=commonshare.properties
spring.cloud.nacos.config.shared-configs[0].group=DEFAULT_GROUP
spring.cloud.nacos.config.shared-configs[0].refresh=true
Agregue un nuevo archivo bootstrap.properties en el servicio de pedidos, el contenido es el siguiente:
spring.application.name=order
#配置中心服务器地址
spring.cloud.nacos.config.server-addr=39.100.80.168:8848
#Data ID的前缀(如果不指定,则默认取 ${spring.appliction.name})
spring.cloud.nacos.config.prefix=orderService
spring.cloud.nacos.config.group=DEFAULT_GROUP
#指定文件后缀(如果不指定,则默认为properties)
spring.cloud.nacos.config.file-extension=properties
#通用共享配置的信息
spring.cloud.nacos.config.shared-configs[0].data-id=commonshare.properties
spring.cloud.nacos.config.shared-configs[0].group=DEFAULT_GROUP
spring.cloud.nacos.config.shared-configs[0].refresh=true
puesta en marcha
Inicie los servicios de pago y pedido respectivamente.
Puede ver que el puerto de inicio del servicio de pago es 9999 (configuración de puerto obtenida del centro de configuración de nacos); puede ver que el puerto de inicio del servicio de pedidos es 8888 (configuración de puerto obtenida del centro de configuración de nacos)
verificación de llamadas
curl http://localhost:8888/consumer/66
El servicio de pedido se llama con éxito y la información devuelta cumple con las expectativas.
Anexo 1: directorio de almacenamiento temporal del cliente de configuración de Nacos
- El cliente Nacos descargará la configuración del servidor Nacos al cliente local (si la configuración del servidor cambia, descargará automáticamente la configuración modificada al cliente local) como almacenamiento temporal de la configuración.
- El directorio donde el cliente de Nacos almacena temporalmente localmente es: $HOME /nacos/config/fixed- NacosServerIP _nacos\snapshot\ ($HOME es la ruta de inicio del usuario de inicio de la aplicación cliente)
Anexo 2: concepto de jerarquía de aislamiento de configuración de Nacos
- espacio de nombres: se puede usar para el aislamiento completo de los recursos, los recursos de configuración de configuración en diferentes espacios de nombres no se comparten y los servicios no son interoperables (no se pueden encontrar). El aislamiento de múltiples inquilinos se puede lograr a través del espacio de nombres
- grupo: se puede utilizar para la agrupación de recursos. Bajo el mismo espacio de nombres, los recursos de configuración de configuración de diferentes grupos no se comparten. Los servicios no interoperan (no se pueden encontrar). Se pueden aislar diferentes entornos a través de grupos.
- cluster_name: en el centro de configuración de configuración de Nacos, no existe tal concepto. Perteneciente al Concepto de Registro de Servicios
Nota 1: Los grupos del centro de registro y el centro de configuración son diferentes, y cada uno tiene su propia gestión.
Nota 2: Para la configuración de las capas anteriores, se pueden configurar diferentes grupos en el centro de registro y el centro de configuración de Nacos para la misma instancia de servicio. Es decir, el mismo servicio declara grupo=A al obtener configuración de Nacos, y declara grupo=B al registrar el servicio con Nacos, lo cual está permitido.
Puede encontrar más información sobre los elementos de configuración de nacos config en springcloud en el sitio web oficial de nacos:
Configuración de Nacos · alibaba/spring-cloud-alibaba Wiki · GitHub
Anexo 3: Mostrar y escribir ejemplos de código de monitor y centro de configuración de configuración de Nacos
Escriba y publique el contenido de configuración que se muestra en el código Java en el centro de configuración
a. En lugar de usar el método Springboot Bean, acceda directamente al servidor Nacos a través de los siguientes métodos, escriba la configuración en el servidor o lea la configuración:
ConfigService configService = NacosFactory.createConfigService(ServerAddrList);
configService.publishConfig("test.properties", "GJS_GROUP" , "aaa.bbb=111\nccc.ddd=222\nxxx=333");
configService.getConfig(String dataId, String group, long timeoutMs);
configService.shutDown();
b.Si en el Springboot Bean se obtiene el objeto configService mediante inyección automática:
@Autowired
NacosConfigManager nacosConfigManager;
...... 省略 ......
ConfigService configService = nacosConfigManager.getConfigService();
...... 然后使用该对象操作(省略)......
Agregar monitoreo de elementos de configuración para el centro de configuración de Nacos en código Java
Registre un oyente en el centro de configuración de Nacos. Cuando cambia el contenido de configuración del centro de configuración de Nacos, el contenido más reciente se obtiene automáticamente a través de este oyente y las variables de esta clase se actualizan y guardan:
/**
* 向Nacos配置中心注册监听器
* 当Nacos配置中心的配置内容变化时,通过此监听器自动获取最新内容,并更新并保存本类变量中
*
*/
@Component
@Slf4j
public class NacosConfigListener {
public static Map<String, String> exchCodeServiceNameMap = new HashMap<>(2000);
@Autowired
private void addNacosConfigListener(NacosConfigManager nacosConfigManager) {
ConfigService configService = nacosConfigManager.getConfigService();
try {
configService.addListener(Global.NacosConfigDataID_ExchCode_ServiceName_Map, Global.NacosConfigGroup_ExchCode_ServiceName_Map,
new PropertiesListener() {
@Override
public void innerReceive(Properties properties) {
properties.forEach((key, value) -> exchCodeServiceNameMap.put( (String) key, (String)value));
log.info("感知到Nacos配置中心dataID=[{}],group=[{}]发生变化,已将最新配置内容更新至本地对象", Global.NacosConfigDataID_ExchCode_ServiceName_Map,Global.NacosConfigGroup_ExchCode_ServiceName_Map );
}
});
log.info("作向Nacos配置中心注册器(监听配置变化)完成");
} catch (NacosException e) {
log.error("监听Nacos配置中心遇到异常", e);
}
}
}