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-configs
configuració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.yml
Afecta a todos los módulos en todos los entornos.application-test.yml
Todos los módulos que afectan el entorno de prueba.xxx.yml
El módulo especificado de xxx que afecta a todos los entornos.xxx-test.yml
El 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-configs
y lo cargué por adelantado Varios archivos de configuración:
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.:
- 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 dependenciasConfig Server
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
main
la 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.properties
y crear un nuevo archivoapplication.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 Client
para 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.yml
configuración
En el resources
directorio 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-demo
y 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-demo
y bootstrap.yml
agregue la siguiente configuración:
management:
endpoints:
web:
exposure:
include: "refresh" # 用*表示暴露全部
3. Agregar RefreshScope
anotaciones
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
Environment
lee la configuración y se actualizará RefreshScope
Las configuraciones sin anotaciones no se actualizarán- La clase donde se encuentra la función principal no se actualizará, incluso si se
RefreshScope
agrega
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.xml
y 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.xml
y 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.