1. Pourquoi ne pas utiliser des nacos
Le projet précédent utilisait nacos comme centre de configuration. Lors de l'utilisation, il y avait encore beaucoup de problèmes :
- Le choix de nacos est d'utiliser l'enregistrement de service et la découverte de nacos en même temps, mais dans l'environnement de production, de nombreux projets ont souffert d'échecs split-brain, y compris la capacité de découverte de service de nacos qui a été abandonnée
après les versions 1.x et 2.x, et seule capacité du centre de configuration - nacos a son propre arrière-plan de gestion, qui doit conserver le mot de passe du compte séparément, ce qui n'est pas pratique pour la gestion.Remarque
: Il semble que LDAP soit également pris en charge, donc je n'ai pas fait de recherche - Il ne peut être modifié que sur la base de la zone de texte enrichi du navigateur, et l'opération d'édition n'est pas pratique.
Remarque : Copiez-le puis recopiez-le ? Trop d'étapes pour faire des erreurs - Lors de la soumission de modifications, la comparaison est également basée sur la propre solution du navigateur, ce qui reste peu pratique
- Il est difficile de retracer la version historique, il n'est pas pratique de la récupérer, elle ne peut pas être comparée et il y a une limite de 30 jours
- Pour augmenter la configuration commune de tous les modules, tous les modules doivent être modifiés en conséquence pour ajouter
spring.cloud.nacos.config.shared-configs
la configuration
Sur la base des raisons ci-dessus, le nouveau projet a décidé d'abandonner nacos et d'utiliser le centre de configuration natif de SpringCloud pour les raisons suivantes :
- Centre de configuration de Spring Cloud, utilisant git comme source de données de configuration
- Soutenez gitlab, github, gitee, etc.
- Fichiers locaux, faciles à modifier
- Le mécanisme de gestion de version de Git, la gestion d'équipe, la soumission, la comparaison, la fusion de branches et d'autres mécanismes sonores
- Plusieurs configurations globales par défaut sont prises en charge :
application.yml
Affecte tous les modules dans tous les environnementsapplication-test.yml
Tous les modules qui affectent l'environnement de testxxx.yml
Le module spécifié de xxx qui affecte tous les environnementsxxx-test.yml
Le module spécifié xxx qui affecte l'environnement de test
Bien sûr, nacos a l'avantage d'intégrer la capacité d'actualisation automatique de la configuration ;
et le centre de configuration de SpringCloud doit intégrer un middleware de message tel que kafka ou rabbitmq pour avoir la capacité d'actualisation automatique de la configuration.
Introduisons l'utilisation du centre de configuration de Spring Cloud.
Cet article est basé sur :
- IDÉE2022.1.3
- Spring Boot 2.7.9
- SpringCloud 2021.0.6
- Java 1.8
2. Construire le serveur du centre de configuration
1. Créer un magasin de configuration git
Vous pouvez créer un nouveau stockage de projet sur git,
ou créer un nouveau sous-répertoire dans le projet git existant, dédié au stockage de toutes les configurations.
J'ai créé un nouveau répertoire dans un projet existant de gitee, appelé spring-configs
, et l'ai téléchargé à l'avance Plusieurs fichiers de configuration :
Remarque : lors du test réel, il a été constaté que github n'est fondamentalement pas connecté au réseau, utilisez donc gitee pour tester
2. Nouveau projet + dépendance Maven
Créez un nouveau projet dans IDEA, configurez le nom, la langue, le groupe, le type, le package logiciel, la version JDK, la version java, etc. :
- Ajouter des dépendances maven
À l'étape suivante, sélectionnez Spring Boot version 2.7.9 (car 3.x ne prend pas en charge Java1.8) et vérifiez les dépendancesConfig Server
Remarque : Il est recommandé de vérifier les dépendances dans le nouveau projet et de modifier le pom .xml plus tard. gênant
3. Modification du code et de la configuration
- Ouvrez
main
la classe où se trouve la fonction et ajoutez des annotations@EnableConfigServer
import org.springframework.cloud.config.server.EnableConfigServer;
@SpringBootApplication
@EnableConfigServer
public class MyConfigServerDemoApplication {
public static void main(String[] args) {
SpringApplication.run(MyConfigServerDemoApplication.class, args);
}
}
- Supprimer dans le répertoire des ressources
application.properties
et créer un nouveau fichierapplication.yml
Remarque : J'aime le format yml, vous pouvez aussi le modifier directementapplication.properties
- Ouvrez
application.yml
, ajoutez la configuration 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
OK, démarrez
le projet ci-dessus sous l'aperçu du projet. Une fois le démarrage terminé, visitez l'adresse : http://localhost:8999/config-client-demo/test
vous pouvez voir un json similaire au suivant, répertoriant tous les fichiers yml auxquels le projet accédera, ainsi que leur contenu :
{
"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. Centre de configuration d'accès à la connexion client SpringBoot
Une fois le serveur du centre de configuration créé, l'étape suivante consiste à configurer le client pour qu'il se connecte et accède à la configuration du centre de configuration.
1. Ajouter une dépendance maven
- Lors de la création d'un nouveau projet, sur la page des dépendances, cochez-la simplement
Config Client
pour terminer l'ajout de la dépendance.
Remarque : Pour un nouveau projet, pour ouvrir le pom, ajoutez les dépendances suivantes :
<dependency> <!-- 用于加载bootstrap.yml配置,否则报错 No spring.config.import property has been defined -->
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
- S'il s'agit d'un ancien projet, ouvrez le fichier pom.xml du projet et ajoutez la configuration :
<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. Ajouter bootstrap.yml
une configuration
Dans le resources
répertoire du projet, créez un nouveau fichier bootstrap.yml
, référence de contenu :
spring:
application:
name: config-client-demo # 项目名,配置中心读取配置用
cloud:
config:
uri: http://localhost:8999 # 指定配置中心的url
profile: test # 指定使用哪个配置,可以搭配spring.profiles.active使用
label: master # 指定分支,可为空,默认取主干
Remarque : Si une erreur est signalée : No spring.config.import property has been defined
confirmez si la dépendance Maven est manquantespring-cloud-starter-bootstrap
OK, démarrez le client et affichez la configuration écrite dans le centre de configuration pour
essayer. Testez le code de référence :
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. Actualisation de la configuration client
Une fois que le client s'est connecté avec succès au centre de configuration, il ne peut lire la configuration qu'au démarrage.
Si la configuration sur git est modifiée, le client doit être redémarré pour charger la dernière configuration.
Voici comment actualiser manuellement la configuration du client.
1. Ajouter la dépendance de l'actionneur
Ouvrez le pom.xml du projet client config-client-demo
et ajoutez les dépendances suivantes :
<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. Modification de la configuration
Ouvrez le projet client config-client-demo
et bootstrap.yml
ajoutez la configuration suivante :
management:
endpoints:
web:
exposure:
include: "refresh" # 用*表示暴露全部
3. Ajouter RefreshScope
des annotations
Ajoutez des annotations aux classes qui ont lu la configuration et doivent être actualisées RefreshScope
, telles que :
@Component
@RefreshScope
public class ConfigTest2 {
@Value("${beinet.newVal}")
String str3;
public String getStr3() {
return str3;
}
}
4. Ajustez l'interface client et actualisez la configuration
OK, lorsque la configuration du centre de configuration change, le rafraîchissement de la configuration peut être complété en appelant manuellement l'interface du client : la
POST http://localhost:8080/actuator/refresh
commande CURL correspondante : curl -X POST http://localhost:8080/actuator/refresh
après avoir exécuté la requête d'interface, vous pouvez voir le journal du client, et il y aura plus de logs pour recharger la configuration, par exemple :
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. Actualisez les notes
- Le bean passé
Environment
lit la configuration et sera actualisé RefreshScope
Les configurations sans annotations ne seront pas actualisées- La classe où se trouve la fonction principale ne sera pas rafraîchie, même si elle est
RefreshScope
ajoutée
5. Actualiser automatiquement toutes les configurations client via le bus de messages de bus
La méthode ci-dessus ne peut actualiser que la configuration d'un seul client et n'actualise pas la configuration des autres services.
Même si un service déploie plusieurs machines, les autres machines ne seront pas actualisées.
Vous devez savoir sur quelles machines chaque service est déployé et actualiser l'interface d'appel une machine à la fois.
Dans cette section, nous présenterons comment notifier tous les clients du côté serveur du centre de configuration pour actualiser automatiquement la configuration.
Descriptif du principe :
- Appelez l'API du serveur du centre de configuration pour notifier l'actualisation
- Configurer le serveur central pour envoyer des messages à Kafka
- Tous les clients écoutent les messages Kafka et effectuent l'actualisation de la configuration
1. Ajouter des dépendances et une configuration côté serveur
- Ouvrez le serveur du centre de configuration
pom.xml
et ajoutez les dépendances suivantes :
<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>
- Ouvrez le serveur du centre de configuration
application.yml
, ajoutez la configuration suivante et activez la transmission des messages du 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" # 用*表示暴露全部
OK, vous pouvez démarrer le serveur du centre de configuration.
2. Le client ajoute des dépendances et des configurations
- Ouvrez chaque client
pom.xml
et ajoutez les dépendances suivantes :
<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>
- Ouvrez chaque client
bootstrap.yml
, ajoutez la configuration kafka et activez la consommation des messages du bus :
spring:
kafka:
bootstrap-servers: 10.1.2.3:9092 # 用到的Kafka连接信息
OK, commençons ces clients.
3. Ajustez l'interface du serveur et actualisez toutes les configurations client
OK, quand la configuration du centre de configuration est modifiée,
il faut encore appeler l'interface manuellement, mais l'interface du serveur est appelée pour terminer le rafraichissement de la configuration de tous les clients : la
POST http://localhost:8999/actuator/busrefresh
commande CURL correspondante :curl -X POST http://localhost:8999/actuator/busrefresh
Après avoir exécuté la requête d'interface, vous pouvez voir que le serveur et chaque client auront plus de journaux pour recharger la configuration
Enfin, le centre de configuration d'origine n'est pas bon à ce stade.Si vous modifiez la configuration, vous devez ajuster manuellement l'interface pour la rafraîchir.