/**

* @brief 集群中心客户端

* 每个 DenOS 进程启动时,都会向 ZooKeeper 注册自己的服务。

* 此类型的对象,就是作为每个进程中,代表集群中心的存在。

* ZooKeeper 默认根据 2 个 tick (心跳),大概为 3 秒,是否收到,来决定客户端是否死掉。

* 在 DenOS 中,可以使用配置项目 ZK_RECV_TIMEOUT 参数(单位为毫秒)来决定这个超时时间。

*/

class

Center

:

public

ZooKeeperMap

{

friend

void

ContractsWatcher(zhandle_t

* zh,

int type,

int state,

const

char

* path,

void

* watcherCtx);

public:

int last_error_code_;

// 用来测试最后一个操作是否成功的变量

std: :map < std: :string,

std: :string > service_process_;

// key: 服务名字,value  服务节点名字

/**

* @brief 构造一个集群中心客户端

* @param urls ZooKeeper 的连接参数,形如:"127.0.0.1:2181,10.1.2.3:2182,192.168.3.23:2183"

*/

Center(const std: :string & urls =

"127.0.0.1:2181");

virtual

~Center();

/// 驱动整个异步流程

virtual

int

Update();

/**

* 往集群中声明注册服务

* @param name 服务的名字

* @param contract 服务的通信方式

* @return 返回 0 表示已经发起注册流程,其他值表示失败

*/

int

RegisterService(const std: :string & name,

const

Contract & contract);

/**

* @brief 注册一个类作为对应协议字符串名字

* 如果这个类是 Connector 的子类,必须要有一个形如 XXConnector(const string& p1, int p2) 这样的构造器。

* 或者这个类是 Protocol 的子类,必须要有一个无参数构造器。

* @param reg_name 协议字符串名字,如 tcp/udp/kcp/tconnd 或者 tlv/line/tdr

*/

template < typename T >

void

RegProto(const std: :string & reg_name)

{

if

(reg_name.empty())

return;

constructors_[reg_name]

=

new

DefaultConstructor < T > ();

}

template < typename T >

void

RegConn(const std: :string & reg_name)

{

if

(reg_name.empty())

return;

constructors_[reg_name]

=

new

StrIntConstructor < T > ();

}

/**

* @brief 查询一个服务去发起请求

* 注意这是一个异步的接口,有可能会返回 -1 表示服务合同还未拿到。需要重复的去获取。

* @param name 服务的名字

* @param callback 当获得对应的服务的客户端的回调

* @param client_cb 预期每个新的 Client 所注册的默认回调,用来接收连接、中断、收听通知。

* @param route_param 用来传给路由器的自定义路由相关数据

* @return  如果返回 0 表示成功,失败则会是其他数值

*/

int

QueryService(const std: :string & name,

GetServiceClientCallback * callback,

ClientCallback * client_cb = NULL,

Router * router = NULL,

void * route_param = NULL);

/**

* 根据合同缓存获得客户端对象

* @param cache 合同缓存对象

* @param client_cb 预期每个新的 Client 所注册的默认回调,用来接收连接、中断、收听通知。

* @param router 路由器对象

* @param route_param 路由参数

* @return 客户端对象指针,无需主动 delete,因为会缓存起来

*/

Client *

GetClientByContracts(ContractCache * cache,

ClientCallback * client_cb,

Router * router,

void * route_param);

/**

* 获得存放集群的 ZK 基础路径

* @return ZNode 基础路径

*/

inline

const std: :string & cluster_prefix()

const

{

return CLUSTER_PREFIX;

}

/**

* 获得建立进程用的 ZK 标记 (Create flags)

* @return zk 的 create flags

*/

inline

int process_flags()

const

{

return process_flags_;

}

/// 在 ZK 写入本进程对此服务的合约

void

AddProcessContract(const std: :string & service_name,

const std: :string & contract_data);

/// 清理相关对象

void

CloseClient(Client * client);

void

SetContractsCache(const std: :string & service_name,

ContractCache * cache);

/*---------------------------------- 继承自 ZooKeeper 为了实现功能用 -----------------------------------*/

/// 建立存储节点父目录时,增加一个监听器,监听这些节点增加和删除变化

virtual

void

CreatePrefixNode();

/// 初始化 zookeeper 客户端连接,会修改 ZKMAP_KEY_PREFIX 为集群专用路径

virtual

int

Init(Config * config = NULL);

/**

* 清理掉生成的客户端对象

* @param client 客户端对象

* @param content 相关的服务名字

*/

void

ClearClientMember(Client * client,

const std: :string & content);

};

