KISS - Keep It Simple & Stupid
-
KISS 原则 是指在设计当中应当注重简约的原则
-
作者水平有限,欢迎交流和指点,qq 群: 817937655
安装
- go get github.com/nothollyhigh/kiss/...
KISS 可以用来做什么?
-
有的人喜欢"框架"这个词,KISS 的定位是提供一些基础组件方便搭积木实现架构方案,组件不限于项目类型
-
作者主要从事游戏和 web 服务器开发,常用来构建游戏服务器,一些示例:
- kissgate 网关,支持 kiss 格式的 tcp/websocket 连接反向代理到 tcp 服务,支持线路检测、负载均衡、realip 等,常用来做游戏集群的网关,kiss 协议格式详见 net 包
- 集群是不同功能服务的拆分和实现,每个游戏的需求都可能不一样,请根据实际需求自行设计和实现
KISS 组件包简介
一、net,网络包
-
Tcp
可以用做游戏服务器,支持自定义协议格式、压缩、加密等 -
Websocket
可以用做游戏服务器,支持自定义协议格式、压缩、加密等 -
Rpc
可以灵活使用任意序列化、反序列化,给用户更多自由,如 protobuf、json、msgpack、gob 等
支持服务端异步处理,服务端不必须在方法中处理完调用结果,可以异步处理结束后再发送结果
不像 GRPC 等需要生成协议、按格式写那么多额外的代码,用法上像写 net/http 包的路由一样简单 -
Http
支持优雅退出、pprof 等
- 详见 net
二、log,日志包
-
自己实现 log 包之前,我简单尝试过标准库的 log 和一些三方的日志包,但是对日志文件落地不太友好,
比如日志文件按目录拆分、文件按时间和 size 切分、日志位置信息等 -
KISS 的 log 包日志支持:
- 日志位置信息,包括文件、行数
- 支持文件日志,支持 bufio
- 文件日志按时间拆分目录
- 文件日志按时间格式切分
- 文件日志按 size 切分
- 支持钩子对日志做结构化或其他自定义处理
- 详见 log
三、sync 包
-
开启 debug 支持死锁告警
web 相关无状态服务通常不需要锁,游戏逻辑多耦合,不小心可能导致死锁,可以用这个包来排查 -
WaitSession 用法类似标准库的 WaitGroup,但是可以指定 session 进行等待,支持超时
-
详见 sync
四、timer,定时器
-
标准库的 time.AfterFunc 触发时会创建一个协程来调用回调函数,大量定时器短时间内集中触发时开销较大
-
KISS 的 timer 是小堆实现的,一个实例只需要一个协程就可以管理大量定时器,支持同步异步接口
主要用于优化标准库 time.AfterFunc 的协程开销,但要注意线头阻塞的问题
耗时较长的定时器回调建议仍使用 time.AfterFunc -
详见 timer
五、event,事件包
-
进程内的发布订阅组件,观察者模式,可以用于模块间解耦
-
详见 event
六、util,杂货铺
-
最常用的 Go,HandlePanic,Safe,处理 panic,打印异常调用栈信息
-
Workers,任务池,用于控制一定数量的协程异步处理任务
WorkersLink,也是任务池,但在 Workers 基础上做了一点扩展,支持异步处理的顺序组装 -
Qps,方便统计、打印一些 qps 功能
-
详见 util
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于