四、配置中心服务搭建(可选)
- 完整工程源码:https://gitee.com/forwardxiang/spring-cloud-demo.git
4.1 创建Git托管项目
-
无论选择哪个Git云服务,在创建仓库时为方便测试,一定要选择公开或开源,避免在拉取项目时要指定用户和密码。
-
仓库创建后新建配置文件billManager-dev.yml后的项目结构:
-
远程仓库中的yml配置文件命名规则:
- {application}-{profile}.yml 或 {application}-{profile}.properties
- application为应用名称,profile用于区分开发环境,测试环境、生产环境等
4.2 创建配置服务子工程
-
IDEA创建子工程同上,这里不再给出,只列出额外的pom依赖:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency>
-
启动类配置:
@SpringBootApplication @EnableEurekaClient @EnableConfigServer public class ConfigServerApplication { //省略 }
4.3 配置中心服务启动文件
-
yml配置文件里主要是声明Eureka服务端地址和配置远程Git库相关信息:
server: port: 12000 spring: application: name: config-server cloud: config: server: git: uri: https://gitee.com/forwardxiang/spring-config.git eureka: client: service-url: defaultZone: http://localhost:10086/eureka
4.4 业务微服务改造
- 有了配置中心,我们就可以每次启动时不从本地获取yml配置文件了,而是从Git远端仓库获取,那么就需要使用配置中心提供的微服务,另外需要通过配置告知配置中心需要提供什么样的远程配置文件给到自己。
4.4.1 业务微服务引入新依赖
-
为了能使用springCloudConfig相关功能,需要引入:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency>
4.4.2 业务微服务配置删除与新建
-
删除原有的application.yml配置文件,将这个文件内容放到Git远程仓库的:
-
新建bootsrap.yml配置文件,该文件较原来的application.yml之前加载:
spring: cloud: config: # 要与仓库中的配置文件的application保持一致 name: billManager # 要与仓库中的配置文件的profile保持一致 profile: dev # 要与仓库中的配置文件所属的版本(分支)一样 label: master discovery: enabled: true service-id: config-server eureka: client: service-url: defaultZone: http://localhost:10086/eureka
4.4.3 按顺序启动获取远程配置
- 先启动Eureka服务,再启动Spring Cloud Config服务,该服务会往Eureka服务里进行注册,以便其他需要通过Config服务进行配置的服务发现。
- 最后启动业务微服务,该服务启动后,根据该服务的bootsrap.yml配置文件,去Eureka找到Config服务,并把需求告知对方,让对方替自己从Git仓库拉取配置。
- 但是目前获取配置的方法只能是重启Config服务才能更新远程配置,并且要再启动业务服务,才能从Config服务里获取配置,显然不够友好,因此引入Spring Cloud Bus来实现配置的自动更新。
4.5 引入SpringCloudBus自动推送配置
4.5.1 消息队列RabbitMQ
- 根据不同的系统自己百度安装消息队列并启动该队列服务。
- 具体按照教程可以自行百度或Google,这里提供一下资源文件:
- 链接:https://pan.baidu.com/s/10rXvIKq28ZOUPfpReCRoGg
- 提取码:bzou
4.5.2 改造配置中心
-
引入spring-cloud-bus及消息队列新依赖:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-bus</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-stream-binder-rabbit</artifactId> </dependency>
-
在application.yml里新增与Bus服务和消息队列相关配置:
spring: rabbitmq: host: localhost port: 5672 username: guest password: guest management: endpoint: bus-refresh: enabled: true endpoints: web: exposure: # 暴露触发消息总线的地址-固定 include: bus-refresh
4.5.3 改造业务微服务
-
引入新依赖,除了bus与rabbit外,还需要actuator用于监听总线,以便得到更新配置的通知:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-bus</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-stream-binder-rabbit</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
-
在bootsrap.yml配置文件里配置消息对象相关信息:
spring: rabbitmq: host: localhost port: 5672 username: guest password: guest
-
在对外接口处配置一个@RefreshScope 在类上才可以实现对象属性的的动态更新:
//省略 @RefreshScope @RestController @RequestMapping("bill") public class BillController { //省略 }
4.5.4 测试自动更新配置
-
在业务微服务里新增一个接口用于读取远程yml配置文件中的变量:
@Value("${test.myTest}") private String myTest; @GetMapping("myTest") public ResultVO<String> getMyTest() { System.out.println("配置文件中的test.myTest为:" +myTest); return new ResultVO<>(myTest); }
-
在远程仓库配置文件中新增系统变量:
test: myTest: "修改前测试啊!"
-
依次启动配置微服务、业务微服务,并使用Postman访问myTest接口得到myTest的值:
-
在不重启任何服务的前提下,修改远程仓库yml配置文件中系统变量:
test: myTest: "修改后测试啊!"
-
使用Postman请求spring cloud bus总线服务,用于告知config服务中心重新拉取Git远程配置,并推送给需要刷新配置的各业务服务(通过Rabbit消息队列):
-
再次请求测试接口得到的返回值已经更改,证明了自动更新配置有效。