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语言社区”。
相关文章
|
3月前
|
Java 关系型数据库 API
探索后端技术:构建高效、可靠的服务器端应用
在当今数字化时代,后端技术是任何成功应用程序的基石。它涉及服务器、数据库和应用程序之间的交互,处理数据存储、业务逻辑和系统性能等关键任务。本文将深入探讨后端开发的核心概念、常见技术栈及其实际应用,帮助读者更好地理解和掌握构建高效、可靠后端系统的技巧与策略。
|
3月前
|
监控 中间件 Java
后端技术:构建高效、稳定的服务器端应用
【10月更文挑战第5天】后端技术:构建高效、稳定的服务器端应用
124 0
|
1月前
|
Go 开发工具
百炼-千问模型通过openai接口构建assistant 等 go语言
由于阿里百炼平台通义千问大模型没有完善的go语言兼容openapi示例,并且官方答复assistant是不兼容openapi sdk的。 实际使用中发现是能够支持的,所以自己写了一个demo test示例,给大家做一个参考。
|
3月前
|
监控 关系型数据库 Serverless
探索后端技术:构建高效、可靠的服务器端应用
本文将深入探讨后端开发的核心概念和关键技术,从服务器架构到数据库管理,再到安全防护,为读者提供全面的后端技术指南。无论是初学者还是经验丰富的开发者,都能从中汲取灵感,提升自己的技术水平。
|
2月前
|
缓存 监控 前端开发
在 Go 语言中实现 WebSocket 实时通信的应用,包括 WebSocket 的简介、Go 语言的优势、基本实现步骤、应用案例、注意事项及性能优化策略,旨在帮助开发者构建高效稳定的实时通信系统
本文深入探讨了在 Go 语言中实现 WebSocket 实时通信的应用,包括 WebSocket 的简介、Go 语言的优势、基本实现步骤、应用案例、注意事项及性能优化策略,旨在帮助开发者构建高效稳定的实时通信系统。
127 1
|
2月前
|
存储 负载均衡 监控
如何利用Go语言的高效性、并发支持、简洁性和跨平台性等优势,通过合理设计架构、实现负载均衡、构建容错机制、建立监控体系、优化数据存储及实施服务治理等步骤,打造稳定可靠的服务架构。
在数字化时代,构建高可靠性服务架构至关重要。本文探讨了如何利用Go语言的高效性、并发支持、简洁性和跨平台性等优势,通过合理设计架构、实现负载均衡、构建容错机制、建立监控体系、优化数据存储及实施服务治理等步骤,打造稳定可靠的服务架构。
48 1
|
2月前
|
关系型数据库 API 数据库
后端开发的艺术:从零到一构建高效服务器
在数字化时代,后端开发是支撑现代互联网应用的基石。本文旨在探讨后端开发的核心概念、关键技术以及如何构建一个高效的服务器。我们将从基础的编程语言选择开始,逐步深入到数据库设计、API开发和性能优化等关键领域。通过实际案例分析,我们将揭示后端开发的复杂性和挑战性,同时提供实用的解决方案和最佳实践。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的见解和启发。
|
3月前
|
中间件 Go API
使用Go语言构建高性能RESTful API
在现代软件开发中,RESTful API因其简洁和高效而成为构建网络服务的首选。Go语言以其并发处理能力和高性能著称,是开发RESTful API的理想选择。本文将介绍如何使用Go语言构建RESTful API,包括基础的路由设置、中间件的使用、数据验证、错误处理以及性能优化。通过实际代码示例,我们将展示Go语言在API开发中的强大功能和灵活性。
|
3月前
|
JSON JavaScript 前端开发
使用 Node.js 和 Express 构建 RESTful API 服务器
【10月更文挑战第3天】使用 Node.js 和 Express 构建 RESTful API 服务器
|
3月前
|
Web App开发 JavaScript 前端开发
使用Node.js和Express框架构建Web服务器
使用Node.js和Express框架构建Web服务器
下一篇
开通oss服务