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语言社区”。
相关文章
|
2月前
|
人工智能 JavaScript API
零基础构建MCP服务器:TypeScript/Python双语言实战指南
作为一名深耕技术领域多年的博主摘星,我深刻感受到了MCP(Model Context Protocol)协议在AI生态系统中的革命性意义。MCP作为Anthropic推出的开放标准,正在重新定义AI应用与外部系统的交互方式,它不仅解决了传统API集成的复杂性问题,更为开发者提供了一个统一、安全、高效的连接框架。在过去几个月的实践中,我发现许多开发者对MCP的概念理解透彻,但在实际动手构建MCP服务器时却遇到了各种技术壁垒。从环境配置的细节问题到SDK API的深度理解,从第一个Hello World程序的调试到生产环境的部署优化,每一个环节都可能成为初学者的绊脚石。因此,我决定撰写这篇全面的实
543 67
零基础构建MCP服务器:TypeScript/Python双语言实战指南
|
1月前
|
人工智能 自然语言处理 安全
Python构建MCP服务器:从工具封装到AI集成的全流程实践
MCP协议为AI提供标准化工具调用接口,助力模型高效操作现实世界。
417 1
|
2月前
|
监控 安全 Go
使用Go语言构建网络IP层安全防护
在Go语言中构建网络IP层安全防护是一项需求明确的任务,考虑到高性能、并发和跨平台的优势,Go是构建此类安全系统的合适选择。通过紧密遵循上述步骤并结合最佳实践,可以构建一个强大的网络防护系统,以保障数字环境的安全完整。
84 12
|
1月前
|
人工智能 JavaScript 前端开发
用 Go 语言轻松构建 MCP 服务器
本文介绍了使用 Go 语言构建 MCP 服务器的完整过程,涵盖创建服务器实例、注册工具、资源和提示词,以及通过 stdio 和 sse 模式启动服务的方法,帮助开发者快速集成 LLM 应用与外部系统。
|
2月前
|
Java Shell Maven
【Azure Container App】构建Java应用镜像时候遇无法编译错误:ERROR [build 10/10] RUN ./mvnw.cmd dependency:go-offline -B -Dproduction package
在部署Java应用到Azure Container App时,构建镜像过程中出现错误:“./mvnw.cmd: No such file or directory”。尽管项目根目录包含mvnw和mvnw.cmd文件,但依然报错。问题出现在Dockerfile构建阶段执行`./mvnw dependency:go-offline`命令时,系统提示找不到可执行文件。经过排查,确认是mvnw文件内容异常所致。最终通过重新生成mvnw文件解决该问题,镜像成功构建。
|
2月前
|
存储 中间件 网络安全
在Go中构建应用级IP防火墙机制
使用Go构建应用级别的IP防火墙机制不仅能够为你的应用程序增加一层额外的安全性,还能够通过自定义中间件的方式让你有更多控制力,来决定哪些客户端可以或不可以访问你的服务。
87 8
|
2月前
|
JSON 前端开发 Go
Go语言实战:创建一个简单的 HTTP 服务器
本篇是《Go语言101实战》系列之一,讲解如何使用Go构建基础HTTP服务器。涵盖Go语言并发优势、HTTP服务搭建、路由处理、日志记录及测试方法,助你掌握高性能Web服务开发核心技能。
|
2月前
|
人工智能 负载均衡 监控
使用 Go 和 Gin 实现高可用负载均衡代理服务器
本文基于Go语言和Gin框架,实现了一个企业级负载均衡代理服务器,支持动态路由、健康检查、会话保持等功能。具备高可用性与高性能,单节点支持100k+ QPS,延迟达亚毫秒级,并提供完整的压力测试方案与优化建议。
100 7
|
2月前
|
Go
如何在Go语言的HTTP请求中设置使用代理服务器
当使用特定的代理时,在某些情况下可能需要认证信息,认证信息可以在代理URL中提供,格式通常是:
242 0
|
3月前
|
JSON 编解码 API
Go语言网络编程:使用 net/http 构建 RESTful API
本章介绍如何使用 Go 语言的 `net/http` 标准库构建 RESTful API。内容涵盖 RESTful API 的基本概念及规范,包括 GET、POST、PUT 和 DELETE 方法的实现。通过定义用户数据结构和模拟数据库,逐步实现获取用户列表、创建用户、更新用户、删除用户的 HTTP 路由处理函数。同时提供辅助函数用于路径参数解析,并展示如何设置路由器启动服务。最后通过 curl 或 Postman 测试接口功能。章节总结了路由分发、JSON 编解码、方法区分、并发安全管理和路径参数解析等关键点,为更复杂需求推荐第三方框架如 Gin、Echo 和 Chi。

热门文章

最新文章