Explicación detallada del uso y la actualización del centro de configuración de SpringCloudConfigServer

1. ¿Por qué no usar nacos?

El proyecto anterior usaba nacos como centro de configuración, durante el uso aún había muchos problemas:

  • La elección de nacos es usar el servicio de registro y descubrimiento de nacos al mismo tiempo, pero en el entorno de producción, muchos proyectos han sufrido fallas de cerebro dividido, incluida la capacidad de descubrimiento de servicios de nacos que se abandonó después de las versiones
    1.x y 2.x, y solo la capacidad del centro de configuración
  • nacos tiene su propio historial de administración, que necesita mantener la contraseña de la cuenta por separado, lo que no es conveniente para la administración.
    Nota: parece que LDAP también es compatible, por lo que no investigué
  • Solo se puede editar en función del cuadro de texto enriquecido del navegador, y la operación de edición es inconveniente.
    Nota: ¿Copiarlo y luego volver a copiarlo? Demasiados pasos para cometer errores
  • Al enviar modificaciones, la comparación también se basa en la propia solución del navegador, lo que sigue siendo un inconveniente
  • Es problemático rastrear la versión histórica, es inconveniente recuperarla, no se puede comparar y hay un límite de 30 días.
  • Para aumentar la configuración común de todos los módulos, todos los módulos deben modificarse en consecuencia para agregar spring.cloud.nacos.config.shared-configsconfiguración

Basado en las razones anteriores, el nuevo proyecto decidió abandonar nacos y usar el centro de configuración nativo de SpringCloud por las siguientes razones:

  • Centro de configuración de Spring Cloud, usando git como fuente de datos de configuración
    • Admite gitlab, github, gitee, etc.
    • Archivos locales, fácil de editar
    • Mecanismo de gestión de versiones de Git, gestión de equipos, presentación, comparación, fusión de ramas y otros mecanismos de sonido.
    • Se admiten varias configuraciones globales predeterminadas:
      • application.ymlAfecta a todos los módulos en todos los entornos.
      • application-test.ymlTodos los módulos que afectan el entorno de prueba.
      • xxx.ymlEl módulo especificado de xxx que afecta a todos los entornos.
      • xxx-test.ymlEl módulo especificado xxx que afecta el entorno de prueba

Por supuesto, nacos tiene la ventaja de que integra la capacidad de actualización automática de la configuración,
y el centro de configuración de SpringCloud necesita integrar un middleware de mensajes como kafka o rabbitmq para tener la capacidad de actualización automática de la configuración.
Presentemos el uso del centro de configuración de Spring Cloud.
Este artículo está basado en:

  • IDEA2022.1.3
  • SpringBoot 2.7.9
  • SpringCloud 2021.0.6
  • java 1.8

2. Cree el servidor del centro de configuración

1. Crea un almacén de configuración de git

Puede crear un nuevo almacenamiento de proyecto en git,
o crear un nuevo subdirectorio en el proyecto git existente, dedicado a almacenar todas las configuraciones
Creé un nuevo directorio en un proyecto existente de gitee, llamado spring-configsy lo cargué por adelantado Varios archivos de configuración:
inserte la descripción de la imagen aquí
Nota: en la prueba real, se encontró que github básicamente no está conectado a la red, así que use gitee para probar

2. Nuevo proyecto + dependencia de Maven

Cree un nuevo proyecto en IDEA, configure el nombre, idioma, grupo, tipo, paquete de software, versión JDK, versión java, etc.:
inserte la descripción de la imagen aquí

  • Agregar dependencias maven
    En el siguiente paso, seleccione Spring Boot versión 2.7.9 (porque 3.x no es compatible con Java1.8) y verifique las dependencias Config Server
    inserte la descripción de la imagen aquí
    Nota: Se recomienda verificar las dependencias en el nuevo proyecto y modificar el pom .xml más tarde.

3. Modificación de código y configuración

  • Abra mainla clase donde se encuentra la función y agregue anotaciones.@EnableConfigServer
import org.springframework.cloud.config.server.EnableConfigServer;

@SpringBootApplication
@EnableConfigServer
public class MyConfigServerDemoApplication {
    
    

