◆ 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://www.toutiao.com/article/7093880049954259464/?log_from=1742314f90e49_1651885489530
“IT大咖说”欢迎广大技术人员投稿,投稿邮箱:aliang@itdks.com
来都来了,走啥走,留个言呗~
IT大咖说 | 关于版权
由“IT大咖说(ID:itdakashuo)”原创的文章,转载时请注明作者、出处及微信公众号。投稿、约稿、转载请加微信:ITDKS10(备注:投稿),茉莉小姐姐会及时与您联系!
感谢您对IT大咖说的热心支持!
- 相关推荐
- 推荐文章
- SecureCRT 9.2 和 SecureFX 9.2 正式版现已推出
- 跟xshell说再见,推荐免费的终端连接器WindTerm
- ICLR 2022 | 走向深度图神经网络:基于GNTK的优化视角
- 不会还有人不懂Stream源码吧?10年架构师带你一次性搞懂
- 2 万字详解,彻底讲透 Elasticsearch
- 一款 IDEA 插件帮你优雅转化 DTO、VO、BO、PO、DO
- 「开源」数据同步ETL工具,支持多数据源间的增、删、改数据同步
- 如何使用 SSHGUARD 阻止 SSH 暴力攻击
- 实时时间序列异常检测
- [开源]一套BS架构,支持PC、H5端的开源知识管理系统、知识库系统
- 后端开发常见层式结构设计:跳表、时间轮、LSM-Tree