云原生项目实践DevOps(GitOps)+K8S+BPF+SRE,从0到1使用Golang开发生产级麻将游戏服务器—第3篇

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 云原生项目实践DevOps(GitOps)+K8S+BPF+SRE,从0到1使用Golang开发生产级麻将游戏服务器—第3篇

介绍



这将是一个完整的,完全践行 DevOps/GitOpsKubernetes 上云流程的 Golang 游戏服务器开发的系列教程。

这个系列教程是对开源项目 Nanoserver 的完整拆解,旨在帮助大家快速上手 Golang(游戏)服务器后端开发。通过实践去理解 Golang 开发的精髓 —— Share memory by communication(通过通信共享内存)


同时这个项目可能还会涉及到 Linux 性能调优(BPF 相关的工具)和系统保障(SRE)的相关的工作。


Step-By-Step 开发 Mahjong Server



  • 单体架构理解 Mahjong Server 业务 -> Nano Distributed Game Server(分布式) + 微服务 改造。
  • Demo:go-mahjong-server


游客登录业务分析



游客(Guest)登录 这里主要还是用于开发与调试程序。


回顾一下 Nano 框架


关于 Nano Game Server 的快速上手大家可以参看我之前写的 -> 5 分钟上手 Nano 游戏服务器框架

Nano 术语


  • 组件(Component):nano 应用的功能就是由一些松散耦合的 Component 组成的,每个 Component 完成一些功能。
  • Handler:它定义在 Component 内的方法,用来处理具体的业务逻辑。
  • 路由(Route):用来标识一个具体服务 或者客户端接受服务端推送消息的位置
  • 会话(Session):客户端连接服务器后, 建立一个会话保存连接期间一些上下文信息。连接断开后释放。
  • 组(Group):Group 可以看作是一个 Session 的容器,主要用于需要广播推送消息的场景。
  • 请求(Request), 响应(Response), 通知(Notify), 推送(Push):Nano 中四种消息类型。


Nano 组件的生命周期


type DemoComponent struct{}
func (c *DemoComponent) Init()           {}
func (c *DemoComponent) AfterInit()      {}
func (c *DemoComponent) BeforeShutdown() {}
func (c *DemoComponent) Shutdown()       {}


  • Init:组件初始化时将被调用。
  • AfterInit:组件初始化完成后将被调用。
  • BeforeShutdown:组件销毁之前将被调用。
  • Shutdown:组件销毁时将被调用。

整个组件的生命周期看起来非常的清晰。


Nano Game Server 开启 Debug 模式


internal/game/game.go,我加入了 nano.WithDebugMode()


nano.Listen(addr,
  nano.WithPipeline(pip),
  nano.WithHeartbeatInterval(time.Duration(heartbeat)*time.Second),
  nano.WithLogger(log.WithField("component", "nano")),
  nano.WithSerializer(json.NewSerializer()),
  nano.WithComponents(comps),
  nano.WithDebugMode(),
)


启动游戏服务器并查看其启动日志


微信图片_20220611152211.jpgimage.gif


这个主要是了解 Nano Server 启动的时候都注册了哪些游戏🎮业务逻辑。

日志 -> The current server running in singleton mode:这句话告诉我们 Nano 服务器当前启动模式是单体。Nano 也可以作为分布式系统运行,他内置了一个小型的分布式系统设计(可以学习下它的架构,入门分布式系统开发)。

通过日志我们清晰的看到,Nano 注册了三个组件 ManagerDeskManagerClubManager,用来管理所有的游戏🎮业务逻辑。


Manager(Handlers):

  • Manager.CheckOrder
  • Manager.Login

DeskManager(Handlers):

  • DeskManager.DissolveStatus
  • DeskManager.QiPaiFinished
  • DeskManager.VoiceMessage
  • DeskManager.ClientInitCompleted
  • DeskManager.Exit
  • DeskManager.OpChoose
  • DeskManager.Ready
  • DeskManager.UnCompleteDesk
  • DeskManager.DingQue
  • DeskManager.Dissolve
  • DeskManager.Join
  • DeskManager.ReJoin
  • DeskManager.RecordingVoice
  • DeskManager.Resume
  • DeskManager.CreateDesk
  • DeskManager.Pause
  • DeskManager.ReConnect
  • DeskManager.ReEnter

ClubManager(Handlers):

  • ClubManager.ApplyClub


微信图片_20220611152234.jpgimage.gif


分析 Nano Debug 日志和 Charles 捕获

如何代理 API 到本地 Nanoserver 和以及捕获 http 请求?-> 大家可以参看系列的第一篇

Charles API 捕获


image.gif微信图片_20220611152251.jpg


