Browse Source

Merge branch 'master' into master

master
Titan Panda 4 years ago
committed by GitHub
parent
commit
4470adf96b
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 3
      .gitignore
  2. 4
      Makefile
  3. 39
      README.md
  4. 21
      examples/zinx_client/Makefile
  5. 22
      examples/zinx_client/build.sh
  6. 1
      examples/zinx_client/version
  7. 3
      examples/zinx_server/build.sh
  8. 5
      go.mod
  9. 6
      go.sum
  10. 11
      utils/globalobj.go
  11. 47
      ziface/iconnection.go
  12. 13
      ziface/iconnmanager.go
  13. 13
      ziface/idatapack.go
  14. 13
      ziface/imessage.go
  15. 13
      ziface/imsghandler.go
  16. 13
      ziface/irequest.go
  17. 13
      ziface/irouter.go
  18. 42
      ziface/iserver.go
  19. 9
      zlog/stdzlog.go
  20. 39
      zlog/zlogger.go
  21. 38
      zlog/zlogger_test.go

3
.gitignore

@ -1,3 +1,6 @@
.idea .idea
.vscode
/zinx_app_demo/mmo_game/game_client/client_Data/ /zinx_app_demo/mmo_game/game_client/client_Data/
/zinx_app_demt/mmo_game/mmo_game_log/ /zinx_app_demt/mmo_game/mmo_game_log/
*.log

4
Makefile

@ -21,8 +21,8 @@ LD_FLAGS='-X "$(SERVICE)/version.TAG=$(TAG)" -X "$(SERVICE)/version.VERSION=$(VE
default: build default: build
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: clean:
rm $(SERVER_DEMO_BIN) rm $(SERVER_DEMO_BIN)
rm $(CLIENT_DEMO_BIN) rm $(CLIENT_DEMO_BIN)

39
README.md

@ -3,7 +3,8 @@
Zinx 是一个基于Golang的轻量级并发服务器框架 Zinx 是一个基于Golang的轻量级并发服务器框架
> **说明**:目前zinx已经在很多企业进行开发使用,具体使用领域包括:后端模块的消息中转、长链接游戏服务器、Web框架中的消息处理插件等。zinx的定位是代码简洁,让更多的开发者迅速的了解框架的内脏细节并且可以快速基于zinx DIY一款适合自己企业场景的模块。
> **说明**:目前zinx已经在很多企业进行开发使用,具体使用领域包括:后端模块的消息中转、长链接游戏服务器、Web框架中的消息处理插件等。zinx的定位是代码简洁,让更多的开发者迅速的了解框架的内脏细节并且可以快速基于zinx DIY(二次开发)一款适合自己企业场景的模块。
#### 开发者 #### 开发者
- 刘丹冰([@aceld](https://github.com/aceld)) - 刘丹冰([@aceld](https://github.com/aceld))
@ -397,6 +398,40 @@ func (c *Connection) GetProperty(key string) (interface{}, error)
func (c *Connection) RemoveProperty(key string) 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贡献的开发者
<a href="https://github.com/aceld/zinx/graphs/contributors">
<img src="https://contrib.rocks/image?repo=aceld/zinx" />
</a>
--- ---
### 关于作者: ### 关于作者:
@ -424,4 +459,4 @@ func (c *Connection) RemoveProperty(key string)
### **微信群** ### **微信群**
<img src="https://s1.ax1x.com/2020/07/07/UF6rNV.png" width = "200" height = "230" alt="weixin" /> <img src="https://s1.ax1x.com/2020/07/07/UF6rNV.png" width = "200" height = "230" alt="weixin" />
欢迎大家加入,获取更多相关学习资料
欢迎大家加入,一起学习分享

21
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}

22
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

1
examples/zinx_client/version

@ -0,0 +1 @@
v 1.0.0

3
examples/zinx_server/build.sh

@ -10,6 +10,7 @@ GIT_REVISION=$(git rev-parse --short HEAD)
GIT_BRANCH=$(git name-rev --name-only HEAD) GIT_BRANCH=$(git name-rev --name-only HEAD)
GO_VERSION=$(go version) GO_VERSION=$(go version)
go build -ldflags " \ go build -ldflags " \
-X 'main.AppName=${APP_NAME}' \ -X 'main.AppName=${APP_NAME}' \
-X 'main.AppVersion=${APP_VERSION}' \ -X 'main.AppVersion=${APP_VERSION}' \
@ -18,4 +19,4 @@ go build -ldflags " \
-X 'main.GitRevision=${GIT_REVISION}' \ -X 'main.GitRevision=${GIT_REVISION}' \
-X 'main.GitBranch=${GIT_BRANCH}' \ -X 'main.GitBranch=${GIT_BRANCH}' \
-X 'main.GoVersion=${GO_VERSION}' \ -X 'main.GoVersion=${GO_VERSION}' \
" -o $2 .
" -o $APP_NAME

5
go.mod

@ -2,4 +2,7 @@ module github.com/aceld/zinx
go 1.13 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
)

6
go.sum

@ -1,2 +1,8 @@
github.com/golang/protobuf v1.3.3 h1:gyjaxf+svBWX08ZjK86iN9geUJF0H6gp2IRKX6Nf6/I= 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= 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=

11
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 package utils
import ( import (
@ -114,6 +123,6 @@ func init() {
LogDebugClose: false, LogDebugClose: false,
} }
//从配置文件中加载一些用户配置的参数
//NOTE: 从配置文件中加载一些用户配置的参数
GlobalObject.Reload() GlobalObject.Reload()
} }

47
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 package ziface
import ( import (
@ -7,28 +20,18 @@ import (
//定义连接接口 //定义连接接口
type IConnection interface { 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) //移除链接属性
} }

13
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 package ziface
/* /*

13
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 package ziface
/* /*

13
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 package ziface
/* /*

13
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 package ziface
/* /*

13
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 package ziface
/* /*

13
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 package ziface
/* /*

42
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 package ziface
//定义服务器接口
//定义服务接口
type IServer interface { 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函数
} }

9
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 package zlog
/* /*

39
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 package zlog
/* /*
@ -25,9 +34,9 @@ const (
BitDate = 1 << iota //日期标记位 2019/01/23 BitDate = 1 << iota //日期标记位 2019/01/23
BitTime //时间标记位 01:23:12 BitTime //时间标记位 01:23:12
BitMicroSeconds //微秒级标记位 01:23:12.111222 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 //标准头部日志格式 BitStdFlag = BitDate | BitTime //标准头部日志格式
BitDefault = BitLevel | BitShortFile | BitStdFlag //默认日志头部格式 BitDefault = BitLevel | BitShortFile | BitStdFlag //默认日志头部格式
) )
@ -53,22 +62,14 @@ var levels = []string{
} }
type ZinxLogger struct { 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 的函数调用层数
} }
/* /*

38
zlog/zlogger_test.go

@ -1,39 +1,39 @@
package zlog
package zlog_test
import ( import (
"github.com/aceld/zinx/zlog"
"testing" "testing"
) )
func TestStdZLog(t *testing.T) { func TestStdZLog(t *testing.T) {
//测试 默认debug输出 //测试 默认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标记位,加上长文件名称 和 微秒 标记 //设置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调试 //关闭debug调试
CloseDebug()
Debug("===> 我不应该出现~!")
Debug("===> 我不应该出现~!")
Error("===> zinx Error after debug close !!!!")
zlog.CloseDebug()
zlog.Debug("===> 我不应该出现~!")
zlog.Debug("===> 我不应该出现~!")
zlog.Error("===> zinx Error after debug close !!!!")
} }
Loading…
Cancel
Save