loginApp是整个bigworld进行用户认证的服务,是用户进入游戏的第一步。本篇主要针对loginApp的认证流程,如何和其他服务进行交互,以及loginApp针对多服务负载的不同做法进行分析。

  1. loginApp用户认证流程

  用户通过loginApp认证,主要是以下几个步骤:

  (1) client发送认证请求(前提是他已经知道loginApp的ip和端口)

  (2) loginApp在其监听端口上,收到这个请求

  (3) 收到请求之后,loginApp将认证信息转发给DBMgr,通过DBMgr来验证登陆认证是否合法

  (4) DBMgr通过查询数据库来进行确认

  (5) 如果认证是合法的,那么DBMgr通知BaseAppMgr去创建一个新的entity(玩家实例)

  (6) BaseAppMgr将创建新entity的需求,转发给当前负载最小的BaseApp

  (7) BaseApp创建一个新的Proxy,Proxy就是BaseApp上代表用户的实例

  (8) 同时可能需要在CellApp中创建一个玩家entity,这个要根据实际的项目需要了。也有可能直到用户选取了角色之后,才在cellApp中创建entity。

  (9) 当上门的事情都做完之后,proxy的UDP端口将结果返回给client(通过BaseAppMgr,DBMgr,最后LoginApp)

  上述流程的示意图是这样的:

  

  2. loginApp认证流程在代码中的体现

  代码只截取认为最重要的部分和关键语句,大部分代码省略,使用//......来代替

  (2)(3)loginApp收到认证请求,并且转发:

  

    // 先针对参数有效性进行检查  // ......

  // 判断是不是上一个认证请求还没做完  // First check whether this is a repeat attempt from a recent pending// login before attempting to decrypt and log in.if (this->handleResentPendingAttempt( source, header.replyID )){// ignore this one, it's in progress
        loginStats_.incPending();return;}// 判断是否是否了加密
#ifdef USE_OPENSSLMercury::PublicKeyCipher * pPrivateKey = &privateKey_;
#elseMercury::PublicKeyCipher * pPrivateKey = NULL;
#endif//.......
  // 判断是否之前有认证cache// First check whether this is a repeat attempt from a recent// resolved login before attempting to log in.if (this->handleResentCachedAttempt( source, pParams, header.replyID )){// ignore this one, we've seen it recentlyreturn;}// ......INFO_MSG( "Logging in %s{%s} (%s)\n",pParams->username().c_str(),pParams->password().c_str(),source.c_str() );// Remember that this attempt is now in progress and discard further// attempts from that address for some time after it completes.
    cachedLoginMap_[ source ].reset();cachedLoginMap_[ source ].pParams( pParams );DatabaseReplyHandler * pDBHandler =new DatabaseReplyHandler( source, header.replyID, pParams );    // 发送给DBMgrMercury::Bundle    & dbBundle = this->dbMgr().bundle();dbBundle.startRequest( DBInterface::logOn, pDBHandler );dbBundle << source << false /*off channel*/ << *pParams;this->dbMgr().send();

  

  (9) 认证消息返回给client代码

 void DatabaseReplyHandler::handleMessage(    const Mercury::Address & /*source*/,    Mercury::UnpackedMessageHeader & header,    BinaryIStream & data,

void * /*arg*/ )
{uint8 status;data >> status;  // 检查认证返回码if (status != LogOnStatus::LOGGED_ON){    // 如果认证失败            // ......}LoginReplyRecord lrr;data >> lrr;// If the client has an external address, send them the firewall// address instead!if (!LoginApp::instance().netMask().containsAddress( clientAddr_.ip )){INFO_MSG( "DatabaseReplyHandler::handleMessage: ""Redirecting external client %s to firewall.\n",clientAddr_.c_str() );lrr.serverAddr.ip = LoginApp::instance().externalIP(); }
    // 返回client认证结果,并且缓存认证结果      LoginApp::instance().sendAndCacheSuccess( clientAddr_, replyID_, lrr, pParams_ );gNumLogins++;delete this;
}

  3. loginApp是如何做负载的

  loginApp是bigworld中用来处理用户登录认证的,为了防止单一loginApp存在性能瓶颈,同时防止单点故障,bigworld也是可以运行同时运行多个loginApp。不过我们知道多个baseApp和cellApp是分别有,baseAppMgr和cellAppMgr来做管理和负载的,loginApp我们却没有找到类似的loginAppMgr。

  在bigworld的文档中,是这样写的:

In terms of load, a single LoginApp should be sufficient for most purposes. However, as this is still a potential bottleneck, and single point of failure, BigWorld supports running multiple LoginApps.
The remaining issue then is how to distribute the client login requests across multiple login servers. The standard way to do this is use a DNS solution similar to how popular web sites balance traffic load across  multiple machines.

  从上面的介绍来看,bigworld本身确实是没有提供类似的loginAppMgr,而是需要我们使用DNS来做负载,DNS返回不同的loginApp ip,来分担压力。

转载于:https://www.cnblogs.com/chobits/p/5075755.html

