首页 > 其他分享 >消息总线 —— SpringCloud Bus

消息总线 —— SpringCloud Bus

时间:2023-10-04 12:22:39浏览次数:32  
标签:SpringCloud 总线 Bus UserEvent 事件 Spring public

Bus 简介

Spring Cloud Bus 是 Spring Cloud 体系内的消息总线,支持 RabbitMQ 和 Kafka 两种消息中间件。所谓消息总线,简单理解就是一个消息中心,众多微服务实例都可以连接到总线上,实例可以往消息中心发送或接收信息,例如:实例 A 发送一条消息到总线上,总线上的实例 B 可以接收到信息(实例 B 订阅了实例 A),消息总线充当一个中间者的角色,使得实例 A 和实例 B 解耦


Spring Cloud Bus 实战

Spring Cloud Bus 可以将 Spring 事件机制和 Stream 结合在一起,具体机制如下:

  • 在需要发布或者监听事件的应用中增加 @RemoteApplicationEventScan 注解,通过该注解
    可以启动 Stream 中消息通道的绑定
  • 对于事件发布,需要承 ApplicationEvent 的扩展类 RemoteApplicationEvent,通过 ApplicationContext.publishEvent() 发布事件时,Spring Cloud Bus 会对所要发布的事件进行包装,形成消息,通过默认的 Spring Cloud Bus 消息通道发送到消息中间件
  • 对于事件监听者,则不需要进行任何变更,仍旧按照 Spring 的方式实现消息的监听i

安装并启动 ZooKeeper 和 Kafka,创建事件发布者项目,引入依赖

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

定义用户事件类 UserEvent,实现 RemoteApplicationEvent

@Data
@Slf4j
@EqualsAndHashCode(callSuper = true)
public class UserEvent extends RemoteApplicationEvent {

    public UserEvent(Object source, String originService, String destination) {
        super(source, originService, destination);
    }
}
  • originService:对于事件发布者来说 originService 就是自己
  • destinationService:将事件发布到哪些微服务实例,配置的格式为 {serviceld):{appContextId),在配置时 serviceld 和 appContextld 可以使用通配符,比如 userservice:** 会将事件发布给 userservice 微服务

发布消息代码如下

@Slf4j
@RestController
public class TestCon {

    @Autowired
    private ApplicationContextHolder holder;

    @GetMapping("/test/userEvent")
    public void userAdd() {
        User user = new User();
        user.setId("2");
        user.setName("tom");
        user.setAge(50);
        ApplicationContext ctx = ApplicationContextHolder.getApplicationContext();
        UserEvent event = new UserEvent(user, ctx.getId(), "*:**");
        ctx.publishEvent(event);
    }
}

在配置文件中添加如下配置:

spring:
  cloud:
    stream:
      default-binder: kafka
      kafka:
        binder:
          brokers: localhost:9092

在启动类添加 @RemoteApplicationEventScan 注解

@SpringBootApplication
@RemoteApplicationEventScan
public class Server01Application {

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

创建事件接收者项目,引入和事件发布者同样的依赖,将 UserEvent 类复制到该模块下,实现事件监听类UserEventListener

@Slf4j
@Component
public class UserEventListener implements ApplicationListener<UserEvent> {

    @Override
    public void onApplicationEvent(UserEvent event) {
        log.info("收到用户事件: {}", event);
    }
}

加上事件发布者同样的配置和启动类注解

启动两个项目,请求事件发布者的 /test/userEvent 接口,即可发布和接收事件

标签:SpringCloud,总线,Bus,UserEvent,事件,Spring,public
From: https://www.cnblogs.com/Yee-Q/p/17742128.html

相关文章

  • 「HRBUST1355」Leyni,罗莉和XianGe
    原题:http://222.180.160.110:1024/problem/30291考虑建图找最短路很容易想到以每个点作为结点,对同一行,同一列的点连边。但是这样建图边数最大能达到\(1e9\)很经典的操作就是对每一行,每一列,建一个虚点。每个点都连向其对应的行、列的虚点。这样的话,就比同一行(列)的点两两连边更......
  • $nextTick函数的用法以及全局事件总线
    全局事件总线的目的是可以实现任意组件之间的通信。这里需要涉及到原型链的知识。在Vue里面,我们知道运行一个完整的项目是由若干个VueComponents组件和一个AppVueComponent组件加上一个Vue的实例对象而vc组件在通过this去获取属性的值时,首先会从vc实例对象里面找,没有的话就去vc......
  • 什么是外企常说的 Line of Business
    LOB(LineofBusiness)是一个广泛应用于外企管理和组织中的术语,用于描述公司的不同业务部门或业务线。它代表了一个组织内部的区分,每个LOB通常专注于不同的产品、服务或市场,以满足特定的客户需求和市场机会。LOB的概念有助于组织更好地组织和管理其不同的业务活动,以实现更高的效率和......
  • 升级Lync Server 2013到Skype for Business 2019(一)
    写在前面从本章起,我们将介绍如何使用迁移升级的方式,将LyncServer2013升级至SkypeforBusines2019。由于案例来自于真实场景,所以其中包含了详细的可落地的升级步骤,以及真实环境配置。升级背景由于SkypeforBusiness2019将不再支持持久聊天服务器(PersistentChatServer),那么......
  • 熔断、限流、降级 —— SpringCloud Alibaba Sentinel
    Sentinel简介Sentinel是阿里中间件团队开源的,面向分布式服务架构的高可用流量防护组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性Sentinel提供了两个服务组件:Sentinel用来实现微服务系统中服务熔断......
  • SpringCloud微服务学习笔记(二)【Feign,Gateway,Docker】
    Feign先来看我们以前利用RestTemplate发起远程调用的代码:存在下面的问题:•代码可读性差,编程体验不统一•参数复杂URL难以维护Feign是一个声明式的http客户端,官方地址:https://github.com/OpenFeign/feign其作用就是帮助我们优雅的实现http请求的发送,解决上面提到的问题。基......
  • 声明式调用 —— SpringCloud OpenFeign
    Feign简介SpringCloudFeign是一个HTTP请求调用的轻量级框架,可以以Java接口注解的方式调用HTTP请求,而不用通过封装HTTP请求报文的方式直接调用Feign通过处理注解,将请求模板化,当实际调用的时候传入参数,根据参数再应用到请求上,进而转化成真正的请求第一个Feign程......
  • 企业服务总线
    企业服务总线(EnterpriseServiceBus,ESB)是由中间件技术实现并支持SOA的一组基础架构,支持异构环境中的服务、消息以及基于事件的交互,并且具有适当的服务级别和可管理性。通过使用ESB,可以在几乎不更改代码的情况下,以一种无缝的非侵入方式使企业已有的系统具有全新的服务接口,并能够......
  • SpringCloud
    目录Springcloud介绍注册中心(Eureka)背景注册中心案例总结负载均衡(Ribbon)测试使用负载均衡RibbonRibbon负载均衡流程Ribbon的IRule常见负载均衡策略Ribbon的使用方法远程调用(OpenFeign)Feign使用连接池注册中心(Nacos)测试配置集群命名空间Nacos非临时实例配置中心(Nacos)客......
  • springcloud gateway 获取响应体进行加密操作,byte[]转换String乱码
    记录一下困扰一星期的问题!在全局过滤器中,获取响应体进行加密操作,在拿到byte[]之后转成String,控制台打印出来是乱码,编码也加了UTF-8还是报错。publicMono<Void>filter(ServerWebExchangeexchange,GatewayFilterChainchain){ServerHttpResponseoriginalResponse=ex......