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

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

介绍



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

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


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


脚手架项目


  • 脚手架是基于 nanoserver 抽出来的,旨在帮助大家快速理解这个 Mahjong Server 是如何搭出来的。
  • 我们先单体架构理解整体业务 -> 然后再 分布式 Nano Server + 微服务 改造(Step-by-Step)。
  • Demo:go-mahjong-server


基础回顾



Go Modules


我的本地环境:


go version
# go version go1.14.14 darwin/amd64


go mod help

Go mod 提供对 modules 操作的访问。

请注意,所有 go 命令都内置了对 modules 的支持, 不只是'go mod'。例如,日常的依赖关系添加(adding),删除(removing),升级(upgrading)和降级(downgrading)应该使用 'go get' 完成。有关 module 功能的概述,请参见 'go help modules'

用法:


go mod <command> [arguments]


  • download 将模块下载到本地缓存
  • edit 通过工具或脚本编辑 go.mod
  • graph 打印模块依赖图
  • init 在当前目录中初始化新模块
  • tidy 添加缺少的内容并删除未使用的模块
  • vendor 制作第三方依赖包(vendored)的依赖副本
  • verify 验证依赖项具有预期的内容
  • why 解释为什么需要软件包(packages)或模块(modules)

使用 “go help mod <命令>” 可获取有关命令的更多信息。


微信图片_20220611151924.png

脚手架基本结构


├── configs # 配置文件
│   ├── config.toml
├── db # 数据库(xorm)相关
│   ├── model
│   │   ├── struct.go # database schema
│   ├── const.go
│   ├── logger.go
│   ├── model.go
├── internal
│   ├── game # 游戏服务器(Nano server)
│   │   ├── crypto.go
│   │   ├── game.go
│   │   ├── manager.go
│   ├── web # web 服务器(提供 API)
│   │   ├── web.go
├── pkg # 项目基础包
│   ├── algoutil # 常用工具函数
│   │   ├── algoutil.go 
│   ├── crypto # md5 rsa sha1 x509 base64 相关工具
│   │   ├── crypto.go
│   ├── errutil # 游戏服务器中错误码和错误信息统一管理
│   │   ├── code.go
│   │   ├── errutil.go
│   ├── whitelist # 白名单验证工具函数
│   │   ├── white_list.go
├── protocol # 协议(放所有游戏)
│   ├── web.go
├── main.go # 入口


Mahjong Server 基础启动流程



Everything start with main.go


加载配置文件


configs/config.toml

  • core 核心基础配置
  • webserver web 服务器配置
  • game-server 游戏服务器配置
  • database 数据库配置
  • whitelist 白名单配置
  • update 客户端更新配置


启动 Game Server