bigworld源码分析(2)—— loginApp分析相关推荐

  1. bigworld源码分析(3)——dbMgr分析

    dbMgr主要是玩家数据的读取和保存的,例如在bigworld源码分析(3)中,玩家在认证的时候,loginApp需要通过dbMgr来验证玩家数据是否合法,这就是针对玩家的账号数据进行查询.本篇中,我 ...

  2. bigworld源码分析(1)—— 研究bigworld的意义和目标

    对于网络游戏服务器开发熟悉的人,基本都知道bigworld引擎,此引擎包括客户端部分和服务器部分,已经有很多知名的网络游戏通过bigworld来构建游戏.我主要关注bigworld的服务器部分,它是一 ...

  3. Colly源码解析——结合例子分析底层实现

    通过<Colly源码解析--框架>分析,我们可以知道Colly执行的主要流程.本文将结合http://go-colly.org上的例子分析一些高级设置的底层实现.(转载请指明出于break ...

  4. lodash源码中debounce函数分析

    lodash源码中debounce函数分析 一.使用 在lodash中我们可以使用debounce函数来进行防抖和截流,之前我并未仔细注意过,但是不可思议的是,lodash中的防抖节流函数是一个函数两 ...

  5. Linux内核学习(五):linux kernel源码结构以及makefile分析

    Linux内核学习(五):linux kernel源码结构以及makefile分析 前面我们知道了linux内核镜像的生成.加载以及加载工具uboot. 这里我们来看看linux内核的源码的宏观东西, ...

  6. 从源码和内核角度分析redis和nginx以及java NIO可以支持多大的并发

    有人询问我网上一篇关于"redis为什么单线程这么快"的文章,我建议他不要看了,因为redis是单进程不是单线程,后面的意见不用看了,文章质量肯定不会很好,他也说了自己看了很久源码 ...

  7. Caffe源码中common文件分析

    Caffe源码(caffe version:09868ac , date: 2015.08.15)中的一些重要头文件如caffe.hpp.blob.hpp等或者外部调用Caffe库使用时,一般都会in ...

  8. 朋友问我学习高并发需不需要阅读源码,我是这样分析的!!

    来自:冰河技术 写在前面 最近正在写[高并发专题]的文章,其中,在[高并发专题]中,有不少是分析源码的文章,很多读者留言说阅读源码比较枯燥!问我程序员会使用框架了,会进行CRUD了,是否真的有必要阅读 ...

  9. JUC之CountDownLatch的源码和使用场景分析

    最近工作不饱和,写写文章充充电.何以解忧,唯有Coding.后续更新的文章涉及的方向有:ThreadPoolExecutor.Spring.MyBatis.ReentrantLock.CyclicBa ...

  10. Linux内核移植之一:内核源码结构与Makefile分析

    内容来自 韦东山<嵌入式Linux应用开发完全手册> 一.内核介绍 1.版本及其特点 Linux内核的版本号可以从源代码的顶层目录下的Makefile中看到,比如下面几行它们构成了Linu ...

最新文章

  1. 马斯克的星际飞船SN10又炸了,但技术却向前迈出一大步!
  2. CNN tflearn处理mnist图像识别代码解说——conv_2d参数解释,整个网络的训练,主要就是为了学那个卷积核啊。...
  3. 2、SharePoint安装篇——之安装Microsoft Office SharePoint Server 2007
  4. Shell多线程实现
  5. 如何通过调试找到自己需要的ABAP增强
  6. sae 本地环境 mysql数据库_SAE本地环境与真实环境的差别
  7. fastdfs 集群 java_FastDFS集群部署(转载 写的比较好)
  8. GetManifestResourceStream得到的Stream是null的解决
  9. Linux学习笔记(单用户模式,救援模式,克隆主机,两个linux互相连接)
  10. Powershell创建数组
  11. linux共享文件丢失,linux基础应用(NFS文件共享)
  12. 【牛客网刷题】(第二弹)中等难度题型来了.这些题你都会做吗?
  13. oracle db studay
  14. QQ空间相册如何批量导出
  15. linux-Team-网卡绑定
  16. 什么是PaaS平台?一文看懂SaaS、PaaS和私有化部署的区别
  17. 对于Transformer 模型----可以从哪些地方进行创新和改进
  18. Microsoft Remote Procedure Call Runtime 远程代码执行漏洞(CVE-2022-26809)
  19. 01--背包问题以及构造最优解
  20. Filter 过滤器接口详解

热门文章

  1. 计算机专硕日语考研学校排名,日语考研院校排名(日语专硕学校排名)
  2. 小程序标准版交易组件开启
  3. 遥感原始图像计算机格式,卫星遥感影像数据是什么样格式的?
  4. 纵向表格转为横向表格
  5. 筷子兄弟--11度青春系列电影之老男孩,相信你会感动!!
  6. 2014年优秀动画片推荐:马来西亚动画片《Ribbit》
  7. mac环境下搭建frida环境并连接网易mumu模拟器
  8. 【STM32】CubeMX+HAL库之 硬件IIC+DMA控制OLED(兼容SSD1306SH1106驱动)
  9. php1106打印机怎么使用,1106打印机驱动使用说明
  10. 2019.最新Activiti6.0删除部署流程表(两种删除方式)