einx: 一个用Go构建的游戏服务器-阿里云开发者社区

开发者社区> 技术小能手> 正文

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

简介:
+关注继续查看

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

git clone https://github.com/Cyinx/einx.git

创建一个简单的einx例子:


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作为组件:


Cyinx/einx/network 网络相关的component
Cyinx/einx/db 数据库相关的component

创建一个TCPServer的component管理器:


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端口的请求


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:


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


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):


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
本文作者:Cyinx
本文来自云栖社区合作伙伴“Golang语言社区”,了解相关信息可以关注“Golang语言社区”。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器上如何部署 H5 游戏?
在自学游戏开发的路上,最有成就感的时刻就是将自己的小游戏做出来分享给朋友试玩,原生的游戏开可以打包分享,小游戏上线流程又长,那 H5 小游戏该怎么分享呢?本文就带大家通过 nginx 将构建好的 H5 游戏托管的阿里云上。
395 0
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
8693 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
10522 0
Firefly - 分布式游戏服务器端框架
Firefly 是免费、开源、稳定、快速扩展、能 “热更新”的分布式游戏服务器端框架,采用Python编写,基于 Twisted 框架开发。它包括了开发框架和数据库缓存服务等各种游戏服务器基础服务,节省大量游戏开发的工作时间,真正做到让使用者把精力放在游戏玩法逻辑上。
643 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
12340 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
11446 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
6654 0
如何用阿里云快速构建游戏发行技术体系
摘要:在2018云栖大会深圳峰会阿里云支持与服务专场上,由卓游技术总监张保峰带来了“如何用阿里云快速构建游戏发行技术体系”的主题分享,主要从三方面进行讲解,首先介绍了选择和阿里云合作的背景与需求,其次对如何在阿里云的基础上做到快速构建游戏发行技术,最后总结了阿里云带来的优势。
1859 0
+关注
技术小能手
云栖运营小编~
7208
文章
9
问答
来源圈子
更多
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载