ESFramework介绍之(17)―― 支持漫游用户和跨区域功能请求

  • 时间:
  • 浏览:2

    对于漫游用户的支持和跨区域功能请求的支持是ESFramework最基本的目的之一(回顾),在全版讲述防止方案很久,先了解一下关于你只是 问题图片的上下文。

    在大伙儿前面讲述的4层C/S架构中,每个AS负责一块区域。比如上海AS负责防止所有目标城市为上海的功能请求和管理所有在上海AS上注册的用户(比如PDA用户或手机用户)。肯能另另三个小本是在上海注册的用户出差来到了武汉,最方便的,他会连上武汉的AS,只是对于武汉AS来说,你只是 用户只是漫游用户了。

    肯能上海的用户登陆上了上海的AS,只是 他须要请求目标城市为武汉的服务,你只是 请求只是跨区域的请求,上海AS防止不了,须要转发给武汉AS防止。

    还四种 生活生活情况,只是即时消息,比如登录到上海AS的用户须要和登录到武汉AS的用户进行即时通讯,你只是 即时消息都须要在不同的AS之间进行中转,只是 最终转发给目标用户。

    ESFramework对上边的各种情况都给予了充分完善的支持。首先,大伙儿防止第另另三个小问题图片――支持漫游用户。

    单纯的支持漫游用户,非常容易做到。重要的是大伙儿须要为即时通讯信息作准备。当另另三个小用户想查询他的某个“好友”与非 在线时,肯能目标好友没法漫游,没法,只须要询问其注册的的AS就都须要知道答案,只是 肯能其漫游到异地AS了了?难道大伙儿须要去轮询成千上万个AS中的每另另三个小吗?只是的带宽是无法忍受的。ESFramework是通过引入IRamblesManager接口防止你只是 问题图片。

    上边的代码和注释肯能非常清楚了说明了跨区域请求是怎么可以 被防止的,这里就不赘言了。只是须要注意,所有的功能请求前会 通过远程服务接口提供服务的。

    

    最后,说一说上边描述上下文时提到的第四种 生活情况,AS是怎么可以 防止即时通讯消息的?即时通讯消息在ESFramework种称为P2PMessage,对于P2PMessage当然前会 对应的消息防止器P2PMessageDealer,它负责将P2PMessage转发给指定的目标用户。P2PMessageDealer的工作最好的办法如下,肯能发现目标用户就在本地AS上,则直接转发。肯能目标用户是异地用户肯能肯能漫游到异地,则将消息转发到目标AS上。P2PMessageDealer的实现借助了IToClientSender接口,IToClientSender接口向应用屏蔽了底层的消息转发过程,其定义如下:

    防止了漫游用户后,大伙儿现在转向第六个问题图片,怎么可以 支持跨区域的功能请求?

    前面的系列文章肯能讲到,所有的功能请求前会 通过消息防止器来防止的,对于跨区域的功能请求,ESFramework提供了跨区域的功能防止器来防止。其仍然实现了IDataDealer接口。下面列出跨区域功能防止器的DealRequestMessage最好的办法的实现代码:

    ESFramework中的IToClientSender实现是ToClientSender,它都须要所含一组具体的Sender,每次发送消息时,ToClientSender会按照指定的顺序调用每个Sender,知道有另另三个小发送成功为止。ToClientSender实现如下:

    /// <summary>

    
/// ToClientSender 将数据(另另三个小全版的请求--header+body)转发给目标用户。隐藏了目标用户的位置

    
/// 目标用户肯能连接在其它服务器节点上    

    
/// </summary>

    public interface IToClientSender

    {

        
int HookAndSendMessage(string userID ,NetMessage msg) ;    //返回DataSendResult的常量

    }

 1         public int HookAndSendMessage(string userID, NetMessage msg)

 2         {

 3             try

 4             {

 5                 int userCurCityCode = this.ramblesManager.GetUserCurrCityCode(userID) ;

 6                 if(this.myConfiguration.CityCode == userCurCityCode)

 7                 {

 8                     return DataSendResult.UserIsOffLine ;

 9                 }

10 

11                 string destAppServerIp = this.irasRemotingAccesser.GetAppServerIp(userCurCityCode) ;

12                 if(destAppServerIp == null)

13                 {

14                     return DataSendResult.UserIsOffLine ;

15                 }

16 

17                 IAsRemotingService_4As asRemotingAccesser = (IAsRemotingService_4As)NetHelper.GetRemotingHanler(this.myConfiguration.RemotingChannelTypeStr ,destAppServerIp ,this.myConfiguration.AsRemotingPort ,this.myConfiguration.AsRemoting4AsServiceName ,typeof(IAsRemotingService_4As)) ;

18                 if(asRemotingAccesser == null)

19                 {

20                     return DataSendResult.UserIsOffLine ;

21                 }

22 

23                 NetMessage hookedMsg = this.netMessageHook.CaptureBeforeSendMsg(msg) ;

24                 return asRemotingAccesser.HookAndSendMessage(userID ,msg) ;    

25             }

26             catch(Exception ee)

27             {

28                 ee = ee ;

29                 this.esbLogger.Log(ee.Message ,"ESFramework.Architecture.LBS.FourTier.ToForeignClientSender" ,ErrorLevel.Standard) ;

500                 return DataSendResult.FailByOtherCause ;

31             }

32         }

