Explication détaillée de l'utilisation et de l'actualisation du centre de configuration SpringCloudConfigServer

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-configsla 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.ymlAffecte tous les modules dans tous les environnements
      • application-test.ymlTous les modules qui affectent l'environnement de test
      • xxx.ymlLe module spécifié de xxx qui affecte tous les environnements
      • xxx-test.ymlLe 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 :
insérez la description de l'image ici
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. :
insérez la description de l'image ici

  • 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épendances Config Server
    insérez la description de l'image ici
    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 mainla 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.propertieset créer un nouveau fichier application.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 Clientpour 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.ymlune configuration

Dans le resourcesré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-demoet 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-demoet bootstrap.ymlajoutez la configuration suivante :

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

3. Ajouter RefreshScopedes 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é Environmentlit la configuration et sera actualisé
  • RefreshScopeLes 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 RefreshScopeajouté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.xmlet 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.xmlet 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.

Je suppose que tu aimes

Origine blog.csdn.net/youbl/article/details/129586392
conseillé
Classement