首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

作为程序员,你可能不知道,Stream竟然还有应用进阶学习?

Stream应用进阶

在微服务架构下,细粒度服务之间更容易发生频繁的分布式集成与交互。

基于消息中间件的服务交互模式,或者建立以事件驱动为主导的架构模型,可以帮助业务建立和实现核心的领域事件驱动交互机制。

领域事件(Domain Event)的通信改变了领域对象的状态,比如订单创建事件、库存添加事件。

一个领域事件可以表达正在发生在一个领域对象上的行为。领域事件的发生伴随着修改的数据、时间戳、聚合ID及其他附加信息。在微服务架构下,领域事件以发布/订阅的模式,将事件发布到MQ中间件,允许多个不同微服务订阅事件并消费事件,这个事件可能是一个订单创建事件(OrderCreateEvent)或订单修改事件(CustomerModifyEvent)。

以上方式都遵循面向对象的方式,然而这些对象穿梭在生产者、分布式消息队列和消费者中,变成了共享类库,当众多微服务需要依赖共享类库时,就产生了高度的耦合。这种共享分布式对象实现远程调用是通过把共享对象打成jar包被不同微服务共享依赖的,也是分布式系统中的典型反模式,当一个领域事件被修改后,每个依赖的微服务都会受到影响。

使用SCS通过Spring Message的公共消息事件机制,可以支持事件驱动架构,同时避免依赖共享Domain对象类型。下面我们在SCS的一些元注解的基础上结合Spring的一些小特性实现类似CORS的EDA架构。

SpringCloudStream处理事件

SCS提供了@StreamListener注解来控制序列化的方式,它作为方法的入参并执行方法,例如:

新的事件分发特性在@StreamListener上增加了Condition属性来使消息路由到多个监听器成为可能,Condition的值是用SPEL表达式运算出来的一个boolean值。Condition应用到传入的消息上,能够计算任何消息载荷、特定的消息头或其组合。这提供了一种极其灵活的路由机制,且不需要不同的事件类型定义类。例如,我们定义一个带String eventType属性的Event类型,SCS将提供开箱即用的功能:

其中,Event类型的定义如下:

定制化事件注解

虽 然 可 以 使 用 通 用 的 Event 类 型 , 但 是 仍 然 需 要 通 过@StreamListener注解加入SEL Condition注解来过滤,使用起来比较麻烦。现在我们基于@StreamListener注解实现自定义事件注解,我们通过事件类型直接定位到我们的方法。自定义注解@EventHandler的定义如下:

通过@EventHandler的定义,我们可以把事件监听注解简化为如下形式:

这里,我们可以通过将Condition表达式转化为一个模板实现,重载 SCS 处 理 @StreamListener 注 解 的 BeanPostProcessor , 这 样 通 过eventType就可以实现识别事件的方法。重载的函数如下:

接下来,我们可以用自定义的@EnableEventHandling注解来引入这个configuration:

我 们 修 改 EventHandler 注 解 , 定 义 一 个 eventType 属 性 来 做Condition的别名:

然后,我们可以使用自定义的事件处理注解,只需要提供事件类型,就可以从消费者发送订阅事件:

微服务集成架构倾向于使用标准化的HTTP、基于REST API的架构交互模式进行集成。此外,考虑到性能也可以采用RPC的调用方式。对于异步交互过程,使用消息队列可以实现微服务之间的充分解耦和异构集成。

Spring Cloud提供了Spring Cloud Stream框架,它可以屏蔽底层通信技术细节,并且实现了基于消息的轻量级微服务集成解决方案。

还可用使用Spring Cloud Stream实现基于事件驱动和CQRS的系统架构。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20220511A06WTK00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券