33 

    }

    当大伙儿在配置应用时,ToClientSender的SenderList通常只所含另另三个小Sender――ToLocalClientSender和ToForeignClientSender。ToLocalClientSender在AS内控 传递要转发的消息,而ToForeignClientSender跨AS传递要转发的消息。ToLocalClientSender的实现非常简单:

1     public interface IRamblesManager

2     {

3         int     GetResideCityCode(string userID) ; //用户注册(手机号码)所属地

4         int     GetUserCurrCityCode(string userID) ; //用户当前所在地

5         void    RemoveRambles(string userID) ;

6         void    RegisterRambles(string userID ,int cityCode) ;

7     }

    tcpUserManager是用户管理者组件,它管理了所有的在线用户。关于它的全版描述会在后文中给出。

    ToForeignClientSender通过借助IRamblesManager和AS发布的远程服务接口也实现了跨区域消息的转发。

转到  :ESFramework 可复用的通信框架(序) 

 1         public NetMessage DealRequestMessage(NetMessage reqMsg)

 2         {

 3             try

 4             {

 5                 //从IRAS获取目标AS的地址

 6                 string serverIp = this.irasRemotingAccesser.GetAppServerIp(reqMsg.Header.TypeKey) ;    

 7                 if(serverIp == null)

 8                 {

 9                     return this.contractHelper.GetResponseByServiceResultType(reqMsg ,ServiceResultType.ServiceStopped) ;

10                 }

11                 

12                 //获取目标AS发布的远程服务句柄

13                 IAsRemotingService_4As asRemotingAccesser = (IAsRemotingService_4As)NetHelper.GetRemotingHanler(this.myConfiguration.RemotingChannelTypeStr ,serverIp ,this.myConfiguration.AsRemotingPort ,this.myConfiguration.AsRemoting4AsServiceName ,typeof(IAsRemotingService_4As)) ;

14                 if(asRemotingAccesser == null)

15                 {

16                     return this.contractHelper.GetResponseByServiceResultType(reqMsg ,ServiceResultType.ServiceStopped) ;

17                 }

18 

19                 //Hook

20                 NetMessage hookedMsg = this.netMessageHook.CaptureBeforeSendMsg(reqMsg) ;

21 

22                 //目标AS防止跨区域请求

23                 return asRemotingAccesser.DealRequestMessage(hookedMsg) ;

24             }

25             catch(Exception ee)

26             {

27                 ee = ee ;

28                 this.esbLogger.Log(ee.Message ,"ESFramework.Architecture.LBS.FourTier.ForeignDealer" ,ErrorLevel.Standard) ;

29                 return this.contractHelper.GetResponseByServiceResultType(reqMsg ,ServiceResultType.ServiceStopped) ;

500             }

31         }

    关于“支持漫游用户和跨区域功能请求”,本文只是对主要的帕累托图作了讲述,还有只是小的细节无法在这里全面展开。肯能也太多了解并使用ESFramework框架来帮你搭建应用,了解你只是 就足够了:)感谢关注!

上一篇文章:ESFramework介绍之(16)―― Tcp数据自动发送器ITcpAutoSender

    IRamblesManager接口用于管理所有的漫游用户,它记录了每个漫游用户的当前所在区域。你只是 接口在每个AS发现漫游用户时调用。比如,当某个用户登录到上海AS,上海AS发现你只是 用户前会 在上海注册的,于是,它调用IRamblesManager接口把该用户添加到漫游记录表中。你只是 漫游记录表肯能占据 某个公共的数据库中、也肯能占据 某台7*24小时运行的服务器的内存中。IRamblesManager接抽象了你只是 具体的物理实现。每个AS通过与IRamblesManager交互就都须要知道某个用户与非 漫游了、以及漫游到了何地等信息。

 1         public int HookAndSendMessage(string userID ,NetMessage msg)

 2         {

 3             bool onLine = this.tcpUserManager.IsUserOnLine(userID) ;

 4             if(onLine)

 5             {

 6                 int connectID = this.tcpUserManager.GetUserConnectID(userID) ;

 7                 this.hookSender.HookAndSendNetMessage(connectID ,msg) ;

 8                 return DataSendResult.Succeed ;

 9             }    

10         

11             return DataSendResult.UserIsOffLine ;

12         }