当前位置: 首页 > 软件库 > 程序开发 > 游戏开发包 >

gonet2

游戏服务器骨架
授权协议 MIT
开发语言 Google Go
所属分类 程序开发、 游戏开发包
软件类型 开源软件
地区 国产
投 递 者 马俊
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

gonet/2是新一代游戏服务器骨架,基于go语言开发,采用了先进的http/2作为服务器端主要通信协议,以microservice作为主要思想进行架构,采用docker作为服务发布手段。相比第一代gonet,基础技术选型更加先进,结构更加清晰易读可扩展。

相关文档

  1. ROADMAP.md -- 开发计划

  2. TOOLCHAIN.md -- 工具链

  3. INSTALL.md -- 安装

为什么用microservice架构?

业务分离是游戏服务器架构的基本思路,通过职能划分,能够更加合理的调配服务器资源。 资源的大分类包括,IO,CPU,MEM,BANDWIDTH, 例如常见的情景:

IO: 如: 数据库,文件服务,消耗大量读写        CPU: 如: 游戏逻辑,消耗大量指令        MEM: 如: 分词,排名,pubsub, 消耗大量内存   BANDWIDTH: 内网带宽高,外网带宽低,物理上越接近的,传输速度越高

玩家对每种服务的请求量有巨大的不同,比如逻辑请求100次,分词请求1次,所以,没有必要1:1配置资源,通过microservice方式分离服务,可以根据业务使用情况,按需配置服务器资源。当服务容量增长,如果在monolithic的架构上做,即全部服务揉在一起成一个大进程,会严重浪费资源,比如大量内存被极少被使用的模块占用, 更严重的问题是,单台服务器的资源不是无限制的,虽然目前顶级配置的服务器可以安装高达96GB的内存,但也极其昂贵,部署量大的时候,产生的费用也不容小觑。

为什么选HTTP/2?

为了把所有的服务串起来,必须满足的条件有:
1. 支持一元RPC调用 (一般的请求/应答模式,类似于函数调用)
2. 支持服务器推送(例如pubsub服务,异步通知)
3. 支持双向流传递 (网关透传设备数据包到后端,后端应答数据经过网关返回到设备)

我们暂不想自己设计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 帧封装

+-----------------------------------------------+    |                 Length (24)                   |    +---------------+---------------+---------------+    |   Type (8)    |   Flags (8)   |    +-+-------------+---------------+-------------------------------+    |R|                 Stream Identifier (31)                      |    +=+=============================================================+    |                   Frame Payload (0...)                      ...    +---------------------------------------------------------------+                          Figure 1: Frame Layout

基本服务模型

+             |             +--------------> auth             |             +----> game1             |agent1+------>             |             +----> game2             |                +agent2+------>                +-----> snowflake             |                |             +----> game3+---->             |                |             |                +-----> chat             ++               |                              +-----> rank                              +

使用方式假定为:

  1. 前端用两个部署在不同物理服务器上的agent服务接入,无状态,客户端随机访问任意一台agent接入,比如使用DNS round-robin方式连接。

  2. agent和auth配合处理完鉴权等工作后,数据包透传进入game进行逻辑处理。如果有多台game服务器,那么用户需要指定一个映射关系(userid->server_id),用来将玩家固定联入某台game服务器。

  3. game和各个独立service通信,配合处理逻辑。service如果是无状态的,默认采用round-robin方式请求服务,如果是带状态的,则根据标识联入指定服务器。

具体的服务描述以及使用案例,请进入各个目录中阅读。

所有服务都依赖的一个基础服务是nsqd,用来做分布式日志收集,所有的服务会把日志发送到本地的nsqd,通过nsqlookupd管理nsqd拓扑,通过tailn工具或nsq_tail,可以集中收集格式化的日志(json)数据,消息主题为LOG。

游戏中的归档日志(REDOLOG),也会通过nsqd发布,并通过arch服务自动归档,消息主题为REDOLOG。

nsqd部署的方式为: 每个服务器实例部署一个

实际项目中怎么使用gonet/2?

clone下来慢慢改,不提供插件接口式的可升级模块,gonet/2只提供关键通路和demo,我不想做一个侵入式的骨架,只想在架构层面提供一个我认为比较优秀的思路并在此基础上努力做到整体最优。

游戏模块

进入每个服务阅读对应文档
1. agent: 网关
2. game: 游戏逻辑
3. snowflake: UUID发生器
4. chat: 聊天服务
5. auth: 鉴权,登陆环节
6. libs: 公共组件包
7. rank: 排名服务
8. geoip: IP归属查询
9. arch: 归档服务
10. bgsave: 与redis结合的存档服务
11. wordfilter: 脏词过滤服务

