• 基于A2DFramework的事件机制实现


    发布订阅 - 基于A2DFramework的事件机制实现

     

    SUMMARY

    • 能做什么
    • DEMO
    • 原理图
    • 应用场景

    能做什么

    A2DFramework的事件机制是基于发布订阅模式改进得来的一套API,中间件部分实现了msmq、redis、Supersocket可替换。能够实现较彻底的模块事件传递过程中的解耦,支持分布式环境。由于订阅端采用了消息队列作为转发层,因此也能支持事件量很大的场景。

    DEMO

    Demo工程下载地址(可右键保存):

    发布订阅Demo.rar 

    一、建立各个工程,并且加入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>server1private$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>\server1sharemsmq</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、生成报表数据等
    • 能保持前端轻,响应速度快

    • 模块解耦、面向模块编程

    自省推动进步,视野决定未来。
    心怀远大理想。
    为了家庭幸福而努力。
    A2D科技,服务社会。
    A2D Framework(Alpha)
    • 1. Cache System(本地缓存与分布式缓存共存、支持Memcache和Redis、支持贴标签形式(类似Spring 3.x的Cache形式))
    • 2. Event System(本地事件与分布式事件分发)
    • 3. IoC(自动匹配功能,实例数量限制功能)
    • 4. Sql Dispatcher System(支持ADO.NET及EF)
    • 5. Session System(分布式Session系统)
    • 6. 分布式Command Bus(MSMQ实现,解决4M限制,支持Session的读取)
    • 7. 规则引擎

    QQ群:283016070,真材实料的.NET架构师
     
  • 相关阅读:
    LCD
    数组转字符串,字符串转数组
    谷歌浏览器中安装JsonView扩展程序
    获取文件后缀名(zip,rar等)
    jquery图片懒加载效果
    ajax 上传文件,显示进度条,进度条100%,进度条隐藏,出现卡顿就隐藏进度条,显示正在加载,再显示上传完成
    localStorage使用总结
    同源策略、跨域解决方案
    原生js获取到页面上所有的checkbox
    input="file" 浏览时只显示指定excel文件,筛选特定文件类型
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3608892.html
Copyright © 2020-2023  润新知