a game server skeleton in microservice
gonet/2是新一代游戏服务器骨架,基于go语言开发,采用了先进的http/2作为服务器端主要通信协议,以microservice作为主要思想进行架构,采用docker作为服务发布手段。相比第一代gonet,基础技术选型更加先进,结构更加清晰易读可扩展。
业务分离是游戏服务器架构的基本思路,通过职能划分,能够更加合理的调配服务器资源。 资源的大分类包括,IO,CPU,MEM,BANDWIDTH, 例如常见的情景:
IO: 如: 数据库,文件服务,消耗大量读写
CPU: 如: 游戏逻辑,消耗大量指令
MEM: 如: 分词,排名,pubsub, 消耗大量内存
BANDWIDTH: 内网带宽高,外网带宽低,物理上越接近的,传输速度越高
玩家对每种服务的请求量有巨大的不同,比如逻辑请求100次,分词请求1次,所以,没有必要1:1配置资源,通过microservice方式分离服务,可以根据业务使用情况,按需配置服务器资源。当服务容量增长,如果在monolithic的架构上做,即全部服务揉在一起成一个大进程,会严重浪费资源,比如大量内存被极少被使用的模块占用, 更严重的问题是,单台服务器的资源不是无限制的,虽然目前顶级配置的服务器可以安装高达96GB的内存,但也极其昂贵,部署量大的时候,产生的费用也不容小觑。
为了把所有的服务串起来,必须满足的条件有:
我们暂不想自己设计RPC,一是目前RPC繁多,没必要重新发明轮子,二是作为开源项目,应充分融入社区,利用现有资源。我们发现目前http/2(rfc7540)满足以上所有条件,google推出的gRPC就是一个基于http/2的RPC实现,当前架构中,所有的服务(microservice)全部通过gRPC连接在一起。 http/2支持stream multiplex,即可以在同一条TCP连接上,传输多个stream(1:N),stream概念能够非常直观的1:1映射玩家双向数据流。
(请特别注意一点: HTTP/2仅用于服务器各个服务间的内部通信,和客户端的通信是自定义协议,位于:https://github.com/gonet2/tools/tree/master/proto_scripts)
附: HTTP/2 帧封装
+-----------------------------------------------+
| Length (24) |
+---------------+---------------+---------------+
| Type (8) | Flags (8) |
+-+-------------+---------------+-------------------------------+
|R| Stream Identifier (31) |
+=+=============================================================+
| Frame Payload (0...) ...
+---------------------------------------------------------------+
Figure 1: Frame Layout
+
|
|
+----> game1
|
agent1+------>
|
+----> game2
| +
agent2+------> +-----> snowflake
| |
+----> game3+---->
| |
| +-----> chat
++ |
+-----> rank
+
使用方式假定为:
具体的服务描述以及使用案例,请进入各个目录中阅读。
clone下来慢慢改,不提供插件接口式的可升级模块,gonet/2只提供关键通路和demo,我不想做一个侵入式的骨架,只想在架构层面提供一个我认为比较优秀的思路并在此基础上努力做到整体最优。
进入每个服务阅读对应文档
日志分析是通往数据驱动的关键步骤,内容过于庞大,暂留组建图于此,有机会再详谈。
术语:
基础设施是用于支撑整个架构的基石。
PS. 感谢热心网友对源码的解读