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
  • 相关阅读:
    Spring RestTemplate 之put、delete请求
    Too many connections解决方案
    各个平台的mysql重启命令
    MySQL出现too many connections(1040)错误解决方法
    EXCEL中,如何引用一个单元格中的数据,作为另一个单元格内容中的一部分?
    [翻译][Java]ExecutorService的正确关闭方法
    MySQL:日期函数、时间函数总结(MySQL 5.X)
    MySQL 获得当前日期时间 函数
    线程本地变量ThreadLocal
    split 分割 字符串(分隔符如:* ^ : | , . ?) 及注意点
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2483570.html
Copyright © 2011-2022 走看看