springcloud config 集成RabbitMQ 和 消息总线Bus 实现服务配置实时刷新
1.首先是RabbitMQ安装
下载链接:ELang(这个是RabbitMQ运行环境)
RabbitMQ
安装过程一路 next 即可
2.配置RabbitMQ客户端
进入rabbitMQ安装目录的sbin目录 启动cmd 运行以下命令
rabbitmq-plugins enable rabbitmq_management
等待执行完毕, 在 Windows开始菜单 找到rabbitMQ Server中的start
点击开启rabbitMQ服务
登录 http://localhost:15672
默认账号密码都是 guest
出现以下界面 说明成功开启
2. 流程
在这里代码演示的是 创建一个eureka服务注册中心 一个config服务配置中心 和 两个 获取服务配置信息的客户端,通过bus消息总线和rabbitMQ 实现两个客户端实时获取到配置服务中心的配置
3.创建git 仓库
在这里我们用 码云 来存放我们的配置文件
-
码云创建私有仓库
my-cloud-config
-
本地创建git同名仓库 与远程仓库建立关系
-
创建
config-dev.yml
config: spring-cloud-config-dev: version: 1
-
将本地仓库的
config-dev.yml
推送到码云仓库具体的这些Git操作不在赘述
4.创建eureka服务注册中心7001
pom(版本控制都在父项目中,springboot版本 2.2.2.RELEASE springcloud版本 Hoxton.SR1 其他的自行选择)
<dependencies>
<!--eureka-server-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<!--boot web actuator-->
<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>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
</dependencies>
yml
server:
port: 7001
eureka:
instance:
hostname: localhost #eureka服务端的实例名称
client:
register-with-eureka: false #false表示不向注册中心注册自己。
fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
service-url:
#设置与Eureka server 交互的地址查询服务和注册服务都需要依赖这个地址。
defaultZone: http://localhost:7001/eureka/ #单机版 指向自己
主启动类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
/**
* @author Xkuna
* @date 2020/7/22 15:32.
*/
@SpringBootApplication
@EnableEurekaServer
public class EurekaMain7001 {
public static void main(String[] args) {
SpringApplication.run(EurekaMain7001.class, args) ;
}
}
5.创建config服务配置中心3344
pom
<dependencies>
<!--添加消息总线RabbitMQ支持-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
<!--config-server-->
<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>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 #注册进Eureka服务器的微服务名
cloud:
config:
server:
git:
uri: https://gitee.com/xiaokuna/my-cloud-config.git #gitee上面的git仓库名字
####搜索目录
search-paths:
- my-cloud-config
username: username
password: password
####读取分支
label: master
#rabbitmq相关配置
#本地环境不需要配置mq,但是需要启动mq,Springboot会自动连接本地mq,后面客户端也是,如果是线上环境的话,必须要进行配
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
#服务注册到eureka地址
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka
##rabbitmq相关配置,暴露bus刷新配置的端点
management:
endpoints: #暴露bus刷新配置的端点
web:
exposure:
include: 'bus-refresh'
主启动类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
/**
* @author Xkuna
* @date 2020/8/12 10:39.
*/
@SpringBootApplication
@EnableEurekaClient
@EnableConfigServer//开启config服务配置中心
public class ConfigCenterMain3344 {
public static void main(String[] args) {
SpringApplication.run(ConfigCenterMain3344.class, args) ;
}
}
6.创建config服务配置客户端3355
6.1搭建项目基础
pom
注意服务配置中心的config依赖 和 服务配置客户端的config依赖的区别
<!--添加消息总线RabbitMQ支持-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
<!--config-client-->
<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>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
注意我们此时创建的yml名为 bootstrap.yml
server:
port: 3355
spring:
application:
name: config-client
cloud:
#Config客户端配置
config:
label: master #分支名称
name: config #配置文件名称
profile: dev #读取后缀名称 上述3个综合:master分支上config-dev.yml的配置文件被读取
# http://localhost:3344/master/config-dev.yml
uri: http://localhost:3344 #配置中心地址
#rabbitmq相关配置 15672是Web管理界面的端口;5672是MQ访问的端口
#本地环境不需要配置mq,但是需要启动mq,Springboot会自动连接本地mq,后面客户端也是,如果是线上环境的话,必须要进行配
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
#服务注册到eureka地址
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka
# 暴露监控端点
management:
endpoints:
web:
exposure:
include: "*"
主启动类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
/**
* @author Xkuna
* @date 2020/8/12 10:59.
*/
@SpringBootApplication
@EnableEurekaClient
public class ConfigClientMain3355 {
public static void main(String[] args) {
SpringApplication.run(ConfigClientMain3355.class, args) ;
}
}
6.2创建controller
注意需要添加@RefreshScope注解
仅对添加该注解的类中的yml配置生效
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author Xkuna
* @date 2020/8/12 11:05.
*/
@RestController
@RefreshScope
public class ConfigController {
@Value("${config.spring-cloud-config-dev.version}")
private Integer version ;
@GetMapping("/version")
public Integer getVersion() {
return this.version ;
}
}
7.创建config服务配置客户端3366
copy上面的 config服务配置客户端
修改所有 3355 为 3366 (主启动类名, yml配置中的端口)
8.测试
-
项目结构
-
启动
注意启动顺序
先启动eureka注册中心7001
再启动config服务配置中心3344
等3344启动完成后在启动config客户端 3355 3366否则可能会报错
最后启动 config服务配置客户端 3355 3366
-
测试配置是否成功
首先测试 3344 访问 http://localhost:3344/master/config-dev.yml
出现以下页面则表示配置成功
再测试3355 访问 http://localhost:3355/version 出现以下页面则配置成功
再测试3366 访问 http://localhost:3366/version 出现以下页面则配置成功
以上我们的config服务配置中心 和 客户端搭建完成了 并且实现了客户端获取配置
但是我们来修改下git仓库中 config-dev.yml的值
我们再依次访问
http://localhost:3344/master/config-dev.yml
http://localhost:3355/version
http://localhost:3366/version
发现 只有服务配置中心3344 获取到了我们更新的yml配置
而3355 3366客户端并没有,如果每次更新配置 都要重启客户端是不现实的,所以此时就用到了我们的消息中间件RabbitMQ,消息总线Bus
9.服务配置客户端 实现配置实时刷新
配置 我们已经在上面的项目搭建的过程中配置好了
包括 @RefreshScope注解 bootstrap.yml的创建和 bootstrap.yml中的rabbitMQ,management暴露接口的配置
只是 我们少了最后的临门一脚
只需要 给服务配置中心发送 刷新配置 的消息,即可传播给所有“订阅”此服务配置中心的客户端自行刷新获取配置
我们再postman中 发送post请求到 http://localhost:3344/actuator/bus-refresh 即可
如此我们再访问 http://localhost:3355/version,http://localhost:3366/version
发现 配置更新过来了 ????????
还有一个问题
如果我只想给个别的 客户端更新配置,该怎么做?
很简单, 我们可以发送post请求到 :http://localhost:{服务配置中心的端口}/actutor/bus-refresh/{更新配置的服务}
更新配置的服务 = 服务名称:端口号
比如我们单独 更新 3355客户端的配置
就可以发送 post请求到 http://localhost:3344/actuator/bus-refresh/config-client:3355 即可