springcloud学习-16 springcloud bus 消息总线【周阳springcloud2020学习笔记】

Spring Cloud Bus 是用来将分布式系统的节点与轻量级消息系统链接起来的框架,整合了java的事件处理机制和消息中间件功能。
目前支持RabbitMQ和Kafka两种消息代理。
能管理和传播分布式系统间的消息,就像是一个分布式执行器,可用于广播状态更改、事件推送等,也可以当做微服务间的通信通道。

1.分布式自动刷新配置功能
2.Spring Cloud Bus配合Spring Cloud Config使用可以实现配置的动态刷新
3.Bus支持两种消息代理:RabbitMQ和Kafka


rabbitMQ环境配置

1.下载安装erlang。(因为rabbitmq服务器是由erlang语言编写的,所以需要先安装erlang环境)
链接: https://pan.baidu.com/s/1aky1SZqcHuNkQBkMbQVCyA 提取码: j6qm
2.下载安装rabbitMQ。
https://dl.bintray.com/rabbitmq/all/rabbitmq-server/3.7.14/rabbitmq-server-3.7.14.exe
3.进入RabbitMQ安装目录下的sbin目录,输入以下命令启动管理功能
【E:\DevSoftWare\RabbitMQ Server\rabbitmq_server-3.7.14\sbin】
rabbitmq-plugins enable rabbitmq_management

4.可视化插件,rabbitMQservice - start 点击启动服务
访问地址查看是否安装成功:http://localhost:15672/
默认账号密码都是 guest


Bus动态刷新全局广播

一、在原有的基础上,增加3366(直接copy3355就行了)

1.新建module: config-client3366
2.pom

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>demo2020</artifactId>
        <groupId>cn.chen.demo</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>config-client3366</artifactId>

    <dependencies>
        <!-- spring cloud config -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>

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

        <!--公共模块-->
        <dependency>
            <groupId>cn.chen.demo</groupId>
            <artifactId>api-common</artifactId>
            <version>${project.version}</version>
        </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>
        <!-- lombok -->
        <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>

</project>

3.yml

server:
  port: 3366

spring:
  application:
    name: config-client
  cloud:
    config: # config客户端配置
      label: master # 分支名称
      name: config # 配置文件名称
      profile: dev # 读取后缀名称
      # 上述三个:master分支上的config-dev.yml的配置文件
      uri: http://config-3344.com:3344 # 配置中心地址
      #uri: http://localhost:3344 # 配置中心地址

eureka:
  client:
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka

management:
  endpoints:
    web:
      exposure:
        include: "*"

4.主启动

@SpringBootApplication
public class ConfigClientApplication3366 {

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

}

5.业务类

 @RestController
 @RefreshScope
 @RequestMapping("/configClient")
 public class ConfigClientController {

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

 	@Value("${config.info}")
 	private String configInfo;

 	@GetMapping("/info")
 	public String getConfigInfo(){
 		String result = "来自 " + port + " 端的配置信息:" + configInfo;
 		return result;
 	}

 }
3355也更改一下,方便看信息是来自哪个端的

二、设计思想
两种方式:
1.利用消息总线触发一个客户端/bus/refresh,从而刷新所有客户端的配置
2.利用消息总线触发一个服务端ConfigServer的/bus/refresh端点,而刷新所有客户端的配置(更加推荐)

第一种方式不适合的原因:
1.打破了微服务的职责单一性,因为微服务本身是业务模块,它本不应该承担配置刷新职责
2.破坏了微服务各节点的对等性
3.有一定的局限性。例如,微服务在迁移时,它的网络地址常常会发生变化,此时如果想要做到自动刷新,那就会增加更多的修改

三、给cloud-config-center-3344配置中心服务端添加消息总线支持
1.pom文件引入依赖

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

2.yml增加 ①rabbitmq配置(在spring下面) ②暴露端口

    #消息中间件rabbitmq
    rabbitmq:
      host: localhost
      port: 5672
      username: guest
      password: guest

#暴露端口
management:
  endpoints:
    web:
      exposure:
        include: 'bus-refresh'

四、给cloud-config-center-3355客户端添加消息总线支持
1.pom添加依赖

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

2.yml文件添加rabbitmq配置

    #消息中间件rabbitmq
    rabbitmq:
      host: localhost
      port: 5672
      username: guest
      password: guest

五、给cloud-config-center-3366客户端添加消息总线支持(同上)

六、测试啦啦啦
1.启动7001、3344、3355、3366
2.改github上配置文件
3.发送post请求:

curl -X POST "http://localhost:3344/actuator/bus-refresh"

一次发送,处处生效

4.访问
http://config-3344.com/config-dev.yml
http://localhost:3355/configClient/info
http://localhost:3366/configClient/info
总结:一次修改,广播通知,处处生效


SpringCloud Bus动态刷新定点通知:不需要全部通知,局部通知
1.公式:http://localhost:配置中心的端口号/actuator/bus-refresh/{destination}
server并通过destination参数类指定需要更新配置的服务或实例:服务名:端口号
2.只通知3355:

curl -X POST "http://localhost:3344/actuator/bus-refresh/config-client:3355"

springcloud学习系列目录

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章