ESPlatform 群集平台(01) -- 迁移到群集平台

      在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。 

    ESPlatform 群集平台(01) -- 迁移到群集平台_第1张图片

      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开发的朋友可能是第一次看到这个接口。我们这里就不深入介绍,只简单说一下消息转发的原理。

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

     ESPlatform 群集平台(01) -- 迁移到群集平台_第2张图片

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

三.启动ACMS

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

      ESPlatform 群集平台(01) -- 迁移到群集平台_第3张图片

      列表中显示了每个在线的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  

 

你可能感兴趣的:(form)