Spring Cloud Bus的消息发布与订阅

原创阿虎
发布于:2021-04-28 
标签: 

介绍

Spring Cloud Bus 对自己的定位是 Spring Cloud 体系内的消息总线,他是基于Spring Cloud Stream进一步的封装,结合Spring Context自身事件机制,来快速简单地完成分布式集群中服务的业务事件定义、业务消息的发送与订阅流程

https://docs.spring.io/spring-cloud-bus/docs/current/reference/html/
干货| Spring Cloud Stream 体系及原理介绍 https://mp.weixin.qq.com/s/e_pDTFmFcSqHH-uSIzNmMg
干货|Spring Cloud Bus 消息总线介绍 https://mp.weixin.qq.com/s/QwIaK6LMlKyTzMKrbAEDcw
https://www.cnblogs.com/bluersw/p/11643166.html

使用场景

示例工程结构

├── spring-cloud-bus-demo
│   ├── pom.xml
│   ├── `spring-cloud-bus-demo-api`   //公共消息实体和事件定义
│   │   ├── pom.xml
│   │   └── src
│   ├── `spring-cloud-bus-demo-publish`  //消息发布服务
│   │   ├── pom.xml
│   │   └── src
│   ├── `spring-cloud-bus-demo-subscribe` //消息订阅服务
│   │   ├── pom.xml
│   │   └── src

file

1. 依赖

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

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

2. 定义事件

3. 监听事件

    @EventListener
    public void onUserRemoteApplicationEvent(RouteRemoteApplicationEvent event) {

        log.info("UserRemoteApplicationEvent:{}, Source:{}, destinationService: {}",event.getSource(),
                event.getOriginService(),
                event.getDestinationService());

        log.info("user: {}", JSONObject.toJSONString(event.getSource()));
    }

4. 发送事件

    @GetMapping("/sendMessage")
    @ApiOperation(value = "发送", notes = "发送")
    public String list(@RequestParam("message") String message) {
        RouteInfo routeInfo = new RouteInfo().setServiceId("app-one-service").setStatus(1).setUri("/one/add").setUri("lb:app-one-service");
        RouteRemoteApplicationEvent event = new RouteRemoteApplicationEvent(routeInfo, busProperties.getId(), ()->"**");
        eventPublisher.publishEvent(event);
        return message;
    }