【转载】可复用的FS

有很多朋友要求给出一个应用ESFramework的Demo,在前面介绍ESFramework支持的4层架构中(回顾),有AS、FS、IRAS,其中FS的功能需求最简单,所以本文就给出一个FS实现示例。
    
    FS主要用于管理功能插件,并且将所有的功能性请求都转发给对应的功能插件处理,不需要关心用户(由AS管理)、不用关心具体的业务需求(由对应的功能插件处理),所以FS非常的单纯,基本上是与应用无关的,可以在任何应用中复用同一个FS。(但是AS和IRAS就很难复用了,因为不同的应用对AS、IRAS的需求的差别可能非常大)。

    实际上,FS的实现自己只包含4个cs文件,绝大多数组件都由ESFramework提供了。下面是FS项目中文件的结构图:

    其中,MainForm是主界面,FsConfiguration是FS的配置,下面马上会讲到的是FunctionServer这个FS中的核心类。

    我们已经知道,FS通过Tcp发布服务给AS使用,即AS通过与FS之间的Tcp连接池来使用FS提供的服务,所以会使用到ESFramework提供的ITcp组件。
    其次,FS需要管理所有的功能插件,所以它需要使用ESFramework提供的IAddinManagement组件。
    在理解了这两点的基础上,我们可以定义FunctionServer这个类了,它很简单,所有方法及实现如下所示:
        public void LoadAddins()
        {
            
string directory = System.IO.Directory.GetParent(System.Windows.Forms.Application.ExecutablePath).FullName ;
            
this.addinManagement.LoadAllAddins(directory ,true) ;
        }

        
public void Start()
        {
            
this.agileTcp.Start() ;
            
this.serverPerformanceMonitor.Start() ;
            
this.asRemotingServiceAccesser.FsStarted() ;
        }

        
public void Stop()
        {
            
this.agileTcp.Stop() ;
            
this.serverPerformanceMonitor.Stop() ;
            
this.asRemotingServiceAccesser.FsToExit() ;
        }

        
public void ReadyToExit()
        {
            
this.Stop() ;        
            
this.agileTcp.Dispose() ;                
        }
    
       各个方法的含义和成员变量的含义相信大家已经非常的明白了,由必要解释一下serverPerformanceMonitor,它用于监控本服务器的性能状态,并将性能数据通过事件发布。如果你读过前面的文章,你会知道,这些性能数据将被发送给AS,然后AS根据这些性能数据在多个FS上进行负载均衡调度。asRemotingServiceAccesser用于访问AS发布的远程服务,比如FS启动或退出时通知AS。

    FS核心的类FunctionServer就这些功能。你一定非常想知道,ITcp、ITcpStreamDispatcher等是如何与FunctionServer装配起来的,谜底马上揭晓。相对于使用4个cs文件就实现了FS来说,FS的组件装配就稍微复杂些(AS则更复杂)。我采用SPring.NET来完成组件装配。
    我们先看ITcp组件的装配:
        <object name="agileTcp" type="ESFramework.Network.Tcp.AgileTcp ,ESFramework" init-method="Initialize">
                
<property name="Port">
                    
<object type="Spring.Objects.Factory.Config.PropertyRetrievingFactoryObject ,Spring.Core">
                        
<property name="TargetObject" ref="fsConfiguration"/>
                        
<property name="TargetProperty" value="TcpPort"/>
                    
</object>
                
</property>    
                
<property name="MaxMessageSize" value="2000000"/>
                
<property name="Dispatcher" ref="tcpStreamDispatcher"/>
                
<property name="ContractHelper" ref="contractHelper"/>
                
<property name="BufferPool">
                    
<object type="ESFramework.Network.Tcp.SimpleBufferPool ,ESFramework"/>
                
</property>
           
</object>    

    如果你研究过AgileTcp组件,上面的配置非常容易理解,最主要的,AgileTcp使用的分派器组件,分配器组件的装配如下:
        <object name="tcpStreamDispatcher" type="ESFramework.Network.Tcp.TcpStreamDispatcher ,ESFramework">                
                
<property name="ContractHelper" ref="contractHelper"/>
                
<property name="TcpClientsController" ref="agileTcp"/>            
                
<property name="RequestDealerFactory">
                    
<object type="ESFramework.Network.FunAddinDealerFactory ,ESFramework">
                        
<property name="AddinManagement" ref="addinManagement"/>
                    
</object>
                
</property>    
           
</object>
    
    非常需要说明一点的是,消息分派器使用的处理器工厂是ESFramework.Network.FunAddinDealerFactory,因为它只需要处理功能请求,并且这些功能请求是由功能插件处理的,所以使用ESFramework.Network.FunAddinDealerFactory就可以了,而不需要使用功能全面的EsbRequestDealerFactory,EsbRequestDealerFactory通常由AS使用。

    最后一个重要组件的装配--FunctionServer:
            <object name="functionServer" type="FunctionServerSystem.Server.FunctionServer ,FunctionServerSystem">
                
