【转载】可复用的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;我还要送书&#xff01;在上一期的赠书活动上结束后。超模君就吩咐小树包装好书籍&#xff0c;寄给获奖的模友们&#xff01;很多模友收到书籍都表示很不错&#xff0c;期望能再来一次赠书活动。这不&#xff0c;朕又想&#xff0c;超模君又想送书了&…

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

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

鸡肋还是革新——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之外才华的地方…

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

如何看服务器的物理内存大小 内容精选换一换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;但…

等待十年,史上第一个 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;先先总体到…

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

云平台服务器刀箱 内容精选换一换将外部镜像文件注册成云平台的私有镜像后&#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…

想不到吧,这些都能用R!

R作为一种统计分析软件&#xff0c;广泛应用于生物、医学、电商、新闻等数据相关行业&#xff0c;是目前主流数据应用软件之一。那么&#xff0c;R到底有哪些特别之处呢?实际上&#xff0c;R是统计领域广泛使用的S语言的一个分支&#xff0c;两者在程序语法上几乎一样&#xf…

ssd windows未能启动服务器,ssd安装win10无法启动你安装方法对吗?来看一下

固态硬盘虽然价格偏高&#xff0c;但是读写速度快&#xff0c;很多人只追求速度&#xff0c;纷纷买了全新固态硬盘安装系统&#xff0c;现在最新的系统是win10&#xff0c;如果在uefi电脑上用固态硬盘安装win10&#xff0c;那么速度将有质的提升&#xff0c;那么全新固态硬盘怎…

一名IT经理是如何把项目带崩的。。。

我是一名项目经理&#xff0c;在过去的四个月里&#xff0c;我把一个项目带崩了&#xff08;上线后频出问题&#xff0c;用户无法使用&#xff09;。在最近的几天&#xff0c;我每天都在反思自己&#xff0c;我都在问自己以下几个问题&#xff1a;1.我做错了什么&#xff1f;2.…

C# 线程池ThreadPool用法简介

前言&#xff1a;自从task出现后&#xff0c;threadpool地位直线下降&#xff0c;但是一些老的程序员用惯了threadpool&#xff0c;我们在继承开发的时候也会时常看到这个用法&#xff0c;所以我们也很有必要熟悉认识它。什么是线程池&#xff1f;为什么要用线程池&#xff1f;…

10分钟采集凡客最新的省、市、区、邮政编码和电话区号(附源码)

最近的开发的项目需要用到省、市、区数据&#xff0c;因为要开发的项目也是电子商务网站&#xff0c;在参考凡客的用户体验时&#xff0c;发现它连深圳最新分离出来的光明新区都有了&#xff0c;拍拍网都没有更新数据&#xff0c;看来凡客在数据更新方面还是挺负责的&#xff0…

刘强东在美国出事了,老老实实的IT男,真的是有钱就变坏吗?

9月2日&#xff0c;网络上流传京东集团创始人刘强东在美国明尼苏达州&#xff0c;涉嫌性侵女大学生&#xff0c;目前已经被保释的消息。刘强东的相关信息&#xff0c;是可以直接在明尼苏达州Hennepin郡治安官办公室的监狱名单上查到的。上图中&#xff0c;可以看到指控描述为cr…

记一次 .NET游戏站程序的 CPU 爆高分析

一&#xff1a;背景 1. 讲故事上个月有个老朋友找到我&#xff0c;说他的站点晚高峰 CPU 会突然爆高&#xff0c;发了两份 dump 文件过来&#xff0c;如下图&#xff1a;又是经典的 CPU 爆高问题&#xff0c;到目前为止&#xff0c;对这种我还是有一些经验可循的。抓 2-3 个 du…