说明:本文只是讲解SpringCloud Config 基本使用与Bus实现刷新通知,并不涉及到生产环境mysql,redis等配置的真实案例,准备在讲解Apollo配置中心的时候再来实现mysql,redis等配置的动态刷新。
文章目录
1.环境说明
我们这里还将继续使用篇文章的环境,可以到我的GitHub上面拉取一份环境使用:演示环境源码链接 ,当然也可以自己从头搭建一套,本篇文章涉及服务讲解:
spring-cloud-parent(父工程,主要是管理了springcloud版本Greenwich.RELEASE与一些公共依赖)
—spring-cloud-eureka-server (Eureka server 集群分别9090与9091两个节点)
—spring-cloud-user-service-consumer (用户服务,用来从配置中心拉取配置测试,启用8080 节点)
—spring-cloud-config-server (配置中心server端 9060一个节点)
2. 简单使用
接下来我们实现这样一个架构
2.1 配置中心server端
我们首先要在父工程的基础上新建一个module,然后在做下面的一些步骤
2.1.1 创建存放配置文件的git仓库
我这里是在github上面直接创建了一个私有仓库,如果嫌github 访问速度慢的也可以在gitlab这种私服或者gitee码云上面创建,这些都是一样的。
然后在仓库里面创建文件
我这里的配置文件命名是这个样子的:
{服务名}-{环境}.yml
例如:spring-cloud-user-service-consumer-dev.yml
然后在这个文件里面放了个mysql连接信息配置:
mysql:
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://192.168.3.36:3306/driver_db?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true
username: root
password: 123456
这里演示阶段,你随便放就可以了。
2.1.2 pom
这里需要添加Eureka Client 依赖 ,与config server 的依赖,同时如果父工程没有这个Springboot actuator 依赖的需要添加到父工程中
<!--eureka client 客户端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--springcloud config server端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
2.1.3 配置文件application.yml
这里我们需要配置一些常规配置,Eureka 配置,Spring Cloud Config 配置还有健康检查的配置
server:
port: 9060
spring:
application:
name: spring-cloud-config-server
### spring cloud config 配置
cloud:
config:
server:
git:
# 这个就是你放配置文件的git仓库地址
uri: https://github.com/xuzhaocai/spring-cloud-config-study-repo.git
# git 用户
username: xxxx
# git 密码
password: xxxx
#这个就是你仓库名字
search-paths:
- spring-cloud-config-study-repo
label: master
### 配置eureka
eureka:
client:
service-url:
defaultZone: http://EurekaServerA:9090/eureka,http://EurekaServerB:9091/eureka
fetch-registry: true
register-with-eureka: true
instance:
prefer-ip-address: true # 使用ip注册
#自定义实例显示格式,添加版本号
instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}:@project.version@
# springboot 暴露端点健康
management:
endpoints:
web:
exposure:
exclude: "*"
# 暴露健康细节
endpoint:
health:
show-details: always
2.1.4 主启动类
在主启动类上面添加 服务注册与发现注解与 config server 注解表示开启这两个功能
2.1.5 启动测试
首先要启动下Eureka Server 集群,然后再启动这个config server项目
在浏览器或者是postman 请求地址:http://127.0.0.1:9060/spring-cloud-user-service-consumer-dev.yml
就是这个服务地址端口+ 配置文件的名字
可以得到你请求配置文件里面的信息就ok了
2.2 用户服务
这里这个用户服务 就是一个可以拉取配置信息,然后能够可视化这些信息就可以了。
我这里是直接拿着有的服务进行改造的。
2.2.1 pom
需要在pom 文件中添加config client的依赖
<!--spring cloud config 客户端依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-client</artifactId>
</dependency>
2.2.2 新建配置文件
新建配置文件bootstrap.yml,然后将关于配置中心的信息扔进去
因为bootstrap.yml 配置文件是系统级别的,然后优先级高于application.yml,应用启动时会检查这个配置文件,在这个 配置文件中指定配置中心的服务地址,会自动拉取所有应用配置并且启用。
这里你也可以将原来的application.xml 改成bootstrap.yml 。
spring:
cloud:
config:
# 配置文件的名字
name: spring-cloud-user-service-consumer
# 配置文件后缀,主要是用来区分环境版本
profile: dev
# 分支
label: master
# spring cloud config server的地址 可以配置多个
uri: ["http://127.0.0.1:9060"]
2.2.3 写一个测试的controller
我这里写了一个ConfigPullController 然后用来将配置中心里面的信息打印出来。
@RestController
@RequestMapping("/config")
public class ConfigPullController {
@Value("${mysql.jdbc-url}")
private String jdbcUrl;
@Value("${mysql.username}")
private String username;
@Value("${mysql.password}")
private String password;
@RequestMapping("/pullMysqlInof")
public String pullMysqlInfo(){
return "mysql-connect-info:[\"jdbc-url\":"+jdbcUrl+",\"username\":"+username+",\"password\":+"+password+"]";
}
}
2.3 启动服务测试
启动用户服务之前保证Eureka server 集群启动着,config server 启动着,然后在启动用户服务
在浏览器或者postman 请求http://127.0.0.1:8080/config/pullMysqlInof
可以看到我们将这个配置中心里面的配置拿到了
2.4 手动刷新
2.4.1 修改
这里手动刷新是,我们修改git里面的配置文件,然后config server 是能够自动获取到最新的,我们客户端,在这里也就是用户服务需要手动请求刷新才能获取到最新的服务。
这里用户服务需要添加 springboot actuator 依赖,这里我父工程是添加了的。
然后配置暴露端点
暴露全部:
# 配置springboot中暴露健康检查等断点接口
management:
endpoints:
web:
exposure:
include: "*"
# 暴露健康接口的细节
endpoint:
health:
show-details: always
当然也可以只暴露/refresh
management:
endpoints:
web:
exposure:
include: refresh
最后在这个使用到这些配置的类上面添加@RefreshScope 注解
重启用户服务
2.4.2 测试
我们修改一下这个git里面的配置,我这里修改了一下密码
我们这里请求一下用户获取配置的接口,发现还是原来的配置信息:
接着请求一下刷新配置接口:http://127.0.0.1:8080/actuator/refresh
我们再来请求一下用户获取配置的接口,我们可以看到,password 这个配置变了
这种手动更新虽然不用我们重启服务,不用停机,但是还是比较恶心人的,你更新了git里面的配置信息,需要对每个服务手动请求下/refresh 才能够刷新,对于服务少的项目可能会接受,但是对于服务量巨大的项目带来的却是工作量。下面我们会介绍Config配置中心 结合Spring Cloud Bus消息总线的方式来实现自动刷新。
2.5 自动刷新
在这里我们将配合Spring Cloud Bus 消息总线实现一次通知,处处刷新的效果。
2.5.1 关于消息总线
关于Spring Cloud Bus 消息总线 我们可以这样理解,消息总线像是村里的大喇叭,村委在喊话的时候这个大喇叭覆盖下的村民全都能听到,但是至于村民怎么做就是另一回事了,这个我们不讨论,消息总线就是这个大喇叭,而村民就是各个服务,一旦这个消息总线下发通知,这些订阅了消息总线中某个主题的服务就会收到通知,从而作出某些改变。
2.5.2 消息总线自动刷新流程说明
我们这里的自动更新也是需要手动通知一次,然后订阅这个消息总线的服务都会收到通知而进行更新操作。
这个流程信息如下图:
我们这些业务服务启动的时候,首先去配置中心server拉取配置信息,并向bus订阅,然后git仓库里面的配置文件发生改变的时候,通过手动触发更新,消息总线就会向所有订阅的业务服务发起通知,通知他们配置文件改了,那些带有@RefreshScope注解的类就会更新配置的值。
2.5.3 改造
这里配置中心server 也就是spring-cloud-config-server这个服务,首先我们要先选择mq消息中间件产品,这里将使用rabbitmq,对于rabbitmq不会安装的同学可以参考下面这篇文章安装:《RabbitMQ安装》
***下面修改操作不管是config server 还是 client端都需要做 ***
- pom中添加springcloud bus支持rabbitmq的依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
- 添加rabbitmq的配置
spring:
rabbitmq:
# rabbitmq 的ip
host: 127.0.0.1
# 端口
port: 5672
# 用户名与密码 默认是guest
username: guest
password: guest
- 检查 服务健康检查端口暴露 配置
# 配置springboot中暴露健康检查等断点接口
management:
endpoints:
web:
exposure:
# 这里你可以暴露全部,也可以只暴露 bus-refresh
include: "*"
# 暴露健康接口的细节
endpoint:
health:
show-details: always
2.5.4 测试
重启config server 与用户服务,这里用户服务我们起两个分别是8080 与8081
我们先来看看启动后的配置:
用户服务拿到的配置信息:
这时候,我们修改git仓库里面的配置信息:
对任意一个用户服务(配置中心client端)发起刷新请求(post请求):http://127.0.0.1:8080/actuator/bus-refresh/
我们再来看看8080 与8081 的配置信息:
可以看出来,配置信息都发生了变更。
当然我们可以指定某个服务进行刷新动作,来实现定向更新,这时候我们只需要在刷新的链接后面添加服务名+端口
例如:http://127.0.0.1:8080/actuator/bus-refresh/spring-cloud-user-service-consumer:8080