    public static void main(String[] args) {
    
    
        SpringApplication.run(MyConfigServerDemoApplication.class, args);
    }
}
  • Eliminar en el directorio de recursos application.propertiesy crear un nuevo archivo application.yml
    Nota: me gusta el formato yml, también puedes editarlo directamenteapplication.properties
  • Abra application.yml, agregue la configuración de git:
server:
  port: 8999  # 配置中心服务端在8999端口监听

spring:
  application:
    name: my-config-server-demo

  # 配置完直接启动即可,访问方式:
  # http://localhost:8999/{spring.application.name}/{spring.profiles.active}/{git分支}
  # {spring.application.name} 必需,就是具体项目的项目名(yml里配置的),不是config-server的哦
  # {spring.profiles.active} 必需,就是具体项目的环境(yml里配置的),注:具体项目可以不配置,使用默认值
  # {git分支} 可空,git配置文件所在的分支,默认使用下面的default-label
  #
  # 注意:server项目启动后,会把git项目clone到本地,如windows系统会在 C:\Users\xxx\AppData\Local\Temp\config-repo-xxx
  cloud:
    config:
      server:
        git:
          uri: https://gitee.com/youbl/my-demo.git # git项目的url地址,支持gitlab、github、gitee等
          search-paths: spring-configs          # git项目下,存放yml配置文件的子目录
          username: beinet                      # git账号
          password: 123456                      # git密码
          default-label: master   # 默认会获取main分支,不存在就报错: No such label: main
          timeout: 6              # 读取git的超时时间,默认5秒
          #clone-on-start: true                 # 启动时把配置clone到本地,默认false,第一次访问会比较慢
          #basedir:	c:/abc  					# 本地默认工作目录
          #refresh-rate: 100                    # 服务从git更新配置的时间间隔,单位秒,默认值0,表示每次请求都去获取最新配置
          skip-ssl-validation: true             # 忽略git地址的ssl错误: unable to find valid certification path to requested target

Bien, inicie
el proyecto anterior en la vista previa del proyecto. Después de que se complete el inicio, visite la dirección: http://localhost:8999/config-client-demo/test
puede ver un json similar al siguiente, que enumera todos los archivos yml a los que accederá el proyecto y su contenido:

{
    
    
  "name": "config-client-demo",
  "profiles": [
    "test"
  ],
  "label": null,
  "version": "169ff9974ccc09c594995ceabac26c983cd607bf",
  "state": null,
  "propertySources": [
    {
    
    
      "name": "https://gitee.com/youbl/my-demo.git/spring-configs/config-client-demo-test.yml",
      "source": {
    
    
        "beinet.config": "配置中心的front-study-test值",
        "beinet.tttt": "abdefssadfga"
      }
    },
    {
    
    
      "name": "https://gitee.com/youbl/my-demo.git/spring-configs/application-test.yml",
      "source": {
    
    
        "beinet.config": "配置中心的全局-test值",
        "beinet.tttt": "abdefs",
        "beinet.newVal": "2惹2"
      }
    },
    {
    
    
      "name": "https://gitee.com/youbl/my-demo.git/spring-configs/config-client-demo.yml",
      "source": {
    
    
        "beinet.config": "配置中心的front-study默认值",
        "beinet.tttt": "abdefs"
      }
    },
    {
    
    
      "name": "https://gitee.com/youbl/my-demo.git/spring-configs/application.yml",
      "source": {
    
    
        "beinet.config": "配置中心的全局值",
        "beinet.tttt": "abdefs"
      }
    }
  ]
}

3. Centro de configuración de acceso a la conexión del cliente SpringBoot

Una vez construido el servidor del centro de configuración, el siguiente paso es configurar el cliente para conectarse y acceder a la configuración del centro de configuración.