基础设施

design

术语:

  1. coordinator -- zk, etcd这种分布式一致性服务

  2. message backbone -- 服务器件消息总线,通常为pub/sub模式,数据密集

实现:

  1. nsq

  2. etcd

基础设施是用于支撑整个架构的基石,选择nsq, etcd的理由是:

  1. 全部采用go实现,技术栈统一

  2. nsq在bitly商用效果很好,能支持大规模的,高可用(特别是发生网络分区)的分布式应用

  3. etcd是coreos出品的coordinator, 已经得到大面积的使用,有成功案例,配套完善。

链接

PS. 感谢热心网友对源码的解读

资料

  • 上一篇blog是关于gRPC框架的基本使用,如果说gRPC只是远程发几个参数,那和一个普通的http请求也没多大差别了。所以今天我就来学习一下gRPC高级一点的使用方法。流! 流可以根据使用方法,分为单向和双向: 单向 – Client->Server – Server->Client 双向 – Client<=>Server 下面是一个新的例子,三种服务分别使用了几种流服务方式: 1. 参数表示

  • Gonet2中,大量使用了gRPC,而对这个我不熟,所以这里花点时间了解一下。当然,环境我已经配好了,这里只是讲代码上如何使用,环境的搭建,网上应该蛮多。不过用gRPC要用科学的方式上网,这个对我华厦民族的同胞们,应该都不陌生了。 远程调用,一开始我想的很复杂,但是真的了解过之后,无非是,server side提供一个开方的接口,公开调用时传送数据的格式,client side遵照这种规定,调用接

  • 目录 Socket 编程 Socket 编程的流程: 建立 Socket 绑定 Socket 监听 Socket 接受连接请求 接收数据 Golang bulid-in 的 net 库对此流程进行了抽象和封装。无论我们期望使用什么协议建立什么形式的连接,都只需要调用 net.Dial() 即可。 net.Dial() 支持的协议类型: tcp tcp4 tcp6 udp udp4 udp6 ip

  •  发送请求,通过内置http服务, 对象转换json //定义结构体 type AuthVar struct { Expirems string } //strconv.FormatInt(expirems,10) 可以将int64转换为string a := AuthVar{Expirems: strconv.FormatInt(expirems,10)} b := new(byt

  • 之前用go写了个web服务器,因为用的是RESTFul的URL方式收发消息,所以必然会涉及到解析消息body。 先贴代码。只贴需要的部分,其他的就不贴了,关于怎么用go创建restful复位,我的其他帖子里面有写。 package main import ( "encoding/json" "fmt" "io/ioutil" "net/http" ) //msgNode 222 typ

  • 01 设置WriteHeader的顺序问题 之前遇到个问题,在一段代码中这样设置WriteHeader,最后在header中取Name时怎么也取不到。 w.WriteHeader(201) w.Header().Set("Name", "my name is smallsoup") 用 golang 写 http server 时,可以很方便可通过 w.Header.Set(k, v) 来设置

  • package main import "fmt" type MHandler interface { ServeMyHTTP(req string, res string) } type MHandlerFunc func(req string, res string) func (f MHandlerFunc) ServeMyHTTP(req string, res string)

  • 原文地址,转载请注明出处: https://blog.csdn.net/qq_34021712/article/details/109907490  ©王赛超 go 版本 go version go1.15.1 darwin/amd64 一. 搭建简单的web服务器 对于Go,实现一个最简单的http server用不着几行代码,如下: func main() { http.HandleF

  • 1. 前言:(Cookie里的信息只保留在浏览器端) Http协议是无状态的,所以要用到Cookie 来保存信息 Cookie 是保存在浏览器端 Cookie : 1、浏览器第一次向服务器发起请求,服务器创建Cookie (Cookie是服务端创建的) 2、服务器将创建的Cookie ,通过Response.Header (响应头),响应给浏览器。 3、服务器在

  • 生命不止,继续Go go go~~~ 很显然,json广泛应用在客户端和服务端之间的数据交换。 之前介绍了go中的net/http package 和 encoding/json package,那我们今天就将二者结合,介绍一下在net/http的操作中如何使用JSON。 定义一个结构 包含了两个字段,id和balance: type User struct{ Id string

  • 理解 HTTP 构建的网络应用只要关注两个端—客户端(clinet)和服务端(server),两个端的交互来自 clinet 的 request,以及server端的response。所谓的http服务器,主要在于如何接受 clinet 的 request,并向client返回response。 接收request的过程中,最重要的莫过于路由(router),即实现一个Multiplexer器。G

  •     在线上部署的一个程序,在某天突然在一天内出现多次 “dial tcp: lookup xxxx.com on 223.x.x.x:53: read udp 180.x.x.x:7792->223.x.x.x:53: i/o timeout” 的问题,导致线上告警触发了多次。后面查找问题,发现 go 每次发起 http 请求都会发起一个 dns 请求来进行域名解析,而我们服务器的dns服务器

  • 在go语言标准库中,net包提供了可移植的网络I/O接口,包括TCP/IP、UDP、域名解析和Unix域socket。本文向大家介绍net标准库的使用,希望对你有帮助。 一、 服务端 1. 解析地址 在TCP服务端我们需要监听一个TCP地址,因此建立服务端前我们需要生成一个正确的TCP地址,这就需要用到下面的函数了。 // ResolveTCPAddr函数会输出一个TCP连接地址和一个错误信息 f

  • 生命不止,继续go go go!!! 不要问我net包和net/http包的区别,我们先会用,两者的区别慢慢去体会。 net包有什么作用? Package net provides a portable interface for network I/O, including TCP/IP, UDP, domain name resolution, and Unix domain sockets.

  • /** * Created by Administrator on 13-12-9. */ package main import ( "fmt" "os" "net" ) /** * 将string类型的ip地址转换为IP对象 */ func main() { name := "192.168.1.97" ip := net.ParseIP(name) if ip

  • 1.简介 在1.6或以上版本的Go语言中,如果使用HTTPS模式启动服务器,那么将默认使用HTTP2。 在默认情况下,版本低于1.6的Go语言将不会安装http2包,则需要安装: go get golang.org/x/net/http2 2.实现 package main import ( "fmt" "net/http" "golang.org/x/net/http2" ) fun

 相关资料
  • 我试图建立一个通用服务器总是在连接的客户端。 该体系结构由4个主要组件组成 有状态应用服务器 无状态网关服务器 客户排队 系统和经纪人 工艺流程 客户端连接到网关 我正在使用JavaNetty作为网关。appserver也是用Java编写的。 我很想说这个设计像Mongrel2,但我不能完全确定。我想说,这更符合城市飞艇氦边缘服务器的设计(http://urbanairship.com/blog/

  • JAGS 游戏服务器是一个开源的 Java / AS 3.0 的游戏服务器,支持多玩家、碰撞检测以及键盘事件等等。

  • 二本鼠鼠学Java没出路。。 技术面 - 50min - 9.26 自我介绍 介绍一下你的项目经历 MySQL索引底层结构 Redis有哪些数据结构 Redis的持久化机制 学过其他语言吗(c++和go),说一下c++、go、Java的区别 LRU怎么实现 最短路径算法实现 JVM垃圾回收算法 手撕在一排数据中算出不重复数据的子集 TCP三次握手 你知道什么是SYN攻击吗 TCP四次挥手为什么是四

  • 过年回上海裸辞出去玩了一个月,5月回来找的工作,正好现在有时间了,抽空写一下社招面经,有些已经忘记了。裸辞还是太冲动了,菜鸡不配gap,两年工作经验不应该随便裸辞,还是太年轻、太狂妄了。当年校招腾讯、祖龙、小米等等offer随便拿,以为社招还跟校招一样简简单单,结果现在只能去个小公司养老了。 巨人网络(球球大作战) golang游戏后端,线下1、2、3面一起的 一面 项目架构图 pb的底层实现结构

  • 我正在尝试构建一个使用套接字和udp协议的python在线游戏。我创建了一个多处理和多线程服务器:https://pastebin.com/zucxwpc9。 我会解释里面的代码是做什么的。所以首先,它等待两个请求,并将它们放入lobby列表中。如果发出了两个请求,服务器将向客户端发送一个新端口,并创建一个具有两个线程的新进程。两个线程都在使用新端口,一个接收数据,另一个发送数据。我正在使用队列,

  • 最后,是否可以重复使用相同的runnable(每个游戏会话1个),而不是每回合创建一个新的。

  • 我试图建立一个通用服务器总是在连接的客户端。 该体系结构由4个主要组件组成 有状态应用程序服务器 工艺流程 客户端连接到网关 我正在使用JavaNetty作为网关。appserver也是用Java编写的。 我很想说这个设计像Mongrel2,但我不能完全确定。我想说,这更符合城市飞艇氦边缘服务器的设计(http://urbanairship.com/blog/2010/08/24/c500k-in

  • 面试时间:8.15 原神组(原神,启动!) 八股: 虚函数、虚析构函数 智能指针 右值引用、移动语义 编译、链接过程 字节序、如何判断当前环境字节序 线程同步 锁 栈、队列、相互实现 图、树 最短路径算法 AVL树、红黑树 IO多路复用 手撕: atoi(考虑各种边界条件) 实习: 没问 第2天感谢信。。。