zoukankan      html  css  js  c++  java
  • ESPlatform 群集平台迁移到群集平台

      在ESFramework 开发手册(00) -- 概述中,我们提到过ESFramework的一个优势:仅仅通过修改几行代码或配置就可以将一个基于ESFramework的应用程序平滑迁入到ESPlatform平台中。现在,是到了兑现这一承诺的时候了。将单AS的ESFramework应用迁移到ESPlatform群集平台,在通常情况下,只需要两个步骤:

    (1)部署并启动应用群集管理服务器ACMS。

    (2)服务端使用ESPlatform.Rapid.RapidServerEngine替换ESPlus.Rapid.RapidServerEngine。客户端几乎不用做任何修改。

    一.ESPlatform.Rapid.RapidServerEngine

          在单AS的ESFramework应用中,我们的服务端引擎使用的是ESPlus.Rapid.RapidServerEngine,当迁移时,我们需要使用ESPlatform.dll程序集中的ESPlatform.Rapid.RapidServerEngine。ESPlatform.Rapid.RapidServerEngine也实现了ESPlus.Rapid.IRapidServerEngine接口。

    1.构造与初始化

          替换时,对开发者的使用来说,仅仅是构造ESPlatform.Rapid.RapidServerEngine对象时使用的构造函数不一样: 

    public RapidServerEngine(int currentServerID, AgileIPE acmsIPE)

          构造函数的第一个参数为当前启动服务器的ID,第二个参数指定了ACMS服务器的地址信息。

    (1)在ESPlatform群集中,每个运行的服务端实例都有一个唯一的ID,称之为ServerID。在单AS系统中,ServerID可以被忽略;但在群集系统中,ServerID成了服务端实例的身份标志。

    (2)如果acmsIPE参数所指向的位置没有运行ACMS服务器,那么该构造函数的执行是不会报错的,但是接下来RapidServerEngine的Initialize方法的调用会抛出异常。

    (3)当ESPlatform.Rapid.RapidServerEngine的Initialize方法执行时,AS会向ACMS注册,初始化完成之后,AS还会定时向ACMS报告自己的状态。

    2.平台用户管理器

          还记得ESPlus.Rapid.IRapidServerEngine的UserManager属性吗?我们在服务端编程时,可以通过该属性访问当前AS服务器上的所有在线用户的信息。 而ESPlus.Rapid.IRapidServerEngine还有个PlatformUserManager属性,在单AS应用中,这个属性与UserManager属性相当于是同一个东西。但是,即使是在单AS应用中,PlatformUserManager属性也有它存在的价值。它的作用在于:当我们开发单AS的应用的时候,依据对以后可能迁移到ESPlatform群集平台的预测,在需要访问任何一个在线用户的地方使用PlatformUserManager来代替使用UserManager,这将为以后快速地迁移到群集平台铺平道路。

          ESPlatform.Rapid.RapidServerEngine 暴露的PlatformUserManager属性,就是真正的平台用户管理器了,通过它,AS可以访问群集系统中任何一个在线的用户的信息。

    3.替换之后

          在将ESPlus.Rapid.RapidServerEngine替换成ESPlatform.Rapid.RapidServerEngine之后,ESFramework/ESPlus提供的四大武器和两个可选功能都将按我们所期望的正常工作。比如,某个客户端通过ICustomizeOutter发送消息给另外一个AS上的客户端,那么,目标客户端是可以收到这个消息的。再比如,我们通过IGroupOutter发送广播消息时,即使同一个组的成员登录到了群集系统中的不同的AS上,那么每个成员也都是还能收到这个广播消息的。

          像同步调用、回复异步调用、文件传送、P2P通道的创建,等等功能,都正常工作,而不受影响。

    二.应用群集管理服务器ACMS

          ESPlatform提供了可直接部署运行的应用群集管理服务器ESPlatform.ACMServer.exe,在部署ESPlatform群集系统时,只要修改一下配置,然后启动它就可以了。

          正如ESPlatform 群集平台(00) -- 概念与模型一文所说,ACMS在群集系统中所扮演的重要角色,可以说,它是整个ESPlatform群集平台的核心。ACMS的核心职责可概括为:管理所有的在线AS、管理所有的在线用户、在AS之间转发消息、提供服务接口给群集外的其它系统调用。

          ACMS通过Remoting的方式对外暴露这些功能和服务。ACMS提供了三个Remoting服务接口:IApplicationService、IClusterControlService、IPlatformCustomizeService。 

        

          IApplicationService 是给ESPlatform群集系统内部的AS使用的,AS通过该接口向ACMS实时报告自己的状态。IClusterControlService 和 IPlatformCustomizeService 用于提供给群集外的系统(如BL)来访问群集中的信息或控制群集中的服务器。本文我们先讨论IApplicationService,另外两个接口留到下篇文章再详解。

          ACMS提供Remoting接口IApplicationService的主要用途为:管理在线服务器、管理在线用户、在AS之间转发消息。 

          请注意,ESPlatform.Rapid.RapidServerEngine已经在内部自动配合ACMS完成了这些功能,我们在基于ESFramework/ESPlus/ESPlatform二次开发时,不用再为这些任务做任何额外的工作。虽然如此,下面我们还是可以简单了解一下,以帮助我们更好的理解ESPlatform的运行机制。

    1.管理在线的应用服务器和用户

          当我们启动一个应用服务器AS时,该AS会自动向ACMS注册;当关闭一个AS时,又会自动向ACMS注销。当用户登录/退出某个AS时,AS也会实时向ACMS报告。IApplicationService接口清晰地展示了这些功能: 

    复制代码
        public interface IApplicationService : IMessageTransferor ,IPlatformUserManager
        {
    /// <summary> /// 注册服务器到群集中 /// </summary> void RegisterServer(ClusterServerInfo server); /// <summary> /// 从群集中移除服务器 /// </summary> void UnregisterServer(int serverID); /// <summary> /// 目标服务器是否正在线? /// </summary> /// <param name="serverID">目标服务器的ServerID</param> /// <returns>在线?</returns> bool IsServerOnline(int serverID); /// <summary> /// 向ACMS报告最新的状态数据。 /// </summary> /// <param name="serverID">目标服务器ID</param> /// <param name="performance">性能数据</param> /// <param name="onlineUserCount">在线人数</param> void ReportPerformance(int serverID, Performance performance, int onlineUserCount); /// <summary> /// 当用户登陆到AS时,通知ACMS。 /// </summary> void RegisterUser(UserData user); /// <summary> /// 当用户登出到AS时,通知ACMS。 /// </summary> void UnregisterUser(string userID); }
    复制代码

           AS还会定时调用ReportPerformance方法向ACMS报告自己的性能数据,ACMS的群集分配策略就是基于这些性能数据做决策的。

           另外,IApplicationService还继承了IPlatformUserManager,IPlatformUserManager接口用于管理所有在线的用户。ESPlatform.Rapid.RapidServerEngine暴露的PlatformUserManager,正是这个Remoting接口的简单封装。

    2.转发消息

          IApplicationService继承了IMessageTransferor,IMessageTransferor接口正是用于在AS之间转发消息的。 

    复制代码
        public interface IMessageTransferor
        {
            /// <summary>
            /// 在群集中同类型的服务器之间转发消息。
            /// </summary>
            /// <param name="sourceServerID">消息来源服务器的ID</param>
            /// <param name="msg">消息</param>
            /// <param name="destUserIDs">接收消息的目标用户的UserID的集合</param>      
            void TransferMessage(int sourceServerID, IMessage msg, IEnumerable<string> destUserIDs, bool post, ActionTypeOnChannelIsBusy action);
    
            /// <summary>
            /// 在群集中同类型的服务器之间转发消息。
            /// </summary>
            /// <param name="sourceServerID">消息来源服务器的ID</param>
            /// <param name="msg">消息</param>
            /// <param name="destUserID">接收消息的目标用户的UserID</param>      
            void TransferMessage(int sourceServerID, IMessage msg, string destUserID, bool post, ActionTypeOnChannelIsBusy action); 
        }
    复制代码

          该接口中的两个方法已经涉及到了ESFramework底层的IMessage接口了,直接基于ESPlus开发的朋友可能是第一次看到这个接口。我们这里就不深入介绍,只简单说一下消息转发的原理。

          我们仍然以上文中的第一个模型图为例:             

         

          当Client01要发消息给Client02时,由于Client01与Client02之间不存在P2P通道,所以消息将提交给AS01。AS01发现Client02不再当前的服务器上,所以就将消息提交给ACMS。然后,ACMS会查询平台用户管理器,发现Client02位于AS02上,于是,ACMS就回调AS02,并将消息交由AS02去发送。

    三.启动ACMS

          下图是启动ESPlatform.ACMServer.exe后运行的主界面: 

          

          列表中显示了每个在线的AS的基本信息,包括:服务器的ID、地址、该AS上的在线人数、是否处于冻结状态、Cpu使用率、内存使用率、启动时间、最后一次更新时间等。

          ACMS的主界面还直接提供了查找在线用户和踢人的功能。

          通过右键快捷菜单,我们可以将某个AS冻结、或者从群集系统中移除。 

    (1)冻结AS:当我们不想有新的用户连接到群集系统中的某个AS上时,我们可以冻结它。如果AS处于冻结状态,表示该服务器不再接收新的用户,但是,现已登陆的用户的一切活动仍然是正常的。

    (2)移除AS:当某个AS意外down掉(比如,硬件出现问题),我们需要手动将其从平台中移除。在移除AS的同时,所有位于该AS上的用户也会从平台中清理掉。

          当然,ACMS主界面提供的群集控制功能是非常有限的,但是,ACMS还暴露了上面提到的两个Remoting接口:IClusterControlService 和 IPlatformCustomizeService ,在群集系统的外部,我们可以通过这两个接口,更全面的访问和控制群集系统。这将是下一篇文章要详细阐述的内容。

      

    阅读 更多ESFramework开发手册系列文章  

    ----------------------------------------------------------------------------------------------------------------------------------------------- 

    关于ESFramework的任何问题,欢迎联系我们:  

    电话:027-87638960  

    Q Q:372841921  

     
    分类: ESPlatform
  • 相关阅读:
    codevs 1115 开心的金明
    POJ 1125 Stockbroker Grapevine
    POJ 2421 constructing roads
    codevs 1390 回文平方数 USACO
    codevs 1131 统计单词数 2011年NOIP全国联赛普及组
    codevs 1313 质因数分解
    洛谷 绕钉子的长绳子
    洛谷 P1276 校门外的树(增强版)
    codevs 2627 村村通
    codevs 1191 数轴染色
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2483570.html
Copyright © 2011-2022 走看看