我们清晰的看到这一次的操作调用了两个 API


  1. /v1/user/login/query -> 查询是否已启用游客(Guest)登录


POST http://192.168.31.125:12307/v1/user/login/query HTTP/1.1
content-type: application/json
{
    "channelId": "konglai",
    "appId": "konglai"
}


  1. /v1/user/login/guest -> 进行游客登录


POST http://192.168.31.125:12307/v1/user/login/guest HTTP/1.1
content-type: application/json
{
    "channelId": "konglai",
    "appId": "konglai",
    "imei": "c0a4ce912c48a3d0b17b59e6b97f1dca"
}


服务器 Debug 日志输出

微信图片_20220611152310.jpg


我们看到了 Nano Server 输出的如下关键信息:

  1. Message={ Request Manager.Login }
  2. Message={ Request DeskManger.UnCompleteDesk}

客户端根据 Web API(v1/user/login/guest) 返回的游戏服务器地址 192.168.31.125:33251,进行了 socket 连接并与 Nano Game Server 进行了通讯。

关于 Nano 协议快速入门,大家可查看: 3分钟快速理解 Nano 通信协议(内含记忆脑图)


最后,一句话描述业务流程


用户单击登录按钮 -> 查询服务器是否启用游客(Guest)登录 -> (如果启用?)进行游客登录 -> 获取游戏服务器地址 -> 连接游戏服务器 -> (连接成功?)进入游戏大厅


微信图片_20220611152323.png


关于登录流程的详细业务和代码逻辑,我们下篇再详细讨论。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
5月前
|
Cloud Native 测试技术 开发者
终于!我找到了开发的得力助手!阿里云天池云原生编程挑战赛参赛攻略
在比赛过程中,通义灵码插件成为了我开发工作的得力助手。这个插件提供了智能代码补全和错误提示功能,大大提高了我的编码效率。尤其是通义灵码能够实时分析代码,给出优化建议,让我避免了很多潜在的错误。
224 64
|
13天前
|
存储 NoSQL Cloud Native
MongoDB云原生化:为企业开发注入高效动力
MongoDB云原生化为企业开发注入高效动力,分为三部分:1. 介绍阿里云和MongoDB的服务;2. 阿里云MongoDB解决自建模型痛点的功能,包括隔离性、海量数据处理、弹性能力及运维操作优化;3. 客户案例展示。通过云原生架构,MongoDB实现了灵活的扩展、高效的备份恢复和快速的回档能力,显著提升了企业的业务迭代速度和数据管理效率。典型客户如吉比特、莉莉丝、掌阅等受益于这些功能,实现了更稳定和高效的数据库服务。
|
2月前
|
Kubernetes Cloud Native 开发者
通义灵码对云原生应用开发的支持
通义灵码是阿里巴巴云推出的一款强大的云原生应用开发工具,支持容器化、编排技术等,提供从Dockerfile生成、容器镜像构建与推送,到Kubernetes配置文件生成及与Kubernetes集群集成的全方位支持,极大简化了云原生应用开发流程,提升了开发效率和应用质量。
通义灵码对云原生应用开发的支持
|
4月前
|
人工智能 Cloud Native Serverless
来云栖大会!探展云上开发,沉浸式体验云原生 + AI 新奇玩法
计算馆将展示中国最先进的云计算产业链全景,从底层硬件到数据创新,从云计算基础设施到数据管理服务、人工智能平台和模型服务,全景式呈现 AI 时代云计算最新技术形态和产品进展。计算馆有哪些推荐?往下看!
|
5月前
|
运维 Kubernetes Devops
阿里云云效操作报错合集之k8s直接返回401,该如何排查
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。
阿里云云效操作报错合集之k8s直接返回401,该如何排查
|
4月前
|
Go API
Golang语言开发注意事项
这篇文章总结了Go语言开发中的注意事项,包括语法细节、注释使用、代码风格、API文档的利用以及如何使用godoc工具来生成文档。
49 2
|
5月前
|
监控 测试技术 API
|
5月前
|
敏捷开发 Kubernetes 测试技术
阿里云云效产品使用合集之如何在K8s集群上进行构建
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
5月前
|
监控 Serverless Go
Golang 开发函数计算问题之Go 语言中切片扩容时需要拷贝原数组中的数据如何解决
Golang 开发函数计算问题之Go 语言中切片扩容时需要拷贝原数组中的数据如何解决
|
5月前
|
Java Serverless Go
Golang 开发函数计算问题之在 Golang 中避免 "concurrent map writes" 异常如何解决
Golang 开发函数计算问题之在 Golang 中避免 "concurrent map writes" 异常如何解决
下一篇
开通oss服务