ego

module
v0.0.0-...-677ea5f Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 16, 2021 License: MIT

README

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{})
}

中文资料

架构

image

ego目录说明

  • network 网络相关.使用TCP/WebSocket协议,内置支持Json/MsgPack/protobuf,可扩展支持其他消息格式.
  • service 服务相关.提供简易服务注册发现,及事务封装.
  • utils 工具相关.
  • actor 游戏空间/对象相关.安全高效的管理空间及对象.
  • stage 基于actor包,使用类九宫格管理舞台对象.保持高效同时优化内存占用.
  • log 基于zap库的日志.可用于日志记录/分析.

Directories

Path Synopsis
examples

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL