【SpringCloud】【Hoxton】Bus消息总线

01 基础环境准备
02 一文读懂Eureka
03 Zookeeper注册中心
04 Consule注册中心
05 Ribbon
06 OpenFegin
07 Hystrix全面解析
08 Gateway全面解析
09 Config配置中心
10 Bus消息总线

1 Spring Cloud Bus 简介

Spring cloud bus通过轻量消息代理连接各个分布的节点。这会用在广播状态的变化(例如配置变化)或者其他的消息指令。Spring bus的一个核心思想是通过分布式的启动器对spring boot应用进行扩展,也可以用来建立一个多个应用之间的通信频道。目前唯一实现的方式是用AMQP消息代理作为通道,同样特性的设置(有些取决于通道的设置)在更多通道的文档中。
大家可以将它理解为管理和传播所有分布式项目中的消息既可,其实本质是利用了MQ的广播机制在分布式的系统中传播消息,目前常用的有Kafka和RabbitMQ。利用bus的机制可以做很多的事情,其中配置中心客户端刷新就是典型的应用场景之一,我们用一张图来描述bus在配置中心使用的机制。

SpringCloud Bus 目前仅支持RabbitMQ 和 Kafka
【SpringCloud】【Hoxton】Bus消息总线_第1张图片(1) 提交代码触发post给客户端A发送bus/refresh。
(2) 客户端A接收到请求从Server端更新配置并且发送给Spring Cloud Bus。
(3) Spring Cloud bus接到消息并通知给其它客户端。
(4) 其它客户端接收到通知,请求Server端获取最新配置。
(5) 全部客户端均获取到最新的配置。

1.1 总线

在微服务架构的系统中,通常会使用轻量級的消息代理来构建一个共用的消息主题,并让系统中所有微服务实例都连接上来。由于该主题中产生的消息会被所有实例监听和消费。所以称它为消息总线。在总线上的各个实例都可以方便地广播些需要让具他连接在该主题上的实例都知道的消息。

2 Kafka环境准备

192.168.0.39  zookeeper kafka

2.1 Zookeeper安装略

【SpringCloud】【Hoxton】Bus消息总线_第2张图片

2.2 安装kafka

(1) 解压

tar -zxvf kafka_2.11-0.11.0.2.tgz
mv kafka_2.11-0.11.0.2 kafka

【SpringCloud】【Hoxton】Bus消息总线_第3张图片
(2) 修改配置文件

cd /usr/local/kafka/config
vim server.properties

listeners=PLAINTEXT://192.168.0.39:9092
host.name=192.168.0.39
port=9092

log.dirs=log.dirs=/usr/local/logs/kafka/kafka-logs

zookeeper.connect=192.168.0.39:2181

【SpringCloud】【Hoxton】Bus消息总线_第4张图片

在这里插入图片描述

【SpringCloud】【Hoxton】Bus消息总线_第5张图片
(3) 创建日志路径

mkdir -p /usr/local/logs/kafka

(4) 启动kafka

cd /usr/local/kafka
nohup  bin/kafka-server-start.sh config/server.properties  1>kafka.start.log 2>&1 &

(5) 查看
【SpringCloud】【Hoxton】Bus消息总线_第6张图片

3 创建客户端工程

【SpringCloud】【Hoxton】Bus消息总线_第7张图片
(1) pom

<dependencies>
    <!-- 配置客户端 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-config</artifactId>
    </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-starter-test</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    <dependency>
        <groupId>com.zrs.springcloud</groupId>
        <artifactId>commons</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
    </dependency>
</dependencies>

(2) bootstrap.yml

server:
  port: 9005
spring:
  application:
    name: config-client-slave
  cloud:
    # 配置拼接:http://localhost:9003/Config-enviroment-release-v1.0/config-dev
    config:
      #分支
      label: Config-enviroment-release-v1.0
      #配置文件名称
      name: config
      #读取后缀名称
      profile: dev
      #配置中心地址
      uri: http://localhost:9003
eureka:
  client:
    #是否将自己注册到EurekaServer
    register-with-eureka: true
    #是否从EurekaServer获取已有的注册服务
    fetch-registry: true
    #注册地址
    service-url:
      defaultZone: http://localhost:7000/eureka/
  instance:
    instance-id: config-client-slave
    prefer-ip-address: true
# 暴露监控端点
management:
  endpoints:
    web:
      exposure:
        include: "*"

(3) 主启动类


@SpringBootApplication
@EnableEurekaClient
public class ConfigSlaveClientApplication {
     
    public static void main(String[] args) {
     
        SpringApplication.run(ConfigSlaveClientApplication.class);
    }
}

(4) Controller

@RestController
@RefreshScope
public class ConfigClientRontroller {
     
    @Value("${config.info}")
    private String info;

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

    @GetMapping("/info")
    public String info(){
     
        return "server port:"+port+",info:"+info;
    }
}

(5) 修改cloud-config-client的Controller

@RestController
@RefreshScope
public class ConfigClientRontroller {
     
 
    @Value("${config.info}")
    private String info;
 
    @Value("${server.port}")
    private String port;
 
    @GetMapping("/info")
    public String info(){
     
        return "server port:"+port+",info:"+info;
    }
}

4 修改服务端通知所有客户端

4.1 服务端pom添加依赖

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

4.2 修改服务端application.yml

server:
  port: 9003
spring:
  application:
    name: config-center
  #配置kafka
  kafka:
    bootstrap-servers: 192.168.0.39:9092
    consumer:
      group-id: springcloud-bus
  cloud:
    config:
      server:
        git:
          #配置github
          uri: https://github.com/zhurongsheng666/spring-cloud-hoxton.git
          #配置搜索目录
          search-paths:
            - springcloud-config
      #配置分支
      label: Config-enviroment-release-v1.0
eureka:
  client:
    #是否将自己注册到EurekaServer
    register-with-eureka: true
    #是否从EurekaServer获取已有的注册服务
    fetch-registry: true
    #注册地址
    service-url:
      defaultZone: http://localhost:7000/eureka/
  instance:
    instance-id: config-center
    prefer-ip-address: true

#配置刷新
management:
  endpoints:
    web:
      exposure:
        include: 'bus-refresh'

4.3 在两个客户端pom里面添加配置文件

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

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

4.4 在两个客户端bootstrap.yml添加配置

#配置kafka
kafka:
  bootstrap-servers: 192.168.0.39:9092
  consumer:
    group-id: springcloud-bus

【SpringCloud】【Hoxton】Bus消息总线_第8张图片
4.5 启动Eureka、ConfigCenter、ConfigClient、ConfigClientSlave
【SpringCloud】【Hoxton】Bus消息总线_第9张图片

4.6 测试

【SpringCloud】【Hoxton】Bus消息总线_第10张图片

(1) 修改版本
【SpringCloud】【Hoxton】Bus消息总线_第11张图片

(2) 服务端
【SpringCloud】【Hoxton】Bus消息总线_第12张图片

(3) POST请求服务端

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

【SpringCloud】【Hoxton】Bus消息总线_第13张图片

【SpringCloud】【Hoxton】Bus消息总线_第14张图片

【SpringCloud】【Hoxton】Bus消息总线_第15张图片

【SpringCloud】【Hoxton】Bus消息总线_第16张图片

5 指定通知

curl -X POST "http://localhost:9003/actuator/bus-refresh/{destination}"

GITHUB

#分支 Bus-enviroment-release-v1.0
https://github.com/zhurongsheng666/spring-cloud-hoxton

你可能感兴趣的:(spring-cloud)