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通道的创建,等等功能,都正常工作,而不受影响。
二.应用群集管理服务器ACMSESPlatform提供了可直接部署运行的应用群集管理服务器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
邮件: esframework@oraycn.com
分类: ESPlatform
标签: P2P , ESPlatform , 群集平台 , 通信平台
作者: Leo_wl
出处: http://www.cnblogs.com/Leo_wl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权信息查看更多关于ESPlatform 群集平台迁移到群集平台的详细内容...