<property name="AgileTcp" ref="agileTcp"/>        
                
<property name="AddinManagement" ref="addinManagement"/>
                
<property name="ServerPerformanceMonitor" ref="serverPerformanceMonitor"/>
                
<property name="AsRemotingServiceAccesser" ref="asRemotingServiceAccesser"/>
            
</object>

    毫无秘密可言!

    还有就是主界面MainForm的装配,就不罗列了,大家看源码就知道了。这是FS的一个例子,如果你需要看到客户端的例子,AgileIM的源码是一个选择,不过AgileIM稍微复杂了些,过段时间我会给出一个简单的建立在ESFramework上的客户端实现。
    下面是FS运行时的截图:


    下载FS源码 (VS2003)。
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/303082.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Git、GitHub、GitLab三者之间的联系以及区别

在讲区别以及联系之前先简要的介绍一下&#xff0c;这三者都是什么(本篇文章适合刚入门的新手&#xff0c;大佬请出门左转)1.什么是 Git?Git 是一个版本控制系统。版本控制是一种用于记录一个或多个文件内容变化&#xff0c;方便我们查阅特定版本修订情况的系统。以前在没有使…

zen服务器芯片,服务器版Zen处理器简直大杀器:32核64线程,8通道DDR4内存

拼 命 加 载 中 ...在这次的E3展会上&#xff0c;AMD除了公布RX 470/460显卡之外&#xff0c;还跟雷蛇发了一款支持VR的背包PC&#xff0c;使用了RX480显卡&#xff0c;处理器则是AMD的Zen&#xff0c;8核16线程&#xff0c;这还只是桌面版的&#xff0c;要知道Zen处理器最重要…

欢迎与我一起交流安全管理平台

近期&#xff0c;51CTO给我开了一个专题讨论区&#xff08;http://doctor.51cto.com/develop-241-1.html&#xff09;&#xff0c;为期一周&#xff0c;就安全管理平台这个领域的问题与大家交流分享。欢迎同好前往交流。在其中&#xff0c;我会分享仅代表我个人的一些体会和经验…

【赠书活动】优雅免费领书指南

快扶朕起来&#xff0c;我还要送书&#xff01;在上一期的赠书活动上结束后。超模君就吩咐小树包装好书籍&#xff0c;寄给获奖的模友们&#xff01;很多模友收到书籍都表示很不错&#xff0c;期望能再来一次赠书活动。这不&#xff0c;朕又想&#xff0c;超模君又想送书了&…

MySql 数据库基本设计规范

1、所有表必须使用Innodb存储引擎没有特殊要求&#xff08;即Innodb无法满足的功能如&#xff1a;列存储&#xff0c;存储空间数据等&#xff09;的情况下&#xff0c;所有表必须使用Innodb存储引擎&#xff08;mysql5.5之前默认使用Myisam&#xff0c;5.6以后默认的为Innodb&a…

ASA防火墙16 SSL/×××

1、ASA的基本配置&#xff1a;Archasa(config)# int e0/0 Archasa(config-if)# ip add 192.168.0.1 255.255.255.0 Archasa(config-if)# nameif outside Archasa(config)# int e0/1 Archasa(config-if)# ip add 172.20.59.10 255.255.255.0 Archasa(config-if)# nameif i…

利用11行Python代码,盗取了室友的U盘,内容十分刺激!

作者&#xff1a;Python新世界 來源&#xff1a;简书https://www.jianshu.com/p/3d7b2d9fe679序言那个猥琐的家伙整天把个U盘藏着当宝&#xff0c;都睡觉了就拿出来插到电脑上。我决定想个办法看他U盘里都藏了什么&#xff0c;直接去抢U盘是不可能的&#xff0c;骗也是…

如何查询服务器是否安装系统时间,如何查看系统当前的NTP配置?

我试过了&#xff1a;w32tm /query /status我有&#xff1a;The command /query is unknown.在另一台机器上&#xff0c;我得到&#xff1a;The following error occurred: The service has not been started. (0x80070426)然后我尝试了&#xff1a;reg QUERY [\\machine\]HKLM…

鸡肋还是革新——Blazor进WinForm

winform是一老技术&#xff0c;感觉都有点掉牙了&#xff08;我近20年前就是从winform开始接触.net的&#xff09;&#xff1b;blazor&#xff0c;是微软技术圈里的新宠&#xff0c;正在被悉心照顾。当这一老一少的技术碰撞后&#xff0c;会有什么火花&#xff1f;.net v6.0.0-…

