3. Spring Cloud: Centro de configuración de Nacos

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

uso del cliente

Caso 2: división y reutilización de la configuración

fondo

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

puesta en marcha

verificación de llamadas

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

Anexo 3: Mostrar y escribir ejemplos de código de monitor y centro de configuración 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);
        }
    }
}

Supongo que te gusta

Origin blog.csdn.net/zyplanke/article/details/120860958
Recomendado
Clasificación