当前位置:网站首页>Stream竟然还有应用进阶学习?作为程序员的你知道吗
Stream竟然还有应用进阶学习?作为程序员的你知道吗
2022-06-25 13:43:00 【Java爱好狂.】
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的系统架构。
本文给大家讲解的内容是MOM异步通信,Stream应用进阶
边栏推荐
- JVM uses tools to analyze classic cases of OOM
- Hash table, hash conflict
- Replace element - counter use of content (2)
- Shell built-in commands
- 【开源鸿蒙系统展示】RK3568开发板搭载OpenHarmony 3.1 Release
- Rust,程序員創業的最佳選擇?
- untiy强制刷新UI
- laravel8实现图片验证码
- Preventing overfitting of deep neural networks (mysteries of neural networks Part II)
- 深入理解深度神经网络背后的数学(Mysteries of Neural Networks Part I)
猜你喜欢

Data acquisition system gateway acquisition plant efficiency

sql导入这样怎么解决

What are the red lines of open source that should not be trodden on?

用NumPy实现神经网络(Mysteries of Neural Networks Part III)

英語中的九大詞性與九大時態

测一测你的挣钱能力有多强?未来的你将从事什么职业?

Openstack learning notes (I)

Classifier and cross entropy loss function
![[open source Hongmeng system display] the rk3568 development board is equipped with openharmony 3.1 release](/img/c4/0bfb380d38b5205a02a10175ee6888.png)
[open source Hongmeng system display] the rk3568 development board is equipped with openharmony 3.1 release

中国电池技术取得重大突破,日韩美都落后了,中国巩固了领先优势
随机推荐
Asp. Net webform exporting excel using npoi
【开源鸿蒙系统展示】RK3568开发板搭载OpenHarmony 3.1 Release
Windows下MySQL的安装和删除
作为一名软件测试工程师你认为怎么样才能保证软件质量?
历史上的今天:网易成立;首届消费电子展召开;世界上第一次网络直播
Logistic Regression VS Linear Regression
Network remote access using raspberry pie
JVM 用工具分析OOM经典案例
Mysql database compressed backup_ Summary of MySQL backup compression and database recovery methods
Discriminative v.s.Generative
Untiy force refresh UI
广发易淘金和同花顺哪个更好,更安全一些
Graph contractual learning with augmentations
VGA display of de2-115 FPGA development board
第一次读 “Clean” 系列,并没有觉得这是一本多好的书
NR-ARFCN和信道栅格、同步栅格和GSCN
解决报错:Creating window glfw ERROR: GLEW initalization error: Missing GL version
[open source Hongmeng system display] the rk3568 development board is equipped with openharmony 3.1 release
SSH secret free function for # scripting
Is it safe to open an account with tongdaxin stock?