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

2022-05-09 12:41:47 浏览数 (1)

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

0 人点赞