网关server网络进程:
s1.连接网关管理器
s2.上报自身信息给网关管理器
s3.从网关管理器获取自己的管理信息
*s4.依照管理信息预分配好须要的资源
s5.网关server打开client监听port
s6.网关server開始转发“管理器”和client的数据
*网关server全然不理解来自client的数据(对client而言是透明的)
*网关server和“管理器”之间存在协议栈,有五个高级命令:转发,广播转发,T下线1,T下线2。关闭网关
*网关server会定时给“管理器”发送心跳请求ping
*网关server会维护client状态机:Freed、Starting、InUse、Stoping
GateWayServer抽象网关逻辑以及和管理器的连接,处理管理器命令,而且转发client和管理器的消息
GWClient抽象网关到client连接。负责处理网关和client的逻辑
网关启动后。GateWayServer会打开监听port。当新的连接上来以后,会创建一个新的GWClient对象,而且将新的socket连接郊游GWClient管理。

GWClient管理client和网关server之间的通讯数据:接受到client的数据会交由GameWayServer对象转发到指定的管理器。GameWayServer也会将管理器发送给client的数据交由GWClient发送到client。

即在网关server内部:GWClient做为client的代理,GateWayServer做为管理器(逻辑server)的代理。

// 禁用nagles算法
int nodelay = 1;
if(ACE_OS::setsockopt(new_handle,IPPROTO_TCP, TCP_NODELAY,(char*)&nodelay,sizeof(nodelay))==-1)
{
ACE_ERROR( ( LM_ERROR, ACE_TEXT("Set socket TCP_NODELAY failed!!\n")) );
}
缺陷:
1.缺少对client的安全检測。或许是放到后面的逻辑server上去做了。不能排除恶意连接,或者误操作的连接,全部的连接都被accept上来。然后做数据交换。

2.数据的分发上。好像一个网关server仅仅能相应一个管理器(逻辑server)
3.网关仅仅能标识到连接(SettionID是用户逻辑无关的),无法识别到详细逻辑client
尝试做低级抽象:
IGateWayClientAccpetor
  OnClientAccept
IGateWay2ClientSession
  SessionID
  OnConnect
  OnRead
  OnWrite
IGateWay2ManagerSession
  SessionID
  OnConnect
  OnRead
  OnWrite
  
IGateWayDataRouter
  OnAccessRouting(IGateWay2ClientSession)
  OnAccessRouting(IGateWay2ManagerSession)
  OnGateWay2ClientSessionRead(来自client的数据。当前代码下。会转发给唯一的管理器处理)
  OnGateWay2ManagerSession(来自管理器的数据。假设是须要转发给client的数据。会包括有clientSessionId)



协议概览:

网关管理server 协议:
enum EGWMgrMsgType
{
GWMMT_Msg,
// Route server msg to clients.
GWMMT_MsgAll,
// Route server msg to all clients.
GWMMT_Droped,
// *A client has been droped by manager( actively or disconnect ack ).
GWMMT_DropedDiscard,
// *A client has been droped by manager( actively or disconnect ack ).
GWMMT_Shutdown,
// Shutdown gateway server.
GWMMT_Max,
};
GWMMT_Msg: 转发消息到指定client
GWMMT_MsgAll: 转发广播消息到所有client
GWMMT_Droped: 网关管理器T掉指定client
GWMMT_DropedDiscard: 网关管理器T掉指定client
GWMMT_Shutdown: 关闭网关server
---------------------------------------------------------------------------------------
网关server 协议:
enum EGWSVMsgType
{
GWSMT_CLJoin,
// New client join.
GWSMT_CLDisconnected,
// Client disconnected.
GWSMT_Msg,
// Route client message to server.
GWSMT_Ping,
// gateway ping message to server.
GWSMT_Max,
};
GWSMT_CLJoin: 新连接client
GWSMT_CLDisconnected: client连接断开
GWSMT_Msg: 将client的消息转发到server
GWSMT_Ping: 网关server到逻辑server的ping
-----------------------------------------------------------------------------------
网关server消息头:
struct GWMsgHdr
{
GWMsgHdr( u_int type, u_int len ):type_( type ), data_len_(len){}
u_int
type_; // Msg type.
u_int
data_len_; //
};
------------------------------------------------------------------------------------
网关上报给网关管理器的自身信息
struct GWLocalInfo  // 监听client连接的endpoint
{
u_int
addr_; // Gateway listen address.
u_short
port_;
};
------------------------------------------------------------------------------------
网关从网关管理器接受的信息
struct GWInfo
{
u_int
id_; // Gateway server id.
u_int
cl_num_; // Client num.
};



设计特点:

1.启动參数通过内存共享。本地,能够被其它程访问程序,也许直接向共享集群,没有深入看一下

版权声明:本文博客原创文章,博客,未经同意,不得转载。

