发布订阅 - 基于A2DFramework的事件机制实现
SUMMARY
- 能做什么
- DEMO
- 原理图
- 应用场景
能做什么
A2DFramework的事件机制是基于发布订阅模式改进得来的一套API,中间件部分实现了msmq、redis、Supersocket可替换。能够实现较彻底的模块事件传递过程中的解耦,支持分布式环境。由于订阅端采用了消息队列作为转发层,因此也能支持事件量很大的场景。
DEMO
Demo工程下载地址(可右键保存):
一、建立各个工程,并且加入A2DFramework.EventService的引用
二、给各个工程加入A2D基本代码,如下:
A2DFramework.Starter.Init();
A2DFramework.QueueService.Starter.Init();
A2DFramework.EventService.Starter.Init();
三、加入A2D.config文件以及相应的配置(事件机制用到了队列框架)
<?xml version="1.0" encoding="utf-8" ?> <A2D> <QueueSetting QueueType="MSMQ"><!--Redis--> <MSMQ><!-- 根据QueueType类型,此节点可省略 --> <AutoDeleteNetworkFile>true</AutoDeleteNetworkFile> <QueueConnectionStringFormat>server1\private$\A2D_订阅者2_{0}</QueueConnectionStringFormat> <NetworkLocation>msmq</NetworkLocation> <MaxQueueBodyLength>3670016</MaxQueueBodyLength> </MSMQ> <Redis><!-- 根据QueueType类型,此节点可省略 --> <ReadWriteServerIps>192.168.1.1</ReadWriteServerIps> <ReadOnlyServerIps>192.168.1.1</ReadOnlyServerIps> <MaxReadPoolSize>1000</MaxReadPoolSize> <MaxWritePoolSize>1000</MaxWritePoolSize> <QueueNameFormat>A2D_{0}1</QueueNameFormat> </Redis> </QueueSetting> <ShareFileSetting> <NetworkShareRoot>\\server1\share\msmq</NetworkShareRoot> </ShareFileSetting> <EventSetting EventBusType="Redis"><!--SuperSocket/Redis/Local--> <SuperSocket><!-- 可选 --> <Identifier>app server name 3</Identifier><!--客户端的名称,需要发往event server--> <Address>192.168.4.191</Address> <Port>2012</Port> <RetryConnectInterval>1000</RetryConnectInterval> </SuperSocket> <Redis><!-- 可选 --> <Identifier>app server name 1</Identifier> <ReadWriteServerIps>192.168.4.191</ReadWriteServerIps> <ReadOnlyServerIps>192.168.4.191</ReadOnlyServerIps> <MaxReadPoolSize>1000</MaxReadPoolSize> <MaxWritePoolSize>1000</MaxWritePoolSize> </Redis> <Local><!-- 可选 --> </Local> <EventMapping><!-- Event节点可以有多个 --> <Event Event="Events.OrderCreated" EventFullType="Events.OrderCreated, Events">订阅者2.OrderCreatedEventHandlerProcessor, 订阅者2</Event>
<!--
Event属性:事件Type全路径
EventFullType属性:事件Type全路径+dll名
节点value:关联的事件处理函数类+dll名
-->
</EventMapping> </EventSetting> </A2D>
四、定义事件(可自定义)
public class OrderCreated : IEvent //A2DFramework.EventService.IEvent { /// <summary> /// 新订单ID /// </summary> public Guid NewOrderID { get; set; } /// <summary> /// 下单时间 /// </summary> public DateTime OrderTime { get; set; } }
五、在订阅者中定义事件处理函数:
public class OrderCreatedEventHandlerProcessor : IProcessReceivedEventProcessorHandler<OrderCreated> { public void Process(OrderCreated evt) { Console.WriteLine("订阅者1 接收到了OrderCreated事件,NewOrderID: " + evt.NewOrderID); } }
六、运行效果图:
原理图
应用场景
- 将重载荷通过事件分发到专门处理的服务器来处理,比如生成pdf、生成报表数据等
- 能保持前端轻,响应速度快
- 模块解耦、面向模块编程
自省推动进步,视野决定未来。
心怀远大理想。
为了家庭幸福而努力。
商业合作请看此处:https://www.magicube.ai
心怀远大理想。
为了家庭幸福而努力。
商业合作请看此处:https://www.magicube.ai