目录

Life in Flow

知不知,尚矣;不知知,病矣。
不知不知,殆矣。

X

Bus

Bus 简介

 Spring Cloud Bus(消息总线)通过一个轻量级的消息中间件可以连接分布式系统中的各个节点。可以使用该总线来广播某些状态的改变(比如配置信息发生变更)或其他管理指令,以下是 Bus 适用的场景:

  • 一个事件,需要广播或者单独传递给某个接口。
  • 配置更新了,但是其他系统不知道是否更新。

 SpringCloud 默认使用 RabbitMQ 作为消息队列组件。

分布式配置中心 Config 结合 Bus

流程图

部署 MQ 服务

这里基于 Docker 部署 RabbitMQ

docker pull rabbitmq:management	#拉取镜像
docker run -d --hostname rabbit-host --name="myrabbitmq" -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -p 5672:5672 -p 15672:15672 rabbitmq:3-management

访问控制台
http://192.168.31.210:15672/

config-client 配置

引入依赖

<!--配置中心结合消息队列-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
        </dependency>

RabbitMQ 连接配置,并且暴露接口(这样 GitHub 才能通过 Hook 去出发 config client 去主动更新最新的配置)

spring: #服务的名称
  rabbitmq:
    host: 192.168.31.210
    port: 5672
    username: admin
    password: admin
#暴露全部的监控信息
management:
  endpoints:
    web:
      exposure:
        include: "*"

验证环节
 在 product-server 项目调用方法中引入配置文件的 env 属性,并在方法上添加注解@RefreshScope

@RestController
@RequestMapping("/api/v1/product")
public class ProductController {

    @Value("${server.port}")
    private String port;

    @Value("${env}")
    private String env;

    @Autowired
    private ProductService productService;

    /**
     * 根据id查找商品详情
     * @param id
     * @return
     */
    @RequestMapping("find")
    public Object findById(int id){

        Product product = productService.findById(id);

        Product result = new Product();
        BeanUtils.copyProperties(product,result);
        result.setName( result.getName() + " data from port="+port + " env ="+env);
        return result;
    }
}

在 GitHub 中修改配置文件,将其中的 env 的值改为 test2

server:
  port: 8772

env: test2
branch: master

此时访问 config server(已同步)

branch: master
env: test2
server:
  port: 8772

此时 config client (env 依然为 test,未同步)
http://localhost:8772/product-service-test.yaml

{
  "id": 2,
  "name": "冰箱 data from port=8772 evn =test",
  "price": 5342,
  "store": 19
}

手动触发 config client 暴露的接口(GitHub 等可以设置自动触发 config client 的接口)
 需要以 POST 的方式进行访问:http://192.168.31.230:8772/actuator/bus-refresh
![手动触发](https://abc1024.oss-cn-shanghai.aliyuncs.com/Picture/SpringCloud/Post % E6%96% B9% E5% BC %8F % E8% A7% A6% E5%8F %91config %20client % E6%9A % B4% E9%9C % B2% E6%8E % A5% E5%8F % A3.png
)

再次观察 config client (已经同步,env 变为最新的 test2)

{
  "id": 2,
  "name": "冰箱 data from port=8772 evn =test2",
  "price": 5342,
  "store": 19
}```

作者:Soulboy