概述
微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大量的服务,由于每个服务都需要必要的配置信息才能运行,所以一套集中式的、动态的配置管理设施是必不可少的!
SpringCloud提供了ConfigServer来解决这个问题,设想如果我们每一个微服务都自己带着一个application.yml,那么如果有上百个微服务呢......
是什么?
SpringCloud Config为微服务架构中的微服务提供了集中化的外部配置支持,配置服务器为各个不同微服务应用的所有环境提供了一个中心化的外部配置
怎么用?
SpringCloud Config分为客户端和服务端两部分
服务端也称为分布式配置中心,它是一个独立的微服务应用,用来连接配置服务器并为客户端提供获取配置信息、加密、解密信息等访问接口
客户端则是通过指定的配置中心来管理应用资源,以及与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息,配置服务器默认采用git来存储配置信息,这样有助于对环境配置进行版本管理,并且可以通过git客户端工具来方便管理和访问配置内容!
Config服务端配置与测试
1.在GitHub上新建一个名为springcloud-config的新Repository(需要是public的仓库,private的访问不了)
2.本地硬盘目录上新建git仓库并添加远程仓库、拉取远程仓库最新内容
CC@LAPTOP-R4VGGC1O MINGW64 /e/Git/cloud2021 # echo "# springcloud-config" >> README.md CC@LAPTOP-R4VGGC1O MINGW64 /e/Git/cloud2021 # git init Initialized empty Git repository in E:/Git/cloud2021/.git/ CC@LAPTOP-R4VGGC1O MINGW64 /e/Git/cloud2021 (master) # git add README.md warning: LF will be replaced by CRLF in README.md. The file will have its original line endings in your working directory CC@LAPTOP-R4VGGC1O MINGW64 /e/Git/cloud2021 (master) # git commit -m "first commit" [master (root-commit) b9a4cae] first commit 1 file changed, 1 insertion(+) create mode 100644 README.md CC@LAPTOP-R4VGGC1O MINGW64 /e/Git/cloud2021 (master) # git remote add springcloud-config git@github.com:chenstudyJava/springcloud-config.git CC@LAPTOP-R4VGGC1O MINGW64 /e/Git/cloud2021 (master) # git push springcloud-config master Enumerating objects: 3, done. Counting objects: 100% (3/3), done. Writing objects: 100% (3/3), 226 bytes | 226.00 KiB/s, done. Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 To github.com:chenstudyJava/springcloud-config.git * [new branch] master -> master
远程仓库上创建下面这三个文件,文件暂时不输入内容
3.新建工程模块cloud-config-center-3344,它即为Cloud的配置中心模块cloudConfig Center
4.pom文件
<dependencies> <!--config server--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> <!--eureka client(通过微服务名实现动态路由)--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </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>
5.yml文件
server: port: 3344 spring: application: name: cloud-config-center # 注册进Eureka服务器的微服务名 cloud: config: server: git: uri: https://github.com/chenstudyJava/springcloud-config.git # git的仓库地址,这里我用ssh连接出错了,还没找到原因 search-paths: # 搜索目录 - springcloud-config label: master # 读取的分支 eureka: client: service-url: defaultZone: http://localhost:7001/eureka # 服务注册到的eureka地址
6.主启动类
package com.IT.springcloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.config.server.EnableConfigServer; @EnableConfigServer @SpringBootApplication public class ConfigCenterMain3344 { public static void main(String[] args) { SpringApplication.run(ConfigCenterMain3344.class, args); } }
7.在GitHub中的配置文件中加入(点击这个文件,然后点击笔形状的按钮进行编辑)
#config-dev.yml config: info: "master branch,springcloud-config/config-dev.yml version=1" #config-prod.yml config: info: "master branch,springcloud-config/config-prod.yml version=1" #config-test.yml config: info: "master branch,springcloud-config/config-test.yml version=1"
8.启动7001,3344,然后在浏览器输入:localhost:3344/master/config-dev.yml(成功获取到github上的配置文件内容)
config: info: master branch,springcloud-config/config-dev.yml version=1
Config客户端配置与测试
1.新建工程模块cloud-config-client-3355
2.pom文件
<dependencies> <!--区别:config server--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <!--eureka client(通过微服务名实现动态路由)--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </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>
3.bootstrap.yml
server: port: 3355 spring: application: name: config-client cloud: # config客户端配置 config: # 这三个综合:master分支上的config-dev.yml的配置文件被读取到 # http://config-3344.com:3344/master/config-dev.yml label: master # 分支名称 name: config # 配置文件名称 profile: dev # 读取后缀名称 uri: http://localhost:3344 # 配置中心地址 eureka: client: service-url: defaultZone: http://localhost:7001/eureka # 服务注册到的eureka地址
4.主启动类
@EnableEurekaClient @SpringBootApplication public class ConfigClientMain3355 { public static void main(String[] args) { SpringApplication.run(ConfigClientMain3355.class, args); } }
5.业务类
package com.IT.springcloud.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class ConfigClientController { @Value("${config.info}") // spring的@Value注解 private String configInfo; @GetMapping("/configInfo") public String getConfigInfo(){ return configInfo; } }
6.测试
启动7001,3344,3355
浏览器地址栏输入:localhost:3355/configInfo,拿到结果
master branch,springcloud-config/config-dev.yml version=1
动态刷新问题
- Linux运维修改Github上的配置文件内容,提交成为一个新的版本
- 刷新3344,发现ConfigServer配置中心立刻响应,版本更新
- 刷新3355,发现ConfigClient客户端没有任何响应,版本未更新
- 3355没有变化,除非自己重启或者重新加载
- 难道每次运维修改配置文件,客户端都需要重启吗??
如何解决动态刷新问题?
- 修改3355模块
- pom引入actuator监控
- 修改yml,暴露监控端口
- 加上注解@RefreshScope,业务类Controller修改
- 重启3355
- 关键一步:需要运维人员手动发送post请求,刷新3355
1.config客户端3355在pom中添加依赖(上面已经加了)
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
2.然后在bootstrap.yml中添加
server: port: 3355 spring: application: name: config-client cloud: # config客户端配置 config: # 这三个综合:master分支上的config-dev.yml的配置文件被读取到 # http://config-3344.com:3344/master/config-dev.yml label: master # 分支名称 name: config # 配置文件名称 profile: dev # 读取后缀名称 uri: http://localhost:3344 # 配置中心地址 eureka: client: service-url: defaultZone: http://localhost:7001/eureka # 服务注册到的eureka地址 # 暴露监控端点 management: endpoints: web: exposure: include: "*"
3.在ConfigClientController类上加上
@RefreshScope
注解4.重启3355
5.修改GitHub上文件的版本号(改为2),然后访问3344和3355
浏览器地址栏输入:localhost:3344/master/config-dev.yml
config: info: master branch,springcloud-config/config-dev.yml version=2
浏览器地址栏输入:localhost:3355/configInfo,还是没有更新
master branch,springcloud-config/config-dev.yml version=1
6.打开终端,输入
curl -X POST "http://localhost:3355/actuator/refresh"
7.刷新:localhost:3355/configInfo,返回结果
master branch,springcloud-config/config-dev.yml version=2