{"id":21618776,"url":"https://github.com/dualface/go-gbc","last_synced_at":"2025-04-11T08:42:14.664Z","repository":{"id":57515356,"uuid":"143402272","full_name":"dualface/go-gbc","owner":"dualface","description":"A game server framework written by Golang and Lua. make our life easier.","archived":false,"fork":false,"pushed_at":"2020-02-03T13:13:51.000Z","size":59,"stargazers_count":94,"open_issues_count":0,"forks_count":18,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-03-25T06:12:21.552Z","etag":null,"topics":["game","game-deveopment","game-server","gameserver","go","golang","lua"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dualface.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-08-03T08:42:27.000Z","updated_at":"2025-03-04T12:14:49.000Z","dependencies_parsed_at":"2022-09-26T18:31:05.185Z","dependency_job_id":null,"html_url":"https://github.com/dualface/go-gbc","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dualface%2Fgo-gbc","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dualface%2Fgo-gbc/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dualface%2Fgo-gbc/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dualface%2Fgo-gbc/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dualface","download_url":"https://codeload.github.com/dualface/go-gbc/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248362460,"owners_count":21091132,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["game","game-deveopment","game-server","gameserver","go","golang","lua"],"created_at":"2024-11-24T23:06:57.961Z","updated_at":"2025-04-11T08:42:14.646Z","avatar_url":"https://github.com/dualface.png","language":"Go","funding_links":[],"categories":["Go"],"sub_categories":[],"readme":"# GameBox Cloud\n\ngo-gbc 是以前 gbc 项目的精神继承者。\n \n之所以这样说，是因为 go-gbc 的目标仍然和 gbc 保持一致：\n\n1. 以 Lua 编写所有逻辑\n2. 让游戏服务端的开发变得轻松，显著降低游戏服务端的开发门槛\n3. 以同步非阻塞的方式处理 IO 操作\n\n~\n\n## 主要特征\n\ngo-gbc 是一个通用的游戏服务端架构，使用了游戏行业常用的 Lua 脚本语言：\n\n- 利用 golang 带来的网络并发处理机制，充分发挥现代硬件和云环境的能力\n- 配合 golang 的 channel 和 Lua 的协程，带来简单易学的网络编程体验\n- 灵活的架构，仅需极少代码即可按需组装需要的组件，搭建满足不同需求的服务器\n- 完善的 Lua 框架，让服务端逻辑开发变得轻松愉悦\n- 经过实战检验的架构设计和实现\n\n~\n\n### 并发\n\n与其他以 Lua 作为开发语言的服务端架构不同，go-gbc 的 golang 底层可以最大程度发挥现代硬件和云环境的能力。开发者不需要操心底层的多线程、网络事件、消息通讯等繁琐的问题，只需要集中精力于游戏逻辑的实现。\n\n每当在 Lua 脚本里发起 IO 操作，发起操作的代码都会暂停执行。但此时服务器并不会被阻塞，只是把 IO 操作交给系统去完成。当 IO 操作完成后，服务器会从之前暂停的代码处继续执行。虽然 go-gbc 的脚本执行性能只是和 Python3 大致相当，但由于耗时的 IO 操作不会影响其他 Lua 虚拟机里逻辑的执行，所以 go-gbc 可以在同一时间处理大量的并发消息。\n\n~\n\n### 易学易用\n\ngo-gbc 中可以创建任意数量的 Lua 虚拟机来处理游戏逻辑，每个 Lua 虚拟机之间互相隔离又可以轻松交互。\n\n所有的游戏逻辑都可以采用消息驱动的方式来实现。消息驱动简单易懂，不需要开发者了解多线程、并发、资源冲突、加锁等底层细节。\n\n要实现一个逻辑单元（例如玩家、NPC、房间），开发者要做的事情非常简单：\n\n- 注册需要处理的消息\n- 在收到消息时执行逻辑\n- 发出消息\n\n至于访问数据库、高速缓存、网络等等脏活累活，开发者只需要调用 Lua 库的方法即可，而且不需要为这些异步 IO 操作写一大堆回调函数。\n\n~\n\n### 灵活可扩展\n\n充分利用 golang 的 interface 机制。go-gbc 提供的组件可以轻松组合，满足各种不同的需求。\n\n- 来自外部的消息是 Protobuf？没问题，在输入管道上添加一个 Protobuf 解码过滤器；\n- 来自外部的消息有加密？管道上再添加一个解密过滤器；\n- 来自外部的消息不但有加密，还有 Base64 编码？管道上再再添加一个 Base64 解码过滤器；\n- 什么，你的消息还有 XOR 变换？管道上再再再添加一个 XOR 变换过滤器。\n- 发给外部的消息也要做上述处理？只需要按照相反的顺序在输出管道上添加几个过滤器就可以了。\n\n利用输入输出管道，可以轻松定制服务器和外部的通讯机制。自定义的消息格式和消息加密编码等，也只需要编写相应的过滤器。而一个过滤器通常只有几十行代码。\n\n~\n\n除了输入输出管道，go-gbc 还提供了链接组供开发者对传入连接进行逻辑上的分组管理：\n\n- 链接组接收一组连接传入的消息\n- 可以给一个组里的所有链接群发消息\n- 可以给一个组里的特定链接发消息\n- 可以查找组里的链接\n- 将组里所有链接收到的消息交给消息处理函数\n\n利用链接组，要实现房间、副本等机制易如反掌。而当玩家退出房间和副本时，只需要把该玩家的客户端链接从一个链接组迁移到另一个链接组即可，就这么简单。\n\n~\n\ngo-gbc 已经提供了一组符合接口规范的管道、过滤器、链接组等实现。如果已有的实现无法满足需求，开发者可以选择在 go-gbc 已有组件上扩展，也可以完全实现自己的组件，并且将自己的组件无缝组装到 go-gbc 中。\n\n~\n\n### Coding in Lua\n\nLua 是一种在游戏行业广泛使用的编程语言，具有易学易用、执行快速等优点。所以 go-gbc 选择 Lua 作为编写游戏逻辑的语言，将开发游戏服务器的门槛降到了非常低的程度。\n\n不夸张的说，任何开发人员学习一周 Lua 脚本语言和 go-gbc 的示例，就可以开始编写游戏服务器逻辑了。\n\n~\n\ngo-gbc 里还附带了一个功能完善的 Lua 框架，补充了 Lua 语言和标准库缺少的一些功能。并对大量功能模块进行了封装和抽象，让开发者可以使用清晰的 API 开发游戏服务器。\n\n~\n\n\n### 实践出真知\n\ngo-gbc 一开始就是作为生产项目的底层架构来设计和实现的。每一次的更新和每一个版本的发布，都是让 go-gbc 从可靠变得更可靠。\n\n随着生产项目的逐渐完善，越来越多成熟稳定的组件也会开源到 go-gbc 中。\n\n~\n\n感谢大家看完一堆废话，请速速 clone 并提出改进意见吧 ^_^\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdualface%2Fgo-gbc","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdualface%2Fgo-gbc","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdualface%2Fgo-gbc/lists"}