ego游戏服务器框架简介
ego
是由Go
语言(golang
)编写的游戏服务器框架.目前支持TCP/WebSocket协议.
目标:
- 易使用.提供简单已用接口,提供游戏服务器开发效率.并且部署灵活,
- 高性能.基于
goroutine
/channel
封装服务间的请求/响应,充分发挥多核性能.
导入ego模块
go get -u github.com/95eh/ego
快速使用
使用如下代码即可快速启动服务发现.
package main
import "github.com/95eh/ego/service"
func main() {
//":7373"监听的地址/端口
service.NewDiscoverListener(":7373", func(str string) bool {
//验证服务注册使用的key
return str == "ego"
})
//阻塞程序退出
<-make(chan struct{})
}
package main
import (
"github.com/95eh/ego/log"
"github.com/95eh/ego/network"
"github.com/95eh/ego/service"
"github.com/95eh/ego/utils"
"go.uber.org/zap"
)
const (
//服务组,全局服务组必需小于1000,区服务组必需大于等于1000
GroupLogin uint16 = iota + 100
GroupConf
GroupDevOps
)
//登录服务组的协议
const (
//登录协议号
LoginSignIn uint16 = iota
)
//运维服务组的协议
const (
//运维广播协议号
DevOpsBroadcast uint16 = iota
)
//登录请求
type LoginSignInReq struct {
Username string
Password string
}
//登录响应
type LoginSignInRes struct {
Success bool
UserId int64
}
//运维消息广播
type DevOpsBroadcastNtf struct {
Message string
}
func main() {
//实例化消息包编/解码器
codec := network.NewMsgPackCodec()
//绑定协议号和请求/响应消息体
service.BindCodecPool(codec, GroupLogin, LoginSignIn, func() interface{} {
return &LoginSignInReq{}
}, func() interface{} {
return &LoginSignInRes{}
})
service.BindCodecPool(codec, GroupDevOps, DevOpsBroadcast, nil, func() interface{} {
return &DevOpsBroadcastNtf{}
})
//实例化服务器
srv := service.NewServer(":8484", codec)
//添加需要连接的服务组
//请求指定服务前需要先添加关注的服务.有可用服务时,内部会自动连接
//全局服只能关注全局服组,区服可以关注全局服务组和同一区服的其他服务组
srv.RegisterWatchGroups(GroupConf)
//注入服务
srv.RegisterFuncRequestService(GroupLogin, LoginSignIn, func(request service.IRequest) {
//请求类型断言
req := request.Body().(*LoginSignInReq)
log.Info("login sign in", zap.String("username", req.Username),
zap.String("password", req.Password))
//响应结果
request.ResponseOk(func(response interface{}) {
res := response.(*LoginSignInRes)
res.Success = true
res.UserId = utils.GetSnowflakeId()
})
})
//注入广播监听
//指定服务组广播该协议的消息时,该服务器会接收到消息
srv.RegisterFuncNotifyListener(GroupDevOps, DevOpsBroadcast, func(notify service.INotify) {
ntf := notify.Body().(*DevOpsBroadcastNtf)
log.Info("devOps", zap.String("message", ntf.Message))
})
//连接服务发现
//service.DK_Zone_Global:指定全局服务(如果使用其他字符串则是区服名),游戏各区服都可以连接该服务器
//"127.0.0.1:7373":该服务器监听的地址/端口
//"ego":discover鉴权需要的key
srv.ConnectDiscover(service.DK_Zone_Global, "127.0.0.1:7373", "ego")
//阻塞程序退出
<-make(chan struct{})
}
中文资料
架构
ego目录说明
- network 网络相关.使用TCP/WebSocket协议,内置支持
Json
/MsgPack
/protobuf
,可扩展支持其他消息格式.
- service 服务相关.提供简易服务注册发现,及事务封装.
- utils 工具相关.
- actor 游戏空间/对象相关.安全高效的管理空间及对象.
- stage 基于actor包,使用类九宫格管理舞台对象.保持高效同时优化内存占用.
- log 基于zap库的日志.可用于日志记录/分析.