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 main import ( "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 clientmgr import ( "github.com/Cyinx/einx" "github.com/Cyinx/einx/slog" "msg_def" ) type Agent = einx.Agent type AgentID = einx.AgentID type EventType = einx.EventType type Component = einx.Component type ComponentID = einx.ComponentID type 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 main import ( "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_def import ( "github.com/Cyinx/einx/network" "protobuf_gen" ) type VersionCheck = pbgen.VersionCheck var 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 = 0 func 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语言社区”。
相关文章
|
26天前
|
数据采集 数据挖掘 Go
踏入网页抓取的旅程:使用 grequests 构建 Go 视频下载器
使用 Go 和 grequests 构建 Bilibili 视频下载器,结合爬虫代理 IP 提高下载稳定性与速度。通过获取视频信息、构建下载链接、设置代理IP及异步请求,实现视频的本地保存。代码示例展示了如何运用 grequests 请求选项配置代理及处理请求。
踏入网页抓取的旅程:使用 grequests 构建 Go 视频下载器
|
1月前
|
Go 调度 开发者
CSP模型与Goroutine调度的协同作用:构建高效并发的Go语言世界
【2月更文挑战第17天】在Go语言的并发编程中,CSP模型与Goroutine调度机制相互协同,共同构建了高效并发的运行环境。CSP模型通过通道(channel)实现了进程间的通信与同步,而Goroutine调度机制则确保了并发任务的合理调度与执行。本文将深入探讨CSP模型与Goroutine调度的协同作用,分析它们如何共同促进Go语言并发性能的提升。
|
1月前
|
负载均衡 Java 中间件
使用Go语言构建高性能Web服务
Go语言作为一种快速、高效的编程语言,其在构建高性能Web服务方面具有独特优势。本文将探讨如何利用Go语言开发和优化Web服务,以实现更高的性能和可伸缩性。
|
1月前
|
网络协议 Go 开发者
Go语言网络编程基础:构建高效、可靠的网络应用
【2月更文挑战第12天】本文将深入探讨Go语言在网络编程领域的基础知识,包括其强大的并发模型、网络库的使用、TCP/IP和HTTP协议的理解等。通过本文,读者将能够理解Go语言在网络编程中的优势,并掌握构建高效、可靠网络应用的核心技能。
|
2月前
|
搜索推荐 Go 开发者
Go模块与依赖管理:构建稳定、可维护的项目生态
【2月更文挑战第9天】Go模块是Go语言从1.11版本开始引入的一个新的依赖管理工具,它改变了以往通过GOPATH管理项目依赖的方式,为Go开发者带来了更加灵活、高效的依赖管理方式。本文将深入探讨Go模块与依赖管理的概念、使用方法和最佳实践,帮助读者更好地理解和应用Go模块,构建稳定、可维护的项目生态。
|
2月前
|
Go 开发者
Go语言包管理基础:构建高效、可维护的代码库
【2月更文挑战第9天】Go语言以其简洁、高效和并发的特性受到了开发者的广泛欢迎。在Go中,包(package)是组织和管理代码的基本单位。本文将深入探讨Go语言包管理的基础知识,包括包的定义、组织结构、导入导出规则等,帮助读者更好地理解和应用Go语言中的包管理机制,构建高效、可维护的代码库。
|
2月前
|
Go API 数据安全/隐私保护
Go语言标准库概览:构建高效、可靠的软件开发基石
【2月更文挑战第8天】Go语言标准库是Go语言生态系统的重要组成部分,它为开发者提供了一系列高效、可靠的工具和函数,帮助开发者构建高质量的软件应用。本文将对Go语言标准库进行概览,介绍其组成特点、设计哲学以及使用场景与优势,帮助读者更好地理解和应用Go语言标准库。
|
1月前
|
机器学习/深度学习 Python
Python基础:构建一个简单的Web服务器
Python基础:构建一个简单的Web服务器
54 1
|
1月前
|
JSON 缓存 中间件
Go语言网络编程:深入探索HTTP服务器开发
【2月更文挑战第12天】本文将详细探讨使用Go语言开发HTTP服务器的过程,包括HTTP协议的理解、Go标准库中`net/http`包的使用、路由处理、中间件、静态文件服务、JSON处理以及性能优化等方面。通过本文,读者将能够掌握构建高效、可扩展HTTP服务器的关键技术。
|
2月前
|
算法 安全 Go
Go语言标准库核心模块详解:构建高效应用的基石
【2月更文挑战第8天】Go语言标准库中的核心模块为开发者提供了构建高效应用所需的基础功能和工具。本文将深入探讨Go语言标准库中的几个核心模块,包括容器与集合、并发与并行、输入输出、时间与日期、字符串处理以及加密与安全,帮助读者更好地理解和应用这些核心模块,为构建高效应用打下坚实基础。