博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【转载】可复用的FS
阅读量:5950 次
发布时间:2019-06-19

本文共 3554 字,大约阅读时间需要 11 分钟。

有很多朋友要求给出一个应用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稍微复杂了些,过段时间我会给出一个简单的建立在ESFramework上的客户端实现。
    下面是FS运行时的截图:
     (VS2003)。
    

转载地址:http://yiixx.baihongyu.com/

你可能感兴趣的文章
org.apache.hadoop.hive.contrib.serde2.RegexSerDe not found
查看>>
citrix客户端的配置和访问(六)
查看>>
Linux下搭建Ionic框架
查看>>
移动支付的基本要素
查看>>
云计算:大数据时代的系统工程(二)
查看>>
Hadoop、Spark、HBase与Redis的适用性讨论(二):HBase
查看>>
常见的数据库连接池
查看>>
K8S使用Ceph RBD作为后端存储
查看>>
Centos yum的配置与使用
查看>>
Linux 文件内容查看工具介绍-cat,less,more,tail,head
查看>>
linux lsof 命令
查看>>
AD 总结
查看>>
在windows中将QString 转化为宽字节
查看>>
Jquery ajax异步提交
查看>>
MySQl的意外断电后无法启动
查看>>
如何防止表单重复提交
查看>>
真是因为忙才加班吗
查看>>
磁盘FAT型转NTFS
查看>>
多线程访问网页+高并发测试网站
查看>>
使用nlite制作集成驱动windows安装光盘及实践心得
查看>>