热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【转载】可复用的FS

有很多朋友要求给出一个应用ESFramework的Demo,在前面介绍ESFramework支持的4层架构中(回顾),有AS
有很多朋友要求给出一个应用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&#61;"agileTcp" type&#61;"ESFramework.Network.Tcp.AgileTcp ,ESFramework" init-method&#61;"Initialize">
                
<property name&#61;"Port">
                    
<object type&#61;"Spring.Objects.Factory.Config.PropertyRetrievingFactoryObject ,Spring.Core">
                        
<property name&#61;"TargetObject" ref&#61;"fsConfiguration"/>
                        
<property name&#61;"TargetProperty" value&#61;"TcpPort"/>
                    
object>
                
property>    
                
<property name&#61;"MaxMessageSize" value&#61;"2000000"/>
                
<property name&#61;"Dispatcher" ref&#61;"tcpStreamDispatcher"/>
                
<property name&#61;"ContractHelper" ref&#61;"contractHelper"/>
                
<property name&#61;"BufferPool">
                    
<object type&#61;"ESFramework.Network.Tcp.SimpleBufferPool ,ESFramework"/>
                
property>
           
object>    

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

    最后一个重要组件的装配&#xff0d;&#xff0d;FunctionServer&#xff1a;
            <object name&#61;"functionServer" type&#61;"FunctionServerSystem.Server.FunctionServer ,FunctionServerSystem">
                
<property name&#61;"AgileTcp" ref&#61;"agileTcp"/>        
                
<property name&#61;"AddinManagement" ref&#61;"addinManagement"/>
                
<property name&#61;"ServerPerformanceMonitor" ref&#61;"serverPerformanceMonitor"/>
                
<property name&#61;"AsRemotingServiceAccesser" ref&#61;"asRemotingServiceAccesser"/>
            
object>

    毫无秘密可言&#xff01;

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


    下载FS源码 &#xff08;VS2003&#xff09;。
    

转:https://www.cnblogs.com/fx2008/archive/2011/11/25/2263470.html



推荐阅读
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • Spring学习(4):Spring管理对象之间的关联关系
    本文是关于Spring学习的第四篇文章,讲述了Spring框架中管理对象之间的关联关系。文章介绍了MessageService类和MessagePrinter类的实现,并解释了它们之间的关联关系。通过学习本文,读者可以了解Spring框架中对象之间的关联关系的概念和实现方式。 ... [详细]
  • 服务网关与流量网关
    一、为什么需要服务网关1、什么是服务网关传统的单体架构中只需要开放一个服务给客户端调用,但是微服务架构中是将一个系统拆分成多个微服务,如果没有网关& ... [详细]
  • 在单位的一台4cpu的服务器上部署了esxserver,挂载了6个虚拟机,目前运行正常。在安装部署过程中,得到了cnvz.net论坛精华区 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了SpringCloudRibbon部分源码相关的知识,希望对你有一定的参考价值。1:ribbon是提供通过servi ... [详细]
  • 什么是网关服务器初学linux服务器开发时,我们的服务器是很简单的,只需要一个程序完成与客户端的连接,接收客户端数据,数据处理,向客户端发送数据。但是在处理量很大的情况下,一 ... [详细]
  • 朱晔的互联网架构实践心得S1E7:三十种架构设计模式(上)【下载本文PDF进行阅读】设计模式是前人通过大量的实践总结出来的一些经验总结和最佳实践。在经过多年的软件开发实践之后,回过头 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文讨论了在Spring 3.1中,数据源未能自动连接到@Configuration类的错误原因,并提供了解决方法。作者发现了错误的原因,并在代码中手动定义了PersistenceAnnotationBeanPostProcessor。作者删除了该定义后,问题得到解决。此外,作者还指出了默认的PersistenceAnnotationBeanPostProcessor的注册方式,并提供了自定义该bean定义的方法。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • LVS-DR直接路由实现负载均衡示例
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 域名解析系统DNS
    文章目录前言一、域名系统概述二、因特网的域名结构三、域名服务器1.根域名服务器2.顶级域名服务器(TLD,top-leveldomain)3.权威(Authoritative)域名 ... [详细]
author-avatar
縌风而行2010
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有