一个女程序员征男友的需求说明书

前 言常听人说程序员的生活枯燥为人刻板&#xff0c;其实这是你不懂程序员。代码之外&#xff0c;生活之中&#xff0c;这些高智商人的幽默风趣&#xff0c;才华的展现往往能在「论坛」这个神奇的领域一窥究竟。&#xff08;悲哀&#xff0c;因为给他们展现Coder之外才华的地方…

Linux锁定和解锁用户

1、禁止个别用户登录。比如禁止lynn用户登录。 passwd -l test 这就话的意思是锁定test用户&#xff0c;这样该用户就不能登录了。 passwd -u test 对锁定的用户lynn进行解锁&#xff0c;用户可登录了。 2、我们通过修改/etc/passwd文件中用户登录的shell vi /etc/passwd test:…

查看服务器物理内存大小,如何看服务器的物理内存大小

如何看服务器的物理内存大小 内容精选换一换JVM在执行Java程序时会把它所管理的内存划分为若干个不同的运行时数据区域&#xff0c;主要包括&#xff1a;程序计数器、方法区、虚拟机栈、本地方法栈和堆&#xff1a;程序计数器可以看作时当前线程所执行的字节码的行号指示器。方…

通过Dapr实现一个简单的基于.net的微服务电商系统(四)——一步一步教你如何撸Dapr之订阅发布...

之前的章节我们介绍了如何通过dapr发起一个服务调用&#xff0c;相信看过前几章的小伙伴已经对dapr有一个基本的了解了&#xff0c;今天我们来聊一聊dapr的另外一个功能——订阅发布目录&#xff1a;一、通过Dapr实现一个简单的基于.net的微服务电商系统二、通过Dapr实现一个简…

值得收藏的Python小技巧:这17个骚操作你都OK吗?

导读&#xff1a;Python 是一门非常优美的语言&#xff0c;其简洁易用令人不得不感概人生苦短。在本文中&#xff0c;作者 Gautham Santhosh 带我们回顾了 17 个非常有用的 Python 技巧&#xff0c;例如查找、分割和合并列表等&#xff0c;这 17 个技巧都非常简单&#xff0c;但…

常用药

上火 众生丸白云山-板蓝根同仁堂-牛黄解毒丸星群-夏桑菊穿心莲片银黄颗粒发炎 罗红霉素阿莫西林头孢拉定止咳 咽立爽口含滴丸感冒 999感冒灵维C银翘片白加黑桑菊感冒片仁和可立克羚羊感冒片呕吐腹泻 &#xff08;加味&#xff09;藿香正气丸保济口服液转载于:https://www.cnblo…

等待十年,史上第一个 64 位版 Visual Studio 将于今夏公开首个预览版!

昨日&#xff0c;微软在其开发者博客宣布了一则重磅消息——Visual Studio 2022 首个预览版将于今年夏季发布 &#xff0c;并且终于成为万众期待的 64 位版&#xff01;要知道&#xff0c;早在 2011 年就有用户在 Visual Studio 的反馈建议网站提出&#xff0c;希望微软开发 64…

普通人和程序员看到的树

IT程序猿 微博网友评论&#xff1a;小苏打_sct&#xff1a;我家门前有两棵树&#xff0c;一棵是二叉树&#xff0c;另一棵也是二叉树( _ゝ&#xff40;)Christible_L&#xff1a;这不是多叉树吗 北辰找不着北&#xff1a;程序员都是从根看起的~ 洱海不语&#xff1a;先先总体到…

51CTO交流摘录(1):SOC的定义、适用性和组成

51CTO的安全管理平台交流已经结束了&#xff0c;有不少网友还是提出了一些比较好的问题&#xff0c;也帮我再次梳理一下对于安全管理平台的理解。这里我也跟大家分享一些交流的内容。 问题1&#xff1a;请问SOC是什么&#xff1f;什么样的安全运维管理平台更适合自己的企业&…

华为高性能服务器刀箱,云平台服务器刀箱

云平台服务器刀箱 内容精选换一换将外部镜像文件注册成云平台的私有镜像后&#xff0c;您可以使用该镜像创建新的云服务器&#xff0c;或对已有云服务器的系统进行重装和更换。本节介绍使用镜像创建云服务器的操作。您可以按照通过镜像创建云服务器中的操作指导创建弹性云服务器…

Magicodes.IE.AspNetCore之一行代码多格式导出

主要步骤1.安装包Install-Package Magicodes.IE.AspNetCore2.开始配置在Startup.cs的Configure()方法中,在UseRouting()中间件之后,注册如下中间件public void Configure(IApplicationBuilder app) {app.UseRouting();app.UseMagiCodesIE();app.UseEndpoints(endpoints >{en…