发布游戏服务器框架 / 组件包 -KISS(日常用作游戏服务器开发,但不限于游戏服务器开发)

本贴最后更新于 1713 天前,其中的信息可能已经渤澥桑田

KISS - Keep It Simple & Stupid

MIT licensed
Go Report Card

  • KISS 原则 是指在设计当中应当注重简约的原则

  • 作者水平有限,欢迎交流和指点,qq 群: 817937655

安装

  • go get github.com/nothollyhigh/kiss/...

KISS 可以用来做什么?

  • 有的人喜欢"框架"这个词,KISS 的定位是提供一些基础组件方便搭积木实现架构方案,组件不限于项目类型

  • 作者主要从事游戏和 web 服务器开发,常用来构建游戏服务器,一些示例:

  1. 单进程服务器示例
  1. kissgate 网关,支持 kiss 格式的 tcp/websocket 连接反向代理到 tcp 服务,支持线路检测、负载均衡、realip 等,常用来做游戏集群的网关,kiss 协议格式详见 net 包
  1. 集群是不同功能服务的拆分和实现,每个游戏的需求都可能不一样,请根据实际需求自行设计和实现

KISS 组件包简介

一、net,网络包

  1. Tcp
    可以用做游戏服务器,支持自定义协议格式、压缩、加密等

  2. Websocket
    可以用做游戏服务器,支持自定义协议格式、压缩、加密等

  3. Rpc
    可以灵活使用任意序列化、反序列化,给用户更多自由,如 protobuf、json、msgpack、gob 等
    支持服务端异步处理,服务端不必须在方法中处理完调用结果,可以异步处理结束后再发送结果
    不像 GRPC 等需要生成协议、按格式写那么多额外的代码,用法上像写 net/http 包的路由一样简单

  4. Http
    支持优雅退出、pprof 等

二、log,日志包

  • 自己实现 log 包之前,我简单尝试过标准库的 log 和一些三方的日志包,但是对日志文件落地不太友好,
    比如日志文件按目录拆分、文件按时间和 size 切分、日志位置信息等

  • KISS 的 log 包日志支持:

  1. 日志位置信息,包括文件、行数
  2. 支持文件日志,支持 bufio
  3. 文件日志按时间拆分目录
  4. 文件日志按时间格式切分
  5. 文件日志按 size 切分
  6. 支持钩子对日志做结构化或其他自定义处理

三、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

  • KISS
    1 引用 • 4 回帖
  • 开源

    Open Source, Open Mind, Open Sight, Open Future!

    393 引用 • 3380 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • nothollyhigh
    作者

    这里用 golang 的人多吗?

    1 回复
  • 88250

    还算行吧,我是其中一个 😄

    1 回复
  • nothollyhigh
    作者

    golang 用着蛮爽的 😄

    1 回复
  • 88250

    同意 🤝 golang 没有花哨的语法(try 也刚刚被否),让开发者把精力更专注在整体结构上(而不是设计不好时靠语法糖简化),虽然表面上看上去很复古,但实际上这才是编程的精髓。