game.Startup()

  1. 根据配置config.toml,打印相关启动信息:
  • 当前游戏服务器版本
  • 是否强制更新
  • 当前心跳时间间隔
  1. 业务功能配置(如:房卡设置
  2. 注册游戏业务逻辑(Nano Components)
  • 玩家申请加入俱乐部
  • 创建一张桌子
  • 根据桌号返回牌桌数据
  • 设置桌号对应的牌桌数据
  • 检查登录玩家关闭应用之前是否正在游戏
  • 网络断开后, 重新连接网络
  • 网络断开后, 如果ReConnect后发现当前正在房间中, 则重新进入, 桌号是之前的桌号
  • 应用退出后重新进入房间
  • 理牌结束
  • 定缺
  • 有玩家请求解散房间
  • 玩家语音消息
  • 处理出玩家和重置玩家消息(来自http)
  • ……
  1. 注册游戏数据包加密管道
  • pipeline(Inbound & Outbound)
  1. 根据设置,启动游戏服务器(Nano server)
  • WithPipeline
  • WithHeartbeatInterval
  • WithLogger
  • WithSerializer
  • WithComponents
  • ……


启动 Web Server


web.Startup()

  1. 数据库设置(XORM)
  • DSN 数据库连接字符串
  • ShowSQL 是否显示生产的 Sql 语句
  • MaxIdleConn 最大空闲连接
  • MaxOpenConn 最大打开连接 < MaxIdleConn
  • syncSchema xorm 同步 model 到数据库表结构
  • async write channel 数据异步插入管道,持久化数据
  • async update channel 数据异步更新管道,持久化数据
  • 定时 ping 数据库, 保持连接池连接
  1. 启用白名单(风控相关功能)
  2. API 服务注册(业务相关接口)
  • 登录
  • 注册人数
  • 活跃人数
  • 同时在线人、桌数
  • 留存
  • 房卡消耗
  • 重置玩家未完成房间状态
  • 设置房卡消耗
  • 消息广播
  • 踢人
  • 在线信息
  • 玩家充值
  • 玩家信息查询
  • ……
  1. 是否启用 http.ListenAndServeTLS
  2. Graceful Shutdown(优雅退出,程序关闭前可做一下清理工作)
  • syscall.SIGINT
  • syscall.SIGQUIT
  • syscall.SIGKILL

同时,在 kubernetes 中运行微服务时。我们需要处理 kubernetes 发出的终止信号。这样做的正确方法是:

  1. 监听 SIGINT, SIGTERM
  2. 收到信号后,将服务置于不健康模式(/health 路由应返回状态码 4xx5xx
  3. 在关闭之前添加宽限期,以允许 kubernetes 将您的应用程序从负载均衡器中移除
  4. 关闭服务器和所有打开的连接
  5. Shutdown


脑图


微信图片_20220611151954.pngimage.gif


快速上手开发


Docker Compose 本地一键启动 MySql


上篇已有详细介绍,这里就不赘述了哈。

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


docker-compose -f docker-compose.mysql.5.7.yaml up # -d
docker-compose -f docker-compose.mysql.5.7.yaml down


使用 Air 进行本地开发


☁️ Live reload for Go apps


go get -u github.com/cosmtrek/air


开发(项目根目录):


air


微信图片_20220611152020.png

使用 VSCode-Go 插件调试程序


VSCode-Go Debugging

安装 Delve

打开 命令面板(Windows/Linux: Ctrl+Shift+P; OSX: Shift+Command+P),选择 Go: Install/Update Tools, 然后选择 dlv


开始调试


打开你想要调试的 package main 源文件(source file)或测试文件(test file)

使用以下任何一种方式进行调试:


  1. 打开 命令面板, 选择 Debug: Start Debugging,然后选择 Go
  2. 打开调试窗口(Windows/Linux: Ctrl+Shift+D; OSX: Shift+Command+D),然后点击 Run and Debugs,然后选择 Go
  3. 从主菜单选择 Run > Start Debugging

微信图片_20220611152033.png

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务&nbsp;ACK 容器服务&nbsp;Kubernetes&nbsp;版(简称&nbsp;ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
相关文章
|
3月前
|
Kubernetes 安全 Docker
在 K8s 集群中创建 DERP 服务器
在 K8s 集群中创建 DERP 服务器
|
1月前
|
Kubernetes 容器
k8s容器时间与服务器时间不一致问题
k8s容器时间与服务器时间不一致问题
25 0
|
9天前
|
Kubernetes Cloud Native Go
Golang深入浅出之-Go语言中的云原生开发:Kubernetes与Docker
【5月更文挑战第5天】本文探讨了Go语言在云原生开发中的应用,特别是在Kubernetes和Docker中的使用。Docker利用Go语言的性能和跨平台能力编写Dockerfile和构建镜像。Kubernetes,主要由Go语言编写,提供了方便的客户端库与集群交互。文章列举了Dockerfile编写、Kubernetes资源定义和服务发现的常见问题及解决方案,并给出了Go语言构建Docker镜像和与Kubernetes交互的代码示例。通过掌握这些技巧,开发者能更高效地进行云原生应用开发。
52 1
|
16天前
|
中间件 Go API
Golang深入浅出之-Go语言标准库net/http:构建Web服务器
【4月更文挑战第25天】Go语言的`net/http`包是构建高性能Web服务器的核心,提供创建服务器和发起请求的功能。本文讨论了使用中的常见问题和解决方案,包括:使用第三方路由库改进路由设计、引入中间件处理通用逻辑、设置合适的超时和连接管理以防止资源泄露。通过基础服务器和中间件的代码示例,展示了如何有效运用`net/http`包。掌握这些最佳实践,有助于开发出高效、易维护的Web服务。
28 1
|
2月前
|
弹性计算 运维 Kubernetes
云原生K8S场景自动化响应ECS系统事件
客户云原生K8S场景下,通过社区开源NPD+Draino+Autoscaler零开发,对接响应ECS主动运维事件,通过自动响应事件减少非预期宕机。
|
3月前
|
Kubernetes 应用服务中间件 nginx
K8S Pod Sidecar 应用场景之一 - 加入 NGINX Sidecar 做反代和 web 服务器
K8S Pod Sidecar 应用场景之一 - 加入 NGINX Sidecar 做反代和 web 服务器
|
3月前
|
Kubernetes 监控 安全
「译文」在 K8S/OpenShift 上开发应用程序的 14 种最佳实践
「译文」在 K8S/OpenShift 上开发应用程序的 14 种最佳实践
|
4月前
|
Go
golang力扣leetcode 1606.找到处理最多请求的服务器
golang力扣leetcode 1606.找到处理最多请求的服务器
23 0
|
7月前
|
Kubernetes 调度 虚拟化
【K8S系列】第十四讲:初识K8s架构之服务器的变迁
【K8S系列】第十四讲:初识K8s架构之服务器的变迁
50 0
|
7月前
|
Kubernetes Cloud Native Java
猫头虎博主赠书一期:《Kubernetes原生微服务开发》
猫头虎博主赠书一期:《Kubernetes原生微服务开发》
61 0