1. Agregar dependencia experta

  • Al crear un nuevo proyecto, en la página de dependencias, simplemente márquelo Config Clientpara completar la adición de dependencias.
    Nota: Para un nuevo proyecto, para abrir el pom, agregue las siguientes dependencias:
    <dependency> <!-- 用于加载bootstrap.yml配置,否则报错 No spring.config.import property has been defined -->
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-bootstrap</artifactId>
    </dependency>
  • Si es un proyecto antiguo, abra el archivo pom.xml del proyecto y agregue la configuración:
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.7.9</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
    <java.version>1.8</java.version>
    <spring-cloud.version>2021.0.6</spring-cloud.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-config</artifactId>
    </dependency>
    <dependency> <!-- 用于加载bootstrap.yml配置,否则报错 No spring.config.import property has been defined -->
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-bootstrap</artifactId>
    </dependency>
</dependencies>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

2. Agregar bootstrap.ymlconfiguración

En el resourcesdirectorio del proyecto, cree un nuevo archivo bootstrap.yml, referencia de contenido:

spring:
  application:
    name: config-client-demo           # 项目名,配置中心读取配置用
  cloud:
    config:
      uri: http://localhost:8999       # 指定配置中心的url
      profile: test                    # 指定使用哪个配置,可以搭配spring.profiles.active使用
      label: master                    # 指定分支,可为空,默认取主干

Nota: si se informa un error: No spring.config.import property has been defined
confirme si falta la dependencia de Mavenspring-cloud-starter-bootstrap

De acuerdo, inicie el cliente y emita la configuración escrita en el centro de configuración para
probar. Código de referencia de prueba:

package beinet.cn.configclientdemo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.core.env.Environment;

@SpringBootApplication
public class ConfigClientDemoApplication implements CommandLineRunner {
    
    

    public static void main(String[] args) {
    
    
        SpringApplication.run(ConfigClientDemoApplication.class, args);
    }

    @Autowired
    Environment env;
    @Override
    public void run(String... args) throws Exception {
    
    
        System.out.println(env.getProperty("beinet.config"));
    }
}

4. Actualización de la configuración del cliente

Una vez que el cliente se conecta con éxito al centro de configuración, solo puede leer la configuración al inicio.
Si se modifica la configuración en git, se debe reiniciar el cliente para cargar la configuración más reciente.
Aquí se explica cómo actualizar manualmente la configuración del cliente.

1. Agregar dependencia del actuador

Abra el pom.xml del proyecto del cliente config-client-demoy agregue las siguientes dependencias:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

2. Modificación de la configuración

Abra el proyecto del cliente config-client-demoy bootstrap.ymlagregue la siguiente configuración:

management:
  endpoints:
    web:
      exposure:
        include: "refresh"   # 用*表示暴露全部

3. Agregar RefreshScopeanotaciones

Agregue anotaciones a las clases que han leído la configuración y necesitan actualizarse RefreshScope, como:

@Component
@RefreshScope
public class ConfigTest2 {
    
    

    @Value("${beinet.newVal}")
    String str3;

    public String getStr3() {
    
    
        return str3;
    }
}

4. Ajuste la interfaz del cliente y actualice la configuración

De acuerdo, cuando cambia la configuración del centro de configuración, la actualización de la configuración se puede completar llamando manualmente a la interfaz del cliente: el
POST http://localhost:8080/actuator/refresh
comando CURL correspondiente: curl -X POST http://localhost:8080/actuator/refresh
después de ejecutar la solicitud de interfaz, puede ver el registro del cliente y habrá más registros para recargar la configuración, por ejemplo:

