SpringCloud Bus自动刷新配置

解决的问题

为解决配置文件改变后,项目需要重启的问题

使改变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/

如此既可以了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值