Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >einx: 一个用Go构建的游戏服务器

einx: 一个用Go构建的游戏服务器

作者头像
李海彬
发布于 2018-12-05 03:45:43
发布于 2018-12-05 03:45:43
2K00
代码可运行
举报
文章被收录于专栏:Golang语言社区Golang语言社区
运行总次数:0
代码可运行

原文作者:Cyinx

einx

a framework in golang for game server or app server.

a example server for einx (https://github.com/Cyinx/game_server_einx)


einx 是一个由 golang 编写的用于游戏服务器或者应用服务器的开源框架。

设计核心:

  • 模块与组件的组合机制,模块是逻辑核心。
  • lua脚本
  • 按业务分离逻辑

  • einx/db 组件化数据库相关操作
  • einx/network 组件化网络IO,目前只支持TCP
  • einx/log 异步日志库
  • einx/timer 时间轮定时器
  • einx/module 模块
  • einx/component 组件
  • einx/lua 脚本相关操作

模块与组件

每个模块有且仅有一个goroutine用于处理被投递到本模块中的消息,在模块中的逻辑不需要考虑同步问题,简化了逻辑开发难度,模块与模块之间可以通过RPC交互

使用 einx 搭建一个简单的服务器

首先安装 einx

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git clone https://github.com/Cyinx/einx.git

创建一个简单的einx例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package mainimport (	"github.com/Cyinx/einx"
	"github.com/Cyinx/einx/slog")func main() {
	slog.SetLogPath("log/game_server/")
	slog.LogInfo("game_server", "start server...")
	slog.LogInfo("game_server", "hello world...")
	einx.Run()
	einx.Close()
}

einx的核心是module,module中可以添加各种component作为组件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Cyinx/einx/network	网络相关的component
Cyinx/einx/db		数据库相关的component

创建一个TCPServer的component管理器:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package clientmgrimport (	"github.com/Cyinx/einx"
	"github.com/Cyinx/einx/slog"
	"msg_def")type Agent = einx.Agenttype AgentID = einx.AgentIDtype EventType = einx.EventTypetype Component = einx.Componenttype ComponentID = einx.ComponentIDtype ClientMgr struct {
	client_map map[AgentID]Agent
	tcp_link   Component}var Instance = &ClientMgr{
	client_map: make(map[AgentID]Agent),
}func (this *ClientMgr) GetClient(agent_id AgentID) (Agent, bool) {	client, ok := this.client_map[agent_id]	return client, ok
}func (this *ClientMgr) OnLinkerConneted(id AgentID, agent Agent) {
	this.client_map[id] = agent //新连接连入服务器}func (this *ClientMgr) OnLinkerClosed(id AgentID, agent Agent) {	delete(this.client_map, id) //连接断开}func (this *ClientMgr) OnComponentError(c Component, err error) {

}func (this *ClientMgr) OnComponentCreate(id ComponentID, component Component) {
	this.tcp_link = component
	component.Start()
	slog.LogInfo("tcp", "Tcp sever start success")
}

创建一个逻辑module,并将TcpServer管理器加入到module之中,服务器就可以启动,并监听2345端口的请求

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package mainimport (	"clientmgr"
	"github.com/Cyinx/einx"
	"github.com/Cyinx/einx/slog")var logic = einx.GetModule("logic")func main() {
	slog.SetLogPath("log/game_server/")
	logic.AddTcpServer(":2345", clientmgr.Instance)
	slog.LogInfo("game_server", "start server...")
	einx.Run()
	einx.Close()
}

注册消息handler与Rpc: 注册消息handler需要事先注册一个Message:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package msg_defimport (	"github.com/Cyinx/einx/network"
	"protobuf_gen")type VersionCheck = pbgen.VersionCheckvar VersionCheckMsgID = network.RegisterMsgProto(uint16(pbgen.MainMsgID_GENERAL_MSG),	uint16(pbgen.HandlerMsgID_VERSION_CHECK),
	(*VersionCheck)(nil))

在注册RPC时,使用字符串作为RPC名,注册handler时,需要使用之前注册的MsgID

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import (	"msg_def")var logic = einx.GetModule("logic")func InitDBHandler() {
	logic.RegisterRpcHandler("testRpc", testRpc)
	logic.RegisterHandler(msg_def.VersionCheckMsgID, CheckVersion)
}func testRpc(sender interface{}, args []interface{}) {

}func CheckVersion(agent Agent, args interface{}) {	version_check_msg := args.(*msg_def.VersionCheck)	
}

注册定时器使用module.AddTimer函数,返回值为timerID,如果要提前停止timer,可以执行module.RemoveTimer(timerid):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import (	"msg_def")var logic = einx.GetModule("logic")var testTimerID uint64 = 0func InitDBHandler() {
	logic.RegisterRpcHandler("testRpc", testRpc)
	logic.RegisterHandler(msg_def.VersionCheckMsgID, CheckVersion)
}func testRpc(sender interface{}, args []interface{}) {	if testTimerID != 0 {
	  logic.RemoveTimer(testTimerID)
	}
}func TestTimer(args []interface{}) {
	testTimerID = 0}func CheckVersion(agent Agent, args interface{}) {	version_check_msg := args.(*msg_def.VersionCheck)	
	testTimerID = logic.AddTimer(1000,TestTimer,1,2,"测试")
}

版权申明:内容来源网络,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知,我们会立即删除并表示歉意。谢谢。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-10-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Golang语言社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Go开源游戏服务器框架——Pitaya
Pitaya是一款由国外游戏公司topfreegames使用golang进行编写,易于使用,快速且轻量级的开源分布式游戏服务器框架 Pitaya使用etcd作为默认的服务发现组件,提供使用nats和grpc进行远程调用(server to server)的可选配置,并提供在docker中运行以上组件(etcd、nats)的docker-compose配置
歪歪梯
2020/09/24
8.1K0
Leaf 游戏服务器框架简介
下载地址: https://github.com/name5566/leaf/blob/master/TUTORIAL_ZH.md Leaf 游戏服务器框架简介 Leaf 是一个由 Go 语言(golang)编写的开发效率和执行效率并重的开源游戏服务器框架。Leaf 适用于各类游戏服务器的开发,包括 H5(HTML5)游戏服务器。 Leaf 的关注点: 良好的使用体验。Leaf 总是尽可能的提供简洁和易用的接口,尽可能的提升开发的效率 稳定性。Leaf 总是尽可能的恢复运行过程中的错误,避免崩溃 多核支持。
李海彬
2018/03/26
2.5K0
探索 Golang 云原生游戏服务器开发,5 分钟上手 Nano 游戏服务器框架
nano 是一个轻量级的服务器框架,它最适合的应用领域是网页游戏、社交游戏、移动游戏的服务端。当然还不仅仅是游戏,用 nano 开发高实时 web 应用也非常合适。
为少
2021/05/27
7.8K0
探索 Golang 云原生游戏服务器开发,5 分钟上手 Nano 游戏服务器框架
社区leaf学习笔记|03. 调试Game、Login模块收发消息
本节给大家带来的是关注Game、Login网关模块的消息收发调试。 main.go 代码如下: package main import ( "flag" "server/conf" "server/game" "server/gate" "server/login" _ "time" _ "FenDZ/glog-master" _ "github.com/dop251/goja" // JS 解析器 "github.com/name55
李海彬
2018/07/26
6140
社区leaf学习笔记|03. 调试Game、Login模块收发消息
游戏服务器框架 Leaf/go
Leaf 是一个使用 Go 语言开发的开源游戏服务器框架,注重运行效率 并追求极致的开发效率。Leaf 适用于几乎所有的游戏类型。其主要的特性: * 良好的使用体验。Leaf 总是尽可能的提供简洁和易用的接口,尽可能的提升开发的效率 * 稳定性。Leaf 总是尽可能的恢复运行过程中的错误,避免崩溃 * 多核支持。Leaf 通过模块机制和 leaf/go 尽可能的利用多核资源,同时又尽量避免各种副作用 * 良好的模块支持。 一个 Leaf 开发的游戏服务器由多个模块组成(例如 LeafServer),模块有以
李海彬
2018/03/22
5.8K0
探索使用 Golang 和 Webassembly 构建一个多人游戏服务器
https://www.youtube.com/watch?v=ZyGw1yLNO9E(原创整理) 什么是 WebAssembly?由 Google、Microsoft、Mozilla、Apple 等
为少
2021/05/27
1.2K0
探索使用 Golang 和 Webassembly 构建一个多人游戏服务器
探索 Nano 内置分布式游戏服务器方案测试用例
How to build distributed system with Nano
为少
2021/05/27
9730
探索 Nano 内置分布式游戏服务器方案测试用例
Python构建企业微信自动消息转发服务端
目前有在项目分组,就小组成员中,微信群消息回复较多的情况下,想根据组来转发特定消息,包含文字、图片、语言等。在此只是自己实现仅供参考,可以根据自身需求修改更多功能。
KaliArch
2018/08/10
3.4K0
Python构建企业微信自动消息转发服务端
社区leaf学习笔记|06. 游戏玩家注册、登陆(中)
上节课已经实现了消息的定义及消息的注册,将Leaf框架的结构做了部分功能文件的添加;更符合后面开发者快速熟悉的文件结构。
李海彬
2018/07/26
8930
社区leaf学习笔记|06. 游戏玩家注册、登陆(中)
golang 源码阅读之会议系统ion part I
https://github.com/pion/ion是用go实现的会议系统,它基于go实现的消息队列nats 和redis,官网文档https://pionion.github.io/docs/awesome-ion/awesome-ion很简明扼要,本地搭建:
golangLeetcode
2022/08/03
5090
卡牌类游戏游戏大厅——上篇
通常在打开一个游戏后的基础流程包括登录/注册->选择游戏区域->认证->进入大厅->选择房间/建立房间->进入房间->等待游戏/建立游戏->游戏中。以上环节中,游戏大厅包含了登录和进入游戏前的策略,针对其中的每一环节都需要思考其中的实现细节,今天阿巩将以卡牌类游戏为例,来看实现一个游戏大厅的流程及需要注意的细节。It will all be okay,日拱一卒,我们开始吧!
才浅Coding攻略
2022/12/12
1.2K0
卡牌类游戏游戏大厅——上篇
探索 Golang 云原生游戏服务器开发,根据官方示例实战 Gorilla WebSocket 的用法
服务器应用程序定义两种类型,Client 和 Hub。服务器为每个 websocket 连接创建一个 Client 类型的实例。 Client 充当 websocket 连接和 Hub 类型的单个实例之间的中介。Hub 维护一组注册的客户端,并向客户端广播消息。
为少
2021/05/27
1.8K0
探索 Golang 云原生游戏服务器开发,根据官方示例实战 Gorilla WebSocket 的用法
社区leaf学习笔记|01. leaf开源游戏服务器搭建
Leaf 是一个由 Go 语言(golang)编写的开发效率和执行效率并重的开源游戏服务器框架。Leaf 适用于各类游戏服务器的开发,包括 H5(HTML5)游戏服务器。
李海彬
2018/07/26
1.5K0
社区leaf学习笔记|01. leaf开源游戏服务器搭建
探索 Golang 云原生游戏服务器开发,硬核实战之调试 NanoServer 生产级麻将游戏服务器
因为 nanoserver 使用了 xorm,它会自动的根据定义的 model 生成数据库表 schema。
为少
2021/05/27
1.5K0
探索 Golang 云原生游戏服务器开发,硬核实战之调试 NanoServer 生产级麻将游戏服务器
[Golang]从0到1写一个web服务(上)
学生时代曾和几个朋友做了一个笔记本小应用,当时我的角色是pm + dba,最近心血来潮,想把这个玩意自己实现一遍,顺便写一篇文章记录整个过程。
薯条的编程修养
2022/08/10
7490
[Golang]从0到1写一个web服务(上)
通过 Netty、ZooKeeper 手撸一个 RPC 服务
使用 Netty、ZooKeeper 和 Spring Boot 手撸一个微服务框架。
Yano_nankai
2021/05/08
1.2K0
通过 Netty、ZooKeeper 手撸一个 RPC 服务
教你从头写游戏服务器框架(3)
使用异步非阻塞编程,确实能获得很好的性能。但是在代码上,确非常不直观。因为任何一个可能阻塞的操作,都必须要要通过“回调”函数来链接。比如一个玩家登录,你需要先读数据库,然后读一个远程缓冲服务器(如 redis),然后返回登录结果:用户名、等级……在这个过程里,有两个可能阻塞的操作,你就必须把这个登录的程序,分成三个函数来编写:一个是收到客户端数据包的回调,第二个是读取数据库后的回调,第三个是读取缓冲服务器后的回调。
韩伟
2019/05/08
2.9K3
教你从头写游戏服务器框架(3)
h2engine游戏服务器设计之聊天室示例
h2engine引擎建群以后,有热心网友向我反馈,想尝试h2engine但是没有服务器开发经验觉得无从入手,希望我能提供一个简单明了的示例。由于前一段时间工作实在忙碌,一直没有抽出时间好好写一下,后来抽空写了出来,自己从小白开发者的角度重新审视了一遍h2engine,自己也收获匪浅,也优化了部分h2engine的架构,使其更易使用。以前的例子都是c++加脚本的例子,这次写一个纯c++的例子。
知然
2018/08/01
7330
如何构建一个多人(.io) Web 游戏,第 1 部分
原文:https://victorzhou.com/blog/build-an-io-game-part-1
为少
2021/05/27
1.5K0
如何构建一个多人(.io) Web 游戏,第 1 部分
如何用Python内置模块构建简单的REST服务、RPC服务
傍晚时分,坐在屋檐下,看着天慢慢地黑下去,心里寂寞而凄凉,感到自己的生命被剥夺了。当时我是个年轻人,但我害怕这样生活下去,衰老下去。在我看来,这是比死亡更可怕的事。--------王小波
山河已无恙
2023/01/30
1.2K0
如何用Python内置模块构建简单的REST服务、RPC服务
推荐阅读
相关推荐
Go开源游戏服务器框架——Pitaya
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验