2023-03-22 13:38:37.976  INFO 2260 --- [nio-8080-exec-8] c.c.c.ConfigServicePropertySourceLocator : Fetching config from server at : http://localhost:8999
2023-03-22 13:38:38.844  INFO 2260 --- [nio-8080-exec-8] c.c.c.ConfigServicePropertySourceLocator : Located environment: name=config-client-demo, profiles=[test], label=master, version=e5b67cb61ad976c2c1bd863dae769aabf1553c21, state=null
2023-03-22 13:38:38.844  INFO 2260 --- [nio-8080-exec-8] b.c.PropertySourceBootstrapConfiguration : Located property source: [BootstrapPropertySource {name='bootstrapProperties-configClient'}, BootstrapPropertySource {name='bootstrapProperties-https://gitee.com/youbl/my-demo.git/spring-configs/config-client-demo-test.yml'}, BootstrapPropertySource {name='bootstrapProperties-https://gitee.com/youbl/my-demo.git/spring-configs/application-test.yml'}, BootstrapPropertySource {name='bootstrapProperties-https://gitee.com/youbl/my-demo.git/spring-configs/config-client-demo.yml'}, BootstrapPropertySource {name='bootstrapProperties-https://gitee.com/youbl/my-demo.git/spring-configs/application.yml'}]
2023-03-22 13:38:38.846  INFO 2260 --- [nio-8080-exec-8] o.s.boot.SpringApplication               : No active profile set, falling back to 1 default profile: "default"
2023-03-22 13:38:38.849  INFO 2260 --- [nio-8080-exec-8] o.s.boot.SpringApplication               : Started application in 0.998 seconds (JVM running for 402.306)
配置中心的front-study-test值..

5. Actualizar las notas

  • El Bean pasado Environmentlee la configuración y se actualizará
  • RefreshScopeLas configuraciones sin anotaciones no se actualizarán
  • La clase donde se encuentra la función principal no se actualizará, incluso si se RefreshScopeagrega

5. Actualizar automáticamente todas las configuraciones del cliente a través del bus de mensajes del bus.

El método anterior solo puede actualizar la configuración de un solo cliente y no actualizará la configuración de otros servicios
Incluso si un servicio implementa varias máquinas, otras máquinas no se actualizarán.
Debe saber en qué máquinas se implementa cada servicio y actualizar la interfaz de llamadas una máquina a la vez.

En esta sección, presentaremos cómo notificar a todos los clientes en el lado del servidor del centro de configuración para actualizar automáticamente la configuración.
Descripción del principio:

  • Llame a la API del servidor del centro de configuración para notificar la actualización
  • Configurar el servidor central para entregar mensajes a Kafka
  • Todos los clientes escuchan los mensajes de Kafka y realizan la configuración de actualización

1. Agregar dependencias y configuración en el lado del servidor

  • Abra el servidor del centro de configuración pom.xmly agregue las siguientes dependencias:
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-bus-kafka</artifactId>
</dependency>
  • Abra el servidor del centro de configuración application.yml, agregue la siguiente configuración y habilite el envío de mensajes de bus:
spring:
  cloud:
    # 启用bus后,对应的消息队列(如kafka)会自动创建一个topic springCloudBus
    # 使用 curl -X POST http://localhost:8999/actuator/busrefresh 会触发消息推送到这个topic,供client使用
    bus:
      refresh:
        enabled: true
  kafka:
    bootstrap-servers: 10.1.2.3:9092  # 用到的Kafka连接信息
management:
  endpoints:
    web:
      exposure:
        include: "busrefresh"   # 用*表示暴露全部

Bien, puede iniciar el servidor del centro de configuración.

2. El cliente agrega dependencias y configuraciones

  • Abra cada cliente pom.xmly agregue las siguientes dependencias:
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-bus-kafka</artifactId>
</dependency>
  • Abra cada cliente bootstrap.yml, agregue la configuración de kafka y habilite el consumo de mensajes de bus:
spring:
  kafka:
    bootstrap-servers: 10.1.2.3:9092  # 用到的Kafka连接信息

Bien, comencemos con estos clientes.

3. Ajuste la interfaz del servidor y actualice todas las configuraciones del cliente

Bien, cuando se cambia la configuración del centro de configuración,
todavía es necesario llamar a la interfaz manualmente, pero se llama a la interfaz del servidor para completar la actualización de configuración de todos los clientes: el
POST http://localhost:8999/actuator/busrefresh
comando CURL correspondiente:curl -X POST http://localhost:8999/actuator/busrefresh

Después de ejecutar la solicitud de interfaz, puede ver que el servidor y cada cliente tendrán más registros para recargar la configuración.

Finalmente, el centro de configuración original no es bueno en este punto.Si cambia la configuración, debe ajustar manualmente la interfaz para actualizarla.

Supongo que te gusta

Origin blog.csdn.net/youbl/article/details/129586392
Recomendado
Clasificación