路由器自动选择游戏服务器,教你从头写游戏服务器框架(3)相关推荐

  1. 包含对象名字的游戏id_教你从头写游戏服务器框架(三)

    关于作者:韩伟,腾讯互娱高级工程师,目前在Next产品中心研发创新类型游戏. 本文为系列文章的第 3篇 第一篇:教你从头写游戏服务器框架(1) 第二篇:教你从头写游戏服务器框架(2)   协  程   ...

  2. 包含对象名字的游戏id_教你从头写游戏服务器框架(3)

    Tencent Cloud Coffee Class 面向开发者人群,打造圈层技术影响力. 使用异步非阻塞编程,确实能获得很好的性能.但是在代码上,确非常不直观.因为任何一个可能阻塞的操作,都必须要要 ...

  3. 教你从头写游戏服务器框架

    本文由云+社区发表 作者:韩伟 前言 大概已经有差不多一年没写技术文章了,原因是今年投入了一些具体游戏项目的开发.这些新的游戏项目,比较接近独立游戏的开发方式.我觉得公司的"祖传" ...

  4. 教你从头写游戏服务器框架 1

    本文由云+社区发表 作者:韩伟 前言 大概已经有差不多一年没写技术文章了,原因是今年投入了一些具体游戏项目的开发.这些新的游戏项目,比较接近独立游戏的开发方式.我觉得公司的"祖传" ...

  5. golang游戏服务器框架_教你从头写游戏服务器框架

    需求 由于"越通用的代码,就是越没用的代码",所以在设计之初,我就认为应该使用分层的模式来构建整个系统.按照游戏服务器的一般需求划分,最基本的可以分为两层: 底层基础功能:包括通信 ...

  6. python写安卓游戏_10分钟学会python写游戏脚本!Python其实很简单

    前言 最近在玩儿公主连结,之前也玩儿过阴阳师这样的游戏,这样的游戏都会有个初始号这样的东西,或者说是可以肝的东西. 当然,作为一名程序员,肝这种东西完全可以用写代码的方式帮我们自动完成.游戏脚本其实并 ...

  7. 安卓模拟器网页游戏连不上服务器,教大家夜神模拟器游戏无法联网的原因和解决方法...

    近日有关于夜神模拟器游戏无法联网的原因和解决方法的问题受到了很多网友们的关注,大多数网友都想要知道夜神模拟器游戏无法联网的原因和解决方法的具体情况,那么关于到夜神模拟器游戏无法联网的原因和解决方法的相 ...

  8. win7修复rpc服务器,教你win7系统rpc服务器不可用怎么办

    用户在使用电脑进行时间同步,安装打印机或者其它的操作的时候可能会遇到同样一个问题,那就是提示"RPC服务器不可用",很多朋友可能对于RPC并不了解,更不知道如何解决,下面,小编就来 ...

  9. PAC自动代理文件格式,教你如何写PAC文件

    前些天,同事给我抱怨,公司的GPO强制更改了笔记本的IE代理服务器,在办公室还好,一回家就上不了网了,必须手动更改代理设置,真是麻烦.我想了想,proxy.pac自动代理文件应该可以解决这个问题,于是 ...

最新文章

  1. 让 PyTorch 更轻便,这款深度学习框架你值得拥有!在 GitHub 上斩获 6.6K 星
  2. 逆天通用水印支持Winform,WPF,Web,WP,Win10。支持位置选择(9个位置 ==》[X])...
  3. python 多进程异常处理
  4. web基础html元素制作web
  5. java转日期_Java时间日期格式转换
  6. mongodb连接认证失败
  7. Mac突然连不上WiFi
  8. SQL Sever — 查询前10%的数据、查询并参与计算显示出数据、查询前10行数据、多重升序降序查询、去掉重复值、替换列名显示
  9. Adobe Reader 的直接下载地址
  10. 条形码jsbarcode
  11. 在altium designer原理图中如何查找相同的网络标号?
  12. YOLOv5 对决 Faster RCNN,谁赢谁输?(转载)
  13. js修改伪元素的属性、styleSheets获取样式表,Failed to read the 'cssRules' property from 'CSSStyleSheet' Cannot acces
  14. AdGuard常规设置的介绍
  15. 定风波·三月七日沙湖道中遇雨
  16. 宝宝的肚子看起来是鼓鼓胀胀
  17. 【vue-router源码】十二、useRoute、useRouter、useLink源码分析
  18. springboot高校学习资源共享系统java
  19. ipad可以使用其他品牌的手写笔吗?apple pencil一代平替笔
  20. Tomcat启动报异常:com.sun.org.apache.xerces.internal.util.URI$MalformedURIException: Path contains invalid

热门文章

  1. 2022 年 1-6 月墨天轮最受欢迎的 25 篇原创技术文章
  2. AH8669\AH599L/AH8670C/AH8652振邦微长期供应
  3. threejs实现3d全景看房
  4. 氢os 7android 5次 n,一加7 Pro推送氢OS 9.5.7.GM21更新:新增侧滑返回手势
  5. c语言编程如何建立空工程,CFree怎么创建工程 新建一个C++就是这么简单
  6. miui9耗电量android os,小米9更新MIUI10之后,耗电问题怎么解决?这3个原因必须了解...
  7. 与人体共鸣的音乐才能称之为好音乐
  8. 大话光存储(1)光存储基本原理
  9. JAVA高考加油,高考加油句子
  10. 数据结构(二)模拟停车场程序的实现