ESPlatform 群集平台(01) -- 迁移到群集平台
在ESFramework 开发手册(00) -- 概述中,我们提到过ESFramework的一个优势:仅仅通过修改几行代码或配置就可以将一个基于ESFramework的应用程序平滑迁入到ESPlatform平台中。现在,是到了兑现这一承诺的时候了。将单AS的ESFramework应用迁移到ESPlatform群集平台,在通常情况下,只需要两个步骤:
(1)部署并启动应用群集管理服务器ACMS。
(2)服务端使用ESPlatform.Rapid.IRapidServerEngine替换ESPlus.Rapid.IRapidServerEngine。客户端几乎不用做任何修改。
一. ESPlatform.Rapid.IRapidServerEngine
在单AS的ESFramework应用中,我们的服务端引擎使用的是ESPlus.Rapid.IRapidServerEngine,当迁移时,我们需要使用企业版ESPlatform.dll程序集中的ESPlatform.Rapid.IRapidServerEngine。ESPlatform.Rapid.IRapidServerEngine实现了IPlatformRapidServerEngine接口。
public interface IPlatformRapidServerEngine : IRapidServerEngine { /// <summary> /// 当与平台服务器ACMS断开连接时,触发此事件。 /// </summary> event CbGeneric PlatformConnectionInterrupted; /// <summary> /// 当与平台服务器ACMS连接重新建立时,触发此事件。 /// </summary> event CbGeneric PlatformConnectionRebuild; /// <summary> /// 与平台服务器ACMS是否连接? /// </summary> bool PlatformConnected { get; } /// <summary> /// ACMS回调处理器。用于处理ACMS对当前AS的回调。默认值为null。 /// </summary> ICallbackHandler CallbackHandler { set; } }
可见,IPlatformRapidServerEngine 接口从IRapidServerEngine继承,而且增加了两个特性:一是暴露了当前AS与ACMS之间的连接状态;二是允许注入一个CallbackHandler,该CallbackHandler用于处理IPlatformCustomizeService发送的自定义信息(下一篇文章将会详细讲述)。
相比于ESPlus.Rapid.IRapidServerEngine,使用 ESPlatform.Rapid.IRapidServerEngine要注意一下几点:
1.构造与初始化
替换时,对开发者的使用来说,创建ESPlatform.Rapid.IRapidServerEngine对象时需要使用ESPlatform.Rapid.RapidEngineFactory的静态方法:
/// <summary> /// 创建基于ESPlatform的服务端引擎。 /// </summary> /// <param name="currentServerID">当前应用服务器的ID</param> /// <param name="_acmsIP">应用群集管理服务器IP地址</param> /// <param name="_acmsServicePort">应用群集管理服务器提供Remoting服务的端口</param> /// <param name="_acmsTransferPort">应用群集管理服务器用于转发消息的端口</param> public static IPlatformRapidServerEngine CreateServerEngine(string currentServerID, string acmsIP, int acmsServicePort, int acmsTransferPort)
方法的第一个参数为当前启动服务器的ID,后三个参数指定了ACMS服务器的地址信息。
(1)在ESPlatform群集中,每个运行的服务端实例都有一个唯一的ID,称之为ServerID。在单AS系统中,ServerID可以被忽略;但在群集系统中,ServerID成了服务端实例的身份标志。
(2)acmsIP 参数是ACMS服务器的IP地址,后面两个参数对应着ACMS发布的Remoting服务的接口、以及用于转发的接口。后面会进一步介绍它们。
(3)如果目标ACMS服务器没有启动,那么该构造函数的执行是不会报错的,但是接下来RapidServerEngine的Initialize方法的调用会抛出异常。
(4)当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.IRapidServerEngine 暴露的PlatformUserManager属性,就是真正的平台用户管理器了,通过它,AS可以访问群集系统中任何一个在线的用户的信息。
3.注册回调通道
由于群集平台会在需要的时候回调服务端,所以,服务端在启动的时候需要注册供平台回调的tcp通道。注册回调通道很简单:
(1)在配置文件App.config中,配置端口号为0的基于TCP的Remoting通道。
<system.runtime.remoting> <customErrors mode="Off"/> <application> <channels> <channel ref="tcp" port="0" > <serverProviders> <provider ref="wsdl" /> <formatter ref="soap" typeFilterLevel="Full" /> <formatter ref="binary" typeFilterLevel="Full" /> </serverProviders> <clientProviders> <formatter ref="binary" /> </clientProviders> </channel> </channels> </application> </system.runtime.remoting>
(2)在构造ESPlatform.Rapid.RapidServerEngine之前,添加下面代码注册通道:
RemotingConfiguration.Configure("******.exe.config");
4.替换之后
在将ESPlus.Rapid.IRapidServerEngine替换成ESPlatform.Rapid.IRapidServerEngine之后,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实时报告自己的状态。通过IApplicationService,ACMS就可以:管理在线服务器、管理在线用户。 请注意,ESPlatform.Rapid.RapidServerEngine已经在内部自动配合ACMS完成了这些功能,所以,我们在基于ESFramework/ESPlus/ESPlatform进行二次开发时,可以忽略IApplicationService的存在。
IClusterControlService 和 IPlatformCustomizeService 用于提供给群集外的系统(如BL)来访问群集中的信息或控制群集中的服务器。我们将在下篇文章中详细讨论它们。
现在我们来看看ACMS的配置文件的内容:
<configuration> <appSettings> <!--应用群集中的服务器分配策略--> <add key="ServerAssignedPolicy" value="MinUserCount"/> <!--用于在AS之间转发消息的Port--> <add key="TransferPort" value="12000"/> </appSettings> <system.runtime.remoting> <application> <channels> <!--提供IPlatformCustomizeService和IClusterControlService Remoting服务的Port--> <channel ref="tcp" port="11000" > <serverProviders> <provider ref="wsdl" /> <formatter ref="soap" typeFilterLevel="Full" /> <formatter ref="binary" typeFilterLevel="Full" /> </serverProviders> <clientProviders> <formatter ref="binary" /> </clientProviders> </channel> </channels> </application> </system.runtime.remoting> </configuration>
上述的3个Remoting服务所使用的Remoting端口即是配置文件中配置的11000,而为了提升消息转发的性能,ACMS并没有使用Remoting来转发消息,而是直接基于TCP socket,其单独使用了一个端口即配置中的TransferPort项(12000)。
我们以上文中的第一个模型图的简化版为例来说明跨服务器的消息转发:
当Client01要发消息给Client02时,假设Client01与Client02之间不存在P2P通道,所以消息将提交给AS01。AS01发现Client02不在当前的服务器上,所以就将消息提交给ACMS。然后,ACMS会查询平台用户管理器,发现Client02位于AS02上,于是,ACMS就将消息转发给AS02,交由AS02去发送,这样,Client02就收到了来自Client01的消息。
三. 启动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 ,在群集系统的外部,我们可以通过这两个接口,更全面的访问和控制群集系统。这将是下一篇文章要详细阐述的内容。
下一篇:ESPlatform 群集平台(02) -- 从外部访问群集
上一篇:ESPlatform 群集平台(00) -- 概念与模型
-----------------------------------------------------------------------------------------------------------------------------------------------
Q Q:168757008