QQ旅程server分析01-网关server的更多相关文章

  1. SQL Server 进阶 01 数据库的设计

    SQL Server 进阶 01 数据库的设计 本篇目录 课程内容回顾及介绍 为什么需要规范的数据库设计 设计数据库的步骤 绘制E-R(实体-关系)图 实体-关系模型 如何将E-R图转换为表 数据规范 ...

  2. Eureka 源码分析之 Eureka Server

    文章首发于公众号<程序员果果> 地址 : https://mp.weixin.qq.com/s/FfJrAGQuHyVrsedtbr0Ihw 简介 上一篇文章<Eureka 源码分析 ...

  3. 01. SQL Server 如何读写数据

    原文:01. SQL Server 如何读写数据 一. 数据读写流程简要SQL Server作为一个关系型数据库,自然也维持了事务的ACID特性,数据库的读写冲突由事务隔离级别控制.无论有没有显示开启 ...

  4. 【Canal源码分析】Canal Server的启动和停止过程

    本文主要解析下canal server的启动过程,希望能有所收获. 一.序列图 1.1 启动 1.2 停止 二.源码分析 整个server启动的过程比较复杂,看图难以理解,需要辅以文字说明. 首先程序 ...

  5. SQL Server ->> Memory Allocation Mechanism and Performance Analysis(内存分配机制与性能分析)之 -- Minimum server memory与Maximum server memory

    Minimum server memory与Maximum server memory是SQL Server下配置实例级别最大和最小可用内存(注意不等于物理内存)的服务器配置选项.它们是管理SQL S ...

  6. [叁]Pomelo游戏server编程分享 之 server结构与配置分析

    网络部署结构 我们先看一下Pomeloserver网络部署情况,直接上图 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3RiaW56aQ==/font/ ...

  7. 【SQL server初级】SQL Server 2005 实现数据库同步备份 过程--结果---分析

    数据库复制:   简单来说,数据库复制就是由两台服务器,主服务器和备份服务器,主服务器修改后,备份服务器自动修改. 复制的模式有两种:推送模式和请求模式,推送模式是主服务器修改后,自动发给备份服务器, ...

  8. 使用Identity Server 4建立Authorization Server (4)

    预备知识: http://www.cnblogs.com/cgzl/p/7746496.html 第一部分: http://www.cnblogs.com/cgzl/p/7780559.html 第二 ...

  9. 一个由正则表达式引发的血案 vs2017使用rdlc实现批量打印 vs2017使用rdlc [asp.net core 源码分析] 01 - Session SignalR sql for xml path用法 MemCahe C# 操作Excel图形——绘制、读取、隐藏、删除图形 IOC,DIP,DI,IoC容器

    1. 血案由来 近期我在为Lazada卖家中心做一个自助注册的项目,其中的shop name校验规则较为复杂,要求:1. 英文字母大小写2. 数字3. 越南文4. 一些特殊字符,如“&”,“- ...

随机推荐

  1. 【设计模式】Singleton模式C++实现

    Singleton是设计模式中比较简单的一个.园中的朋友们应该都很熟悉了.前段时间参加xxx外企的面试,和面试官讨论C++的时候正好写了一个.当时由于在有些地方考虑不太周全,代码出现了一些疏漏.不过最 ...

  2. Delphi引用C对象文件

    C语言应用非常广泛,并在世界各地拥有大量的代码库.这些代码库与Delphi的可比性较小,因此如果我们无需转换为Delphi代码而可以直接使用这些库的部分代码就完美了.幸运的是,Delphi允许连接到C ...

  3. 14.4.6 Configuring Thread Concurrency for InnoDB 配置Thread 并发

    14.4.6 Configuring Thread Concurrency for InnoDB 配置Thread 并发 InnoDB 使用操作系统threads 来处理用户的事务请求.(事务可以执行 ...

  4. C++著名类库和C++标准库介绍

    C++著名类库 1.C++各大有名库的介绍——C++标准库 2.C++各大有名库的介绍——准标准库Boost 3.C++各大有名库的介绍——GUI 4.C++各大有名库的介绍——网络通信 5.C++各 ...

  5. shell 调试

    感觉编写shell在查找错误的过程中,很让你崩溃,还好shell也提供了一些调试的方式: 语法检查      -n选项做语法检查,而不执行脚本      sh -n script_name.sh 启动 ...

  6. 《Head First 设计模式》学习笔记——模板方法模式

    模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以详细方法以及详细构造函数的形式实现.然后声明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类能够以不同的方式实现这些抽象方法,从而对剩余的逻辑有 ...

  7. Java学习之道:jdk环境变量配置方法

    JDK(Java Development Kit)是整个Java的核心,包含了Java执行环境.Java工具和Java基础类库.JDK作为JAVA开发的环境,无论是做JAVA开发还是做安卓开发,都必须 ...

  8. Android资源管理框架(Asset Manager)简介和学习计划

    Android该应用程序包括两个部分组成的:代码和资源. 资源主要是与UI相关的东西,例如UI布局.和其他字符串和照片.代码和资源可以使独立的应用程序来组织的实际需求的基础上,在执行的时候UI.,就能 ...

  9. chrome查看headers

    F12-> network标签, 刷新网页-> 找到该网页url,选择headers

  10. 专注UI——有用技术:模糊搜索

    在如今的项目中.须要做模糊搜索,在曾经技术的基础上非常快得完毕了第一版.大家先看看第一版的效果,我们一会做评论: 0基础: 我们可能部分源代码(附件中会有所有源代码) <span style=& ...