企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
[TOC] > 在分布式微服务架构中,由于服务数量很多 ,使得有很多配置文件,在更新配置文件时很麻烦。 每个微服务自已带着一个 application.yml,上百个配置文件的管理起来就很麻烦,所以一套集**中式的、动态的配置管理功能**是必不可少的,在Spring Cloud中,有分布式配置中心组件Spring Cloud Config来解决这个问题 ## **1. 什么是Spring Cloud Config** Spring Cloud Config 为微服务架构中的微服务提供 **集中式的外部配置支持**, 配置服务器为各个不同微服务应用的所有环境提供了一个中心化的外部配置。 ![](https://img.kancloud.cn/46/f6/46f682e42ef6ed537c6d4deef2fcb8de_835x322.png) ### 1.1 **Spring Cloud Config 分为服务端与客户端两个部分** * **服务端 config server** 也称为分布式配置中心,它是一个独立的微服务应用,用来连接配置服务器并为客户端提供获**取配置信息,加密、解密信息等访问接口.** **配置服务器**官方推荐采用 Git 来存储配置信息,这样就有助于对环境配置进行版本管理,并且可通过Git客户端工具来方便的管理与访问配置信息。 * **客户端 config client** 通过指定的服务端来管理服务的资源,以及与业务相关的配置内容,并在启动的时候从服务端获取和加载配置信息。 * 作用 1. 集中管理配置文件 2. 不同环境不同配置,动态化的配置更新,根据不同环境部署,如 dev/test/prod运行期间动态调整配置,不再需要在每个服务部署的机器上编写配置,服务会向配置中心统一拉取自已的配置信息 3. 当配置发生变动时,服务不需要重启即可感知到配置的变化并使用修改后的配置信息 4. 将配置信息以REST接口的形式暴露 ## **2. Spring Cloud Config 服务端配置** ### **2.1 创建配置文件与提交Github** **1. 登录 GitHub,新建一个 microservice-cloud-config 仓库** ![](https://img.kancloud.cn/f1/45/f145d6715843b0db1a10442991f1a2b7_530x389.png) ![](https://img.kancloud.cn/2d/c5/2dc513b58baec3388f0419eb2a29c073_707x421.png) **2. 克隆远程仓库到本地** git clone https://github.com/dailinlernhard/microservice-cloud-config.git ![](https://img.kancloud.cn/3b/87/3b878df05b6937df1fd983ae8e923c4e_567x130.png) **3. 在 D:\\gitStudy\\SpringCloud\\microservice-cloud-config 中,新建一个 microservice\-config\-application.yml配置文件** ``` #注意:如果在记事本上编写,下面的缩进不要使用Tab来缩进,不然报错 spring: profiles: active: dev # 激活开发环境配置 --- server: port: 4001 #端口号 spring: profiles: dev # 开发环境 application: name: microservice-config-dev --- server: port: 4002 #端口号 spring: profiles: prod # 生产环境 application: name: microservice-config-prod ``` **4. 将 application.yml 推送到 github 远程库** ``` $ cd microservice-cloud-config # 添加到暂存区 $ git add microservice-config-application.yml # 提交到本地库 $ git commit -m "first commit" microservice-config-application.yml # 推送到远程库origin 的 master 主分支上 $ git push origin master ``` 提交上去了 ![](https://img.kancloud.cn/1b/7d/1b7d10e8a2daf1b699b56691e0e30ae6_743x488.png) ### **2.2 新建Config服务端模块(配置中心)** **1. 创建 microservice-cloud-config模块** ![](https://img.kancloud.cn/66/00/6600d6dd9fd4caf96f1563713056c578_355x381.png) **2. 修改pom文件,加入confia server依赖** ``` <!-- Spring Cloud Config配置中心依赖 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> ``` **3. 配置 application.yml 文件** 配置 远程仓库git地址 ~~~ server: port: 5001 spring: application: name: microservice-config cloud: config: server: git: # 远程库的git地址 uri: https://github.com/dailinlernhard/microservice-cloud-config.git ~~~ **4. 创建启动类与添加注解 @EnableConfigServer** ~~~ package com.tuna.springcloud.config; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.config.server.EnableConfigServer; @EnableConfigServer @SpringBootApplication public class ConfigServer_5001 { public static void main(String[] args) { SpringApplication.run(ConfigServer_5001.class, args); } } ~~~ **5. 配置读取规则** * `/{application}-{profile}.yml ` /读取的配置文件名-环境配置项 (默认为master分支) 如:`http://localhost:5001/microservice-config-application-dev.yml ` * `/{application}/{profile}[/{label}] ` /读取的配置文件名/环境配置项/分支名 如:`http://localhost:5001/microservice-config-application/dev/master ` * `/{label}/{application}-{profile}.yml ` /分支名/读取的配置文件名/环境配置项 如:`http://localhost:5001/master/microservice-config-application-dev.yml` ***测试读取配置文件*** [http://localhost:5001/microservice-config-application-dev.yml](http://localhost:5001/microservice-config-application-dev.yml) 表示读取文件名microservice-config-application.yml文件,并且是profile是Dev的部分 ![](https://img.kancloud.cn/5b/82/5b8221343c8859fd8459e4854e722233_634x242.png) 读取profile=prod的配置文件 ![](https://img.kancloud.cn/35/70/3570516195fed68c6d95e9b16af47e34_602x196.png) ## **3. Spring Cloud Config 客户端服务** ### **1. 新建Config客户端模块** 创建模块:microservice-cloud-config-client ![](https://img.kancloud.cn/7c/d3/7cd3b5a2f0cf0849615310be2aea6ba6_453x365.png) ### **2. 配置 pom.xml 文件** ``` <dependencies> <!-- Spring Cloud Config 客户端依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> ``` ### **3 .配置 bootstrap.yml** * application.yml 是用户级别的配置项 * bootstrap.yml 是系统级别的配置项,优先级更高 * bootstrap.yml 先于 application.yml 加载 > 在类路径resources下创建 bootstrap.yml 配置文件,内容如下: ~~~ spring: cloud: config: name: microservice-config-application #github上的配置文件名称,注意没有yml后缀名 profile: dev #本次访问的环境配置项 label: master #远程库的分支名 uri: http://localhost:5001 #Config配置中心地址,通过它获取microservice-config-application.yml配置信息 ~~~ ### **4. 配置 application.yml** 在类路径 resources 下创建 application.yml,内容如下: ~~~ server: port: 8080 spring: application: name: microservice-config-client ~~~ ### **5. ConfigClient 类,通过Rest方式验证是否能够读取到 GitHub 上的配置信息** 在bean中,通过@Value("key值") 绑定 GitHub 中对应配置中的key所对应的value值。 ~~~ @RestController public class ConfigClient { @Value("${server.port}") //绑定值 private String port; @Value("${spring.application.name}") //绑定值 private String applicationName; @GetMapping("/config") public String config() { String content = "applicationName: " + applicationName + ", port: " + port; System.out.println(content); return content; } } ~~~ ### **6. 创建启动类** ~~~ @SpringBootApplication public class ConfigClient_8080 { public static void main(String[] args) { SpringApplication.run(ConfigClient_8080.class, args); } } ~~~ ### **7. 测试:** ![](https://img.kancloud.cn/dd/6e/dd6ec2a477801f0fe5b6f60f317cf863_725x453.png) * **client端口是8080为啥访问不到?** 右下图可以看去,虽然application.yml配置的端口是8080,但是从日志启动来看,占用的却是4001端口 ![](https://img.kancloud.cn/43/47/4347a291097bb8b3b77c09edfbc52fdd_1111x470.png) 造成上边的原因是在client端**bootstrap.yml**配置文件读取了`http://localhost:5001`的profile=Dev的microservice-config-application配置文件配置,**也就是git上的dev部分配置文件!** ``` spring: cloud: config: name: microservice-config-application #github上的配置文件名称,注意没有yml后缀名 profile: dev #本次访问的环境配置项 label: master #远程库的分支名 uri: http://localhost:5001 #Config配置中心地址,通过它获取microservice-config-application.yml配置信息 ``` ![](https://img.kancloud.cn/6c/f6/6cf6e99971787855f9bdd60850bc702b_835x570.png) 所以访问4001可以的 ![](https://img.kancloud.cn/24/d1/24d1670b11653c0a80b140ce949d8e53_465x123.png) 说明正确的读取到了git上的配置 **如果bootstrap.yml修改成prod** ![](https://img.kancloud.cn/db/48/db485c01fb50666d0b28a4831bae5788_831x193.png) * **如图访问4002(因为git上的配置文件prod部分端口就是4002)** ![](https://img.kancloud.cn/a9/c4/a9c4585b7e184c979005377d6e4a19ba_561x181.png)