解决的问题
为解决配置文件改变后,项目需要重启的问题
使改变git中配置文件后,推送配置到相应项目,完成配置更新而不需要重启
架构
改造config的架构图,引入消息队列的使用(这里选择RabbitMQ)。
git配置文件改变后,通过调用bus-refresh捷库推送到config server,config server将配置文件发送给消息队列,服务监听消息队列拿到对应配置,拉取完成更新
集成
RabbitMQ的安装
前边说过docker与微服务的关系了,自此,docker开始正式使用。RabbitMQ便使用docker的方式进行安装。
docker安装很简单在这里就不写教程了。
docker输入
docker run -d --hostname my-rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management
docker的5672端口映射为本机5672
15672是管理界面的端口,浏览器通过 ip:15672访问
版本 rabbitmq:3-management 带有 -managemen是指有管理界面的mq
此时在浏览器输入 localhost:15672
账号密码均为 guest
mq就启动完成了
bus自动刷新集成
首先是config配置中心项目
pom引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
配置文件加入mq的配置
spring:
application:
name: config
cloud:
config:
server:
git:
uri:
username:
password:
rabbitmq:
host: your-mq-ip
port: 5672
username: guest
password: guest
host是docker启动mq的IP地址
启动config项目
此时mq的Queues菜单会如下图所示
有个springcloudbus的队列
order项目
此时为验证自动刷新,启动另一个项目order,同样注册eureka,基本配置保留
spring:
application:
name: order
cloud:
config:
profile: dev
discovery:
service-id: CONFIG
enabled: true
server:
port: 8081
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
其他的在git中新建order-dev.yml文件
spring:
application:
name: order
rabbitmq:
host:
port: 5672
username: guest
password: guest
env:
devtest
其中env是为了测试修改后是否成功的测试字段
pom引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
启动order项目
此时mq有两个队列
测试刷新
为了更加直观的测试配置文件是否拉取成功,新建一个EnvController文件,获取env的值
@RestController
@RequestMapping("/env")
@RefreshScope //此注解会实现配置文件的实时自动刷新,不写不会刷新
public class EnvController {
@Value("${env}") //${}读取配置文件的env字段
private String env;
@GetMapping("/print")
public String print() {
return env;
}
}
启动两个项目后,清空两个项目的控制台,测试是否拉取了配置
首先测试order的配置正确与否 输入 localhost:8080/order-dev.yml(我加了些其他配置,按上边的配置来)
此时浏览器输入 http://localhost:8081/env/print ,显示为
此时修改git中env由devtest改为test,保存后再次输入 http://localhost:8081/env/print
发现还是devtest并没有改变,控制台也还是空白
由最上边的架构图发现,需要访问bus-refresh接口才会推送更新,所以需要访问此接口
由于此接口访问方式为 POST,所以使用命令行的方式,打开电脑cmd窗口,输入
curl -v -X POST "http://localhost:8080/actuator/bus-refresh"
此时config控制台
order的控制台
此时访问 http://localhost:8081/env/print
Webhooks自动刷新
到此时仍然是要通过访问接口才能刷新配置,下面通过git的webhooks自动刷新配置,即git中配置文件更改后,项目自动接收配置并刷新。实际上webhooks指的就是文件改变时,他会自动访问一个我们指定接口,来完成刷新。
打开git,点击settings,点击webhooks菜单,Add webhook
点击后
其中Payload URL是项目的公网ip,使用localhost肯定是不行了,本机的IP地址也不行
可以使用一个内网穿透工具 https://natapp.cn/ ,可以注册一个免费的,只不过地址浮动,开一次变一个
就把自己的地址写上,并在之后加上 /monitor 就可以了,monitor即为git的bus-refresh
我的就是
http://fk7248.natappfree.cc/monitor
Conetent Type使用json
点击绿色的Add webhook即可
最后更改配置文件,加上
bus:
id: ${spring.application.name}:${spring.cloud.config.profile}:${random.value}
完整的配置文件
spring:
application:
name: order
cloud:
config:
profile: dev
discovery:
service-id: CONFIG
enabled: true
bus:
id: ${spring.application.name}:${spring.cloud.config.profile}:${random.value}
server:
port: 8081
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
如此既可以了