SpringCloud-2.0-周阳(13. 分布式配置中心 - SpringCloud Config)
Posted ABin-阿斌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringCloud-2.0-周阳(13. 分布式配置中心 - SpringCloud Config)相关的知识,希望对你有一定的参考价值。
下一篇 :14. 消息总线 - SpringCloud Bus
- 声明:原文作者:csdn:yuan_404
文章目录
文章目录
1 . 概述
- 基础知识与 Git 环境搭建,请看我之前写的 Springcloud 1.0 :SpringCloud-狂神(10. 分布式配置)学习笔记
2 . 搭建 Git 环境
-
在 Git 中新建自己的仓库
我这里选择的是 Gitee 码云
我新建了一个 spring-cloud-2.0-config 的仓库
-
将仓库克隆到本地
我就直接克隆到了项目中
-
新建三个配置文件
config-dev.yml 、config-prod.yml 、config-test.yml
3 . Config服务端
3.1 配置中心的搭建
-
新建模块 :cloud-config-center-3344
它为 Cloud 的配置中心模块 cloudConfig Center
-
修改 POM
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>com.demo.springcloud</groupId> <artifactId>cloud-api-commons</artifactId> <version>$project.version</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
-
编写 YML
server: port: 3344 spring: application: name: cloud-config-center cloud: config: server: git: # 填写自己的 github 路径 uri: https://gitee.com/yuan934672344/spring-cloud-2.0-config.git search-paths: - springcloud-config label: master eureka: client: service-url: defaultZone: http://localhost:7001/eureka
-
编写主启动类
@SpringBootApplication @EnableConfigServer public class ConfigCenterMain3344 public static void main(String[] args) SpringApplication.run(ConfigCenterMain3344 .class,args);
-
修改一下 config-dev.yml
config: info: "config-dev.yml"
-
启动 Config-Center-3344 ,测试
访问 :http://localhost:3344/config-dev.yml
3.2 配置文件读取规则
-
配置资源的五种访问形式(官网截图)
-
上述访问形式中占位符的含义
4 . Config客户端
4.1 配置客户端
-
新建模块 :cloud-config-client-3355
-
修改 POM
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>com.demo.springcloud</groupId> <artifactId>cloud-api-commons</artifactId> <version>$project.version</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
-
编写 YML
注意是 bootstrap.yml,不是 application
server: port: 3355 spring: application: name: config-client cloud: config: # 分支名称 label: master # 配置文件名 name: config # 环境 profile: dev # 配置中心的地址 uri: http://localhost:3344 eureka: client: service-url: defaultZone: http://localhost:7001/eureka
- 说明 :
- applicaiton.yml 是用户级的资源配置项
- bootstrap.yml 是系统级的,优先级更加高
- Spring Cloud 会创建一个 Bootstrap Context ,作为 Spring 应用的 Application Context 的父上下文。初始化的时候,BootstrapContext 负责从外部源加载配置属性并解析配置。这两个上下文共享一个从外部获取的 Environment 。
- Bootstrap 属性有高优先级,默认情况下,它们不会被本地配置覆盖。Bootstrap context 和 Application Context 有着不同的约定,所以新增了一个 bootstrap.yml 文件,保证 Bootstrap Context 和 Application Context 配置的分离。
- 要将 Client 模块下的 application.yml 文件改为 bootstrap.yml ,这是很关键的,因为 bootstrap.yml 是比 application.yml 先加载的。bootstrap.yml 优先级高于 application.yml
-
编写主启动类
@SpringBootApplication public class ConfigClientMain3355 public static void main(String[] args) SpringApplication.run( ConfigClientMain3355.class,args);
-
简单修改一下 config-dev.yml 文件
为了可以比较直观的看到、区分结果
-
业务类
-
Controller : ConfigClientController
@RestController public class ConfigClientController @Value("$config.info") private String configInfo; @GetMapping("/configInfo") public String getConfigInfo() return configInfo;
-
启动测试
启动 Config-Center-3344 、Config-Client-3355
访问 :http://localhost:3355/configInfo
-
再次修改 config-dev.yml 文件
-
不重启,测试
Config-Center 端,直接刷新就可以得到更新的信息
但是 Config-Client 端得不到更新的信息,只有重启
- 但是实际运用中不可能一直重启项目,所以就需要动态刷新
4.2 避免重启 - 动态刷新
- 修改 Config-Client-3355 模块
-
修改 POM
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
-
修改 YML
暴露监控端口
management: endpoints: web: exposure: include: "*"
-
修改 Controller,添加注解 @RefreshScope
-
修改 Config-dev 文件
-
测试
访问 :http://localhost:3344/config-dev.yml
访问 :http://localhost:3355/configInfo
因为修改了代码,项目会热部署自动重启,所以 Version-3.0 会被更新过来,但是 Version-4.0 是在重启之后更改的,所以没有更新过来。
-
还是没有更新成功
-
这是因为 需要运维人员发送Post请求刷新3355
-
必须是 POST 请求
-
使用 CMD 的 CURL 命令
curl -X POST "http://localhost:3355/actuator/refresh"
-
再次测试
4.3 避免大量刷新语句 - 消息总线
- 上述情况只有一个Client-3355,如果修改配置文件后,需要主动刷新大量的客户端,这样的方法就太麻烦了。
- 简单的处理方法是写一个脚本,自动刷新这些客户端
- 高级一点的就是使用消息总线
5 . 将 springcloud-config 与之前的项目整合
- 因为模块太多,这里就整合一个,举个例子
- 修改 cloud-provider-payment-8001
-
修改 POM
确保 POM 文件中有一下依赖
<!-- 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-actuator</artifactId> </dependency>
-
修改原来的 application.yml
将自己独有的配置信息保留,比如端口号、在 Eureka 中配置的实例名等
# ---------------- 远程配置 ---------------- server: port: 8001 eureka: instance: instance-id: payment-8001
-
在 Git 中创建一个 cloud-payment-service.yml
这个名字可以可以和服务名一致
将上一步中,提取的公共的配置代码,写入这个文件
除此之外,还要添加上 环境(dev)、动态刷新的配置
spring: # 配置环境 profiles: dev # 配置服务名称 application: name: cloud-payment-service # 配置数据源 datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: org.gjt.mm.mysql.Driver url: jdbc:mysql://localhost:3306/spring_cloud_01?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC username: root password: 123456 # 配置 Mybatis 的包扫描 mybatis: type-aliases-package: com.demo.springcloud.pojo mapper-locations: classpath:mapper/*.xml # Eureka 相关配置 eureka: client: # 是否将自己注册进 Eureka Server register-with-eureka: true # 是否从 Eureka Server 抓取已有的注册信息 # 集群的话这里必须设置为 True 才能配合 Ribbon 使用负载均衡 fetchRegistry: true service-url: defaultZone: http://localhost:7001/eureka, http://localhost:7002/eureka instance: prefer-ip-address: true management: endpoints: web: exposure: include: "*"
-
新建一个 bootstrap.yml
spring: cloud: config: # 分支名称 label: master # 配置文件名 name: cloud-payment-service # 环境 profile: dev # 配置中心的地址 uri: http://localhost:3344
-
修改 Controller,添加 @RefreshScope
-
启动测试
启动 Eureka-7001、Config-Center-3344、Provider-8001
访问 :http://localhost:3344/cloud-payment-service-dev.yml
访问 :http://localhost:8001/provider/getPaymentById/1
- 至此 Provider-payment-8001 的远程配置就配置完成,其余的都是一样的套路
以上是关于SpringCloud-2.0-周阳(13. 分布式配置中心 - SpringCloud Config)的主要内容,如果未能解决你的问题,请参考以下文章
SpringCloud-2.0-周阳:(12. 服务网关 - Gateway)
SpringCloud-2.0-周阳(24. 分布式事务 - Seata)
SpringCloud-2.0-周阳(25. 简述 Seata 的原理)
SpringCloud-2.0-周阳(16. 请求链路追踪 - SpringCloud Sleuth)