diff --git a/.gitignore b/.gitignore index 34f929c..7a22760 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ .idea +.vscode + /zinx_app_demo/mmo_game/game_client/client_Data/ -/zinx_app_demt/mmo_game/mmo_game_log/ \ No newline at end of file +/zinx_app_demt/mmo_game/mmo_game_log/ +*.log diff --git a/Makefile b/Makefile index 62ffc52..8273586 100644 --- a/Makefile +++ b/Makefile @@ -21,8 +21,8 @@ LD_FLAGS='-X "$(SERVICE)/version.TAG=$(TAG)" -X "$(SERVICE)/version.VERSION=$(VE default: build build: - go build -ldflags $(LD_FLAGS) -gcflags "-N" -i -o $(SERVER_DEMO_BIN) $(SERVER_DEMO_PATH)/main.go - go build -ldflags $(LD_FLAGS) -gcflags "-N" -i -o $(CLIENT_DEMO_BIN) $(CLIENT_DEMO_PATH)/main.go + go build -ldflags $(LD_FLAGS) -gcflags "-N" -o $(SERVER_DEMO_BIN) $(SERVER_DEMO_PATH)/main.go + go build -ldflags $(LD_FLAGS) -gcflags "-N" -o $(CLIENT_DEMO_BIN) $(CLIENT_DEMO_PATH)/main.go clean: rm $(SERVER_DEMO_BIN) rm $(CLIENT_DEMO_BIN) diff --git a/README.md b/README.md index 8097ecf..1c35088 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,8 @@ Zinx 是一个基于Golang的轻量级并发服务器框架 -> **说明**:目前zinx已经在很多企业进行开发使用,具体使用领域包括:后端模块的消息中转、长链接游戏服务器、Web框架中的消息处理插件等。zinx的定位是代码简洁,让更多的开发者迅速的了解框架的内脏细节并且可以快速基于zinx DIY一款适合自己企业场景的模块。 +> **说明**:目前zinx已经在很多企业进行开发使用,具体使用领域包括:后端模块的消息中转、长链接游戏服务器、Web框架中的消息处理插件等。zinx的定位是代码简洁,让更多的开发者迅速的了解框架的内脏细节并且可以快速基于zinx DIY(二次开发)一款适合自己企业场景的模块。 + #### 开发者 - 刘丹冰([@aceld](https://github.com/aceld)) @@ -397,6 +398,40 @@ func (c *Connection) GetProperty(key string) (interface{}, error) func (c *Connection) RemoveProperty(key string) ``` +--- + +#### 开发者 +- 刘丹冰([@aceld](https://github.com/aceld)) +- 张超([@zhngcho](https://github.com/zhngcho)) +- 高智辉Roger([@adsian](https://github.com/adsian)) +- 胡贵建([@huguijian](https://github.com/huguijian)) + + +--- +[zinx(C++版本)](https://github.com/marklion/zinx) +#### 开发者 +- 刘洋([@marklion](https://github.com/marklion)) + + +--- +[zinx(Lua版本)](https://github.com/huqitt/zinx-lua) +#### 开发者 +- 胡琪([@huqitt](https://github.com/huqitt)) + +--- +[zinx(websocket版本)](https://github.com/aceld/zinx/tree/wsserver) +#### 开发者 +- 胡贵建([@huguijian](https://github.com/huguijian)) + +--- + +感谢所有为zinx贡献的开发者 + + + + + + --- ### 关于作者: @@ -424,4 +459,4 @@ func (c *Connection) RemoveProperty(key string) ### **微信群** weixin -欢迎大家加入,获取更多相关学习资料 +欢迎大家加入,一起学习分享 diff --git a/examples/zinx_client/Makefile b/examples/zinx_client/Makefile new file mode 100644 index 0000000..e6e9630 --- /dev/null +++ b/examples/zinx_client/Makefile @@ -0,0 +1,21 @@ +PROJECT_NAME:=zinx_client +VERSION:=v1 + + +.PHONY: image run build clean + +build: + bash build.sh ${PROJECT_NAME} + +image: + docker build -t ${PROJECT_NAME}:${VERSION} . + +run: + docker run -itd \ + -p 8999:8999 \ + ${PROJECT_NAME}:${VERSION} + + +clean: + rm -rf ${PROJECT_NAME} + diff --git a/examples/zinx_client/build.sh b/examples/zinx_client/build.sh new file mode 100644 index 0000000..cfb700a --- /dev/null +++ b/examples/zinx_client/build.sh @@ -0,0 +1,22 @@ +#!/bin/bash + +set -e + +APP_NAME=$1 +APP_VERSION=v$(cat version) +BUILD_VERSION=$(git log -1 --oneline) +BUILD_TIME=$(date "+%FT%T%z") +GIT_REVISION=$(git rev-parse --short HEAD) +GIT_BRANCH=$(git name-rev --name-only HEAD) +GO_VERSION=$(go version) + + +go build -ldflags " \ + -X 'main.AppName=${APP_NAME}' \ + -X 'main.AppVersion=${APP_VERSION}' \ + -X 'main.BuildVersion=${BUILD_VERSION//\'/_}' \ + -X 'main.BuildTime=${BUILD_TIME}' \ + -X 'main.GitRevision=${GIT_REVISION}' \ + -X 'main.GitBranch=${GIT_BRANCH}' \ + -X 'main.GoVersion=${GO_VERSION}' \ + " -o $APP_NAME diff --git a/examples/zinx_client/version b/examples/zinx_client/version new file mode 100644 index 0000000..276027b --- /dev/null +++ b/examples/zinx_client/version @@ -0,0 +1 @@ +v 1.0.0 diff --git a/examples/zinx_server/build.sh b/examples/zinx_server/build.sh index a294827..cfb700a 100644 --- a/examples/zinx_server/build.sh +++ b/examples/zinx_server/build.sh @@ -10,6 +10,7 @@ GIT_REVISION=$(git rev-parse --short HEAD) GIT_BRANCH=$(git name-rev --name-only HEAD) GO_VERSION=$(go version) + go build -ldflags " \ -X 'main.AppName=${APP_NAME}' \ -X 'main.AppVersion=${APP_VERSION}' \ @@ -18,4 +19,4 @@ go build -ldflags " \ -X 'main.GitRevision=${GIT_REVISION}' \ -X 'main.GitBranch=${GIT_BRANCH}' \ -X 'main.GoVersion=${GO_VERSION}' \ - " -o $2 . + " -o $APP_NAME diff --git a/go.mod b/go.mod index 0afff76..d27693c 100644 --- a/go.mod +++ b/go.mod @@ -2,4 +2,7 @@ module github.com/aceld/zinx go 1.13 -require github.com/golang/protobuf v1.3.3 +require ( + github.com/golang/protobuf v1.3.3 + golang.org/x/net v0.0.0-20210415231046-e915ea6b2b7d // indirect +) diff --git a/go.sum b/go.sum index b1efb8b..ed6c5e9 100644 --- a/go.sum +++ b/go.sum @@ -1,2 +1,8 @@ github.com/golang/protobuf v1.3.3 h1:gyjaxf+svBWX08ZjK86iN9geUJF0H6gp2IRKX6Nf6/I= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +golang.org/x/net v0.0.0-20210415231046-e915ea6b2b7d/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/utils/globalobj.go b/utils/globalobj.go index 9ec697d..6110263 100644 --- a/utils/globalobj.go +++ b/utils/globalobj.go @@ -1,3 +1,12 @@ +// Package utils 提供zinx相关工具类函数 +// 包括: +// 全局配置 +// 配置文件加载 +// +// 当前文件描述: +// @Title globalobj.go +// @Description 相关配置文件定义及加载方式 +// @Author Aceld - Thu Mar 11 10:32:29 CST 2019 package utils import ( @@ -114,6 +123,6 @@ func init() { LogDebugClose: false, } - //从配置文件中加载一些用户配置的参数 + //NOTE: 从配置文件中加载一些用户配置的参数 GlobalObject.Reload() } diff --git a/ziface/iconnection.go b/ziface/iconnection.go index 22b268b..66a6807 100644 --- a/ziface/iconnection.go +++ b/ziface/iconnection.go @@ -1,3 +1,16 @@ +// Package ziface 主要提供zinx全部抽象层接口定义. +// 包括: +// IServer 服务mod接口 +// IRouter 路由mod接口 +// IConnection 连接mod层接口 +// IMessage 消息mod接口 +// IDataPack 消息拆解接口 +// IMsgHandler 消息处理及协程池接口 +// +// 当前文件描述: +// @Title iconnection.go +// @Description 全部连接相关方法声明 +// @Author Aceld - Thu Mar 11 10:32:29 CST 2019 package ziface import ( @@ -7,28 +20,18 @@ import ( //定义连接接口 type IConnection interface { - //启动连接,让当前连接开始工作 - Start() - //停止连接,结束当前连接状态M - Stop() - //返回ctx,用于用户自定义的go程获取连接退出状态 - Context() context.Context - //从当前连接获取原始的socket TCPConn - GetTCPConnection() *net.TCPConn - //获取当前连接ID - GetConnID() uint32 - //获取远程客户端地址信息 - RemoteAddr() net.Addr + Start() //启动连接,让当前连接开始工作 + Stop() //停止连接,结束当前连接状态M + Context() context.Context //返回ctx,用于用户自定义的go程获取连接退出状态 - //直接将Message数据发送数据给远程的TCP客户端(无缓冲) - SendMsg(msgID uint32, data []byte) error - //直接将Message数据发送给远程的TCP客户端(有缓冲) - SendBuffMsg(msgID uint32, data []byte) error + GetTCPConnection() *net.TCPConn //从当前连接获取原始的socket TCPConn + GetConnID() uint32 //获取当前连接ID + RemoteAddr() net.Addr //获取远程客户端地址信息 - //设置链接属性 - SetProperty(key string, value interface{}) - //获取链接属性 - GetProperty(key string) (interface{}, error) - //移除链接属性 - RemoveProperty(key string) + SendMsg(msgID uint32, data []byte) error //直接将Message数据发送数据给远程的TCP客户端(无缓冲) + SendBuffMsg(msgID uint32, data []byte) error //直接将Message数据发送给远程的TCP客户端(有缓冲) + + SetProperty(key string, value interface{}) //设置链接属性 + GetProperty(key string) (interface{}, error) //获取链接属性 + RemoveProperty(key string) //移除链接属性 } diff --git a/ziface/iconnmanager.go b/ziface/iconnmanager.go index 23bef5a..577d9fd 100644 --- a/ziface/iconnmanager.go +++ b/ziface/iconnmanager.go @@ -1,3 +1,16 @@ +// Package ziface 主要提供zinx全部抽象层接口定义. +// 包括: +// IServer 服务mod接口 +// IRouter 路由mod接口 +// IConnection 连接mod层接口 +// IMessage 消息mod接口 +// IDataPack 消息拆解接口 +// IMsgHandler 消息处理及协程池接口 +// +// 当前文件描述: +// @Title iconnmanager.go +// @Description 连接管理相关,包括添加、删除、通过一个连接ID获得连接对象,当前连接数量、清空全部连接等方法 +// @Author Aceld - Thu Mar 11 10:32:29 CST 2019 package ziface /* diff --git a/ziface/idatapack.go b/ziface/idatapack.go index 7b078af..e9841f6 100644 --- a/ziface/idatapack.go +++ b/ziface/idatapack.go @@ -1,3 +1,16 @@ +// Package ziface 主要提供zinx全部抽象层接口定义. +// 包括: +// IServer 服务mod接口 +// IRouter 路由mod接口 +// IConnection 连接mod层接口 +// IMessage 消息mod接口 +// IDataPack 消息拆解接口 +// IMsgHandler 消息处理及协程池接口 +// +// 当前文件描述: +// @Title idatapack.go +// @Description 消息的打包和解包方法 +// @Author Aceld - Thu Mar 11 10:32:29 CST 2019 package ziface /* diff --git a/ziface/imessage.go b/ziface/imessage.go index cada145..88e786e 100644 --- a/ziface/imessage.go +++ b/ziface/imessage.go @@ -1,3 +1,16 @@ +// Package ziface 主要提供zinx全部抽象层接口定义. +// 包括: +// IServer 服务mod接口 +// IRouter 路由mod接口 +// IConnection 连接mod层接口 +// IMessage 消息mod接口 +// IDataPack 消息拆解接口 +// IMsgHandler 消息处理及协程池接口 +// +// 当前文件描述: +// @Title imessage.go +// @Description 提供消息的基本方法 +// @Author Aceld - Thu Mar 11 10:32:29 CST 2019 package ziface /* diff --git a/ziface/imsghandler.go b/ziface/imsghandler.go index b6f35d7..6fac36b 100644 --- a/ziface/imsghandler.go +++ b/ziface/imsghandler.go @@ -1,3 +1,16 @@ +// Package ziface 主要提供zinx全部抽象层接口定义. +// 包括: +// IServer 服务mod接口 +// IRouter 路由mod接口 +// IConnection 连接mod层接口 +// IMessage 消息mod接口 +// IDataPack 消息拆解接口 +// IMsgHandler 消息处理及协程池接口 +// +// 当前文件描述: +// @Title imsghandler.go +// @Description 提供worker启动、处理消息业务调用等接口 +// @Author Aceld - Thu Mar 11 10:32:29 CST 2019 package ziface /* diff --git a/ziface/irequest.go b/ziface/irequest.go index 43136a3..49734c7 100644 --- a/ziface/irequest.go +++ b/ziface/irequest.go @@ -1,3 +1,16 @@ +// Package ziface 主要提供zinx全部抽象层接口定义. +// 包括: +// IServer 服务mod接口 +// IRouter 路由mod接口 +// IConnection 连接mod层接口 +// IMessage 消息mod接口 +// IDataPack 消息拆解接口 +// IMsgHandler 消息处理及协程池接口 +// +// 当前文件描述: +// @Title irequest.go +// @Description 提供连接请求全部接口声明 +// @Author Aceld - Thu Mar 11 10:32:29 CST 2019 package ziface /* diff --git a/ziface/irouter.go b/ziface/irouter.go index 47a7782..788aa18 100644 --- a/ziface/irouter.go +++ b/ziface/irouter.go @@ -1,3 +1,16 @@ +// Package ziface 主要提供zinx全部抽象层接口定义. +// 包括: +// IServer 服务mod接口 +// IRouter 路由mod接口 +// IConnection 连接mod层接口 +// IMessage 消息mod接口 +// IDataPack 消息拆解接口 +// IMsgHandler 消息处理及协程池接口 +// +// 当前文件描述: +// @Title irouter.go +// @Description 提供消息路由全部接口声明 +// @Author Aceld - Thu Mar 11 10:32:29 CST 2019 package ziface /* diff --git a/ziface/iserver.go b/ziface/iserver.go index 4de5ba5..f235397 100644 --- a/ziface/iserver.go +++ b/ziface/iserver.go @@ -1,23 +1,27 @@ +// Package ziface 主要提供zinx全部抽象层接口定义. +// 包括: +// IServer 服务mod接口 +// IRouter 路由mod接口 +// IConnection 连接mod层接口 +// IMessage 消息mod接口 +// IDataPack 消息拆解接口 +// IMsgHandler 消息处理及协程池接口 +// +// 当前文件描述: +// @Title iserver.go +// @Description 提供Server抽象层全部接口声明 +// @Author Aceld - Thu Mar 11 10:32:29 CST 2019 package ziface -//定义服务器接口 +//定义服务接口 type IServer interface { - //启动服务器方法 - Start() - //停止服务器方法 - Stop() - //开启业务服务方法 - Serve() - //路由功能:给当前服务注册一个路由业务方法,供客户端链接处理使用 - AddRouter(msgID uint32, router IRouter) - //得到链接管理 - GetConnMgr() IConnManager - //设置该Server的连接创建时Hook函数 - SetOnConnStart(func(IConnection)) - //设置该Server的连接断开时的Hook函数 - SetOnConnStop(func(IConnection)) - //调用连接OnConnStart Hook函数 - CallOnConnStart(conn IConnection) - //调用连接OnConnStop Hook函数 - CallOnConnStop(conn IConnection) + Start() //启动服务器方法 + Stop() //停止服务器方法 + Serve() //开启业务服务方法 + AddRouter(msgID uint32, router IRouter) //路由功能:给当前服务注册一个路由业务方法,供客户端链接处理使用 + GetConnMgr() IConnManager //得到链接管理 + SetOnConnStart(func(IConnection)) //设置该Server的连接创建时Hook函数 + SetOnConnStop(func(IConnection)) //设置该Server的连接断开时的Hook函数 + CallOnConnStart(conn IConnection) //调用连接OnConnStart Hook函数 + CallOnConnStop(conn IConnection) //调用连接OnConnStop Hook函数 } diff --git a/zlog/stdzlog.go b/zlog/stdzlog.go index 42cd585..133d24c 100644 --- a/zlog/stdzlog.go +++ b/zlog/stdzlog.go @@ -1,3 +1,12 @@ +// Package zlog 主要提供zinx相关日志记录接口 +// 包括: +// stdzlog模块, 提供全局日志方法 +// zlogger模块, 日志内部定义协议,均为对象类方法 +// +// 当前文件描述: +// @Title stdzlog.go +// @Description 包裹zlogger日志方法,提供全局方法 +// @Author Aceld - Thu Mar 11 10:32:29 CST 2019 package zlog /* diff --git a/zlog/zlogger.go b/zlog/zlogger.go index 30d1d78..f135cdf 100644 --- a/zlog/zlogger.go +++ b/zlog/zlogger.go @@ -1,3 +1,12 @@ +// Package zlog 主要提供zinx相关日志记录接口 +// 包括: +// stdzlog模块, 提供全局日志方法 +// zlogger模块, 日志内部定义协议,均为对象类方法 +// +// 当前文件描述: +// @Title zlogger.go +// @Description 基础日志接口,包括Debug、Fatal等 +// @Author Aceld - Thu Mar 11 10:32:29 CST 2019 package zlog /* @@ -25,9 +34,9 @@ const ( BitDate = 1 << iota //日期标记位 2019/01/23 BitTime //时间标记位 01:23:12 BitMicroSeconds //微秒级标记位 01:23:12.111222 - BitLongFile // 完整文件名称 /home/go/src/zinx/server.go - BitShortFile // 最后文件名 server.go - BitLevel // 当前日志级别: 0(Debug), 1(Info), 2(Warn), 3(Error), 4(Panic), 5(Fatal) + BitLongFile //完整文件名称 /home/go/src/zinx/server.go + BitShortFile //最后文件名 server.go + BitLevel //当前日志级别: 0(Debug), 1(Info), 2(Warn), 3(Error), 4(Panic), 5(Fatal) BitStdFlag = BitDate | BitTime //标准头部日志格式 BitDefault = BitLevel | BitShortFile | BitStdFlag //默认日志头部格式 ) @@ -53,22 +62,14 @@ var levels = []string{ } type ZinxLogger struct { - //确保多协程读写文件,防止文件内容混乱,做到协程安全 - mu sync.Mutex - //每行log日志的前缀字符串,拥有日志标记 - prefix string - //日志标记位 - flag int - //日志输出的文件描述符 - out io.Writer - //输出的缓冲区 - buf bytes.Buffer - //当前日志绑定的输出文件 - file *os.File - //是否打印调试debug信息 - debugClose bool - //获取日志文件名和代码上述的runtime.Call 的函数调用层数 - calldDepth int + mu sync.Mutex //确保多协程读写文件,防止文件内容混乱,做到协程安全 + prefix string //每行log日志的前缀字符串,拥有日志标记 + flag int //日志标记位 + out io.Writer //日志输出的文件描述符 + buf bytes.Buffer //输出的缓冲区 + file *os.File //当前日志绑定的输出文件 + debugClose bool //是否打印调试debug信息 + calldDepth int //获取日志文件名和代码上述的runtime.Call 的函数调用层数 } /* diff --git a/zlog/zlogger_test.go b/zlog/zlogger_test.go index a0d51c4..cc84b76 100644 --- a/zlog/zlogger_test.go +++ b/zlog/zlogger_test.go @@ -1,39 +1,39 @@ -package zlog +package zlog_test import ( + "github.com/aceld/zinx/zlog" "testing" ) func TestStdZLog(t *testing.T) { //测试 默认debug输出 - Debug("zinx debug content1") - Debug("zinx debug content2") + zlog.Debug("zinx debug content1") + zlog.Debug("zinx debug content2") - Debugf(" zinx debug a = %d\n", 10) + zlog.Debugf(" zinx debug a = %d\n", 10) //设置log标记位,加上长文件名称 和 微秒 标记 - ResetFlags(BitDate | BitLongFile | BitLevel) - Info("zinx info content") + zlog.ResetFlags(zlog.BitDate | zlog.BitLongFile | zlog.BitLevel) + zlog.Info("zinx info content") //设置日志前缀,主要标记当前日志模块 - SetPrefix("MODULE") - Error("zinx error content") + zlog.SetPrefix("MODULE") + zlog.Error("zinx error content") //添加标记位 - AddFlag(BitShortFile | BitTime) - Stack(" Zinx Stack! ") + zlog.AddFlag(zlog.BitShortFile | zlog.BitTime) + zlog.Stack(" Zinx Stack! ") //设置日志写入文件 - SetLogFile("./log", "testfile.log") - Debug("===> zinx debug content ~~666") - Debug("===> zinx debug content ~~888") - Error("===> zinx Error!!!! ~~~555~~~") + zlog.SetLogFile("./log", "testfile.log") + zlog.Debug("===> zinx debug content ~~666") + zlog.Debug("===> zinx debug content ~~888") + zlog.Error("===> zinx Error!!!! ~~~555~~~") //关闭debug调试 - CloseDebug() - Debug("===> 我不应该出现~!") - Debug("===> 我不应该出现~!") - Error("===> zinx Error after debug close !!!!") - + zlog.CloseDebug() + zlog.Debug("===> 我不应该出现~!") + zlog.Debug("===> 我不应该出现~!") + zlog.Error("===> zinx Error after debug close !!!!") }