bus学习笔记

bus 组件

bus是使用轻量级的消息代理,如rabbitMQ , Kafka 连接分布式系统的节点。这样就可以广播传播状态的更改或者其他管理指令。

两个重要的使用场景

配置变更通知

自定义消息广播

一、基于bus的配置中心改造

1.1 创建 config-bus-server

引入依赖

<dependencies>
    <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>

    <!--2020 后的版本默认禁用 bootstrap.yml配置文件,如要使用加上这个依赖-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-bootstrap</artifactId>
    </dependency>
    <!--bus组件-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-bus-amqp</artifactId>
    </dependency>

    <!--利用监控提供的端点来进行刷新-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>

</dependencies>

配置

application.yml

server:
  port: 8701

spring:
  application:
    name: config-bus-colony-server # 创建多个以保证高可用
  rabbitmq:
    host: 192.168.0.107
    port: 5672
    username: guest
    password: guest
  cloud:
    config:
      server:
        git:
          uri: https://gitee.com/zhoust123/config
          search-paths: spring.cloud.parent # 如果是在指定的文件夹下在这里指定,也可以模糊匹配ru: sprin*
          force-pull: true # 强制拉取资源文件
#          username:  # git上非公开的项目需要指定用户名密码
#          password: # git上非公开的项目需要指定用户名密码

eureka:
  instance:
    hostname: localhost
  client:
    register-with-eureka: true # 是否将自己注册到eureka上 不配置默认是true
    fetch-registry: true # 是否从eureka服务上拉取拉取 服务信息 不配置默认是true
    serviceUrl:
      defaultZone: http://localhost:7009/eureka # 注册到eureka服务上。

# 暴露actor 所有端点
management:
  security:
    enabled: false # 不需要权限认证
  endpoints:
    web:
      exposure:
        include: "*" # 所有的接口
  endpoint:
    health:
      show-details: always

bootstrap.yml

encrypt:
  key: 20051001 # 加密串

启动项

@SpringBootApplication
@EnableConfigServer
@EnableEurekaClient
public class ConfigBusServerApp {

    public static void main(String[] args) {
        SpringApplication.run(ConfigBusServerApp.class, args);
    }

}

1.2 启动 rabbitMQ

地址:RabbitMQ Management

1.3 创建config-bus-client

依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-config-client</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!--2020 后的版本默认禁用 bootstrap.yml配置文件,如要使用加上这个依赖-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-bootstrap</artifactId>
    </dependency>

    <!--利用监控提供的端点来进行刷新-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>

    <!--注册中心-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>

    <!--bus组件-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-bus-amqp</artifactId>
    </dependency>

</dependencies>

bootstrap.yml

server:
  port: 8602

spring:
  application:
    name: config-bus-colony-client
  rabbitmq:
    host: 192.168.0.107
    port: 5672
    username: guest
    password: guest
  cloud:
    stream:
      default-binder: rabbit # 如果项目中同时引入的有rabbit 也有Kafka,就需要指定默认的 binder
    config:
      name: config # git 上起的application名字,不填写默认 本项目名
      # uri: http://localhost:8600/ # 默认是 localhost:8888 在bootstrap.yml

      discovery:
        enabled: true
        service-id: config-bus-colony-server # 配合eureka使用,替换 uri

      profile: dev # git 上的 -profile
      label: master # 分支名

myKeyWord: ${keyword} # 测试从git拉取到本地赋值

management:
  security:
    enabled: false # 不需要权限认证
  endpoints:
    web:
      exposure:
        include: "*" # 所有的接口
  endpoint:
    health:
      show-details: always

eureka:
  client:
    register-with-eureka: true # 是否将自己注册到eureka上 不配置默认是true
    fetch-registry: true # 是否从eureka服务上拉取拉取 服务信息 不配置默认是true
    serviceUrl:
      defaultZone: http://localhost:7009/eureka # 注册到eureka服务上。

启动类

可以创建多个,以验证bus批量修改配置的功能。

@SpringBootApplication
@EnableEurekaClient
public class ConfigBusClientApp {

    public static void main(String[] args) {
        SpringApplication.run(ConfigBusClientApp.class, args);
    }

}

测试:

属性加密:http://localhost:8701/encrypt 放到row中 格式text

属性解密:http://localhost:8701/decrypt 同上

查看bus-server 所有端点 http://localhost:8701/actuator/

查找返回端点 发现 http://localhost:8701/actuator/busrefresh 即为批量刷新端点。http://localhost:8701/actuator/busrefresh/{*destinations} 为指定机器刷

开始测试

批量修改属性:

  1. 调用bus-client http://localhost:8702/speak 或者 http://localhost:8703/speak 获得speak属性。记录speak 属性为老属性。

  2. 修改git上 speak 属性 。

  3. 再次调用 bus-client获得speak属性,发现两台机器属性没变。

  4. 调用 bus-server 批量刷新属性:http://localhost:8701/actuator/busrefresh

  5. 再次调用 bus-client获得speak属性,发现两台机器属性已经改变成最新属性。

上述第4步,调用 bus-clien 的/actuator/busrefresh 端点同样可以刷新全部属性。

源代码地址:zhoust/spring_cloud_parent (gitee.com)