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

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

介绍



这将是一个完整的,完全践行 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


牌(Tiles)抽象



定义 Tile struct


微信图片_20220611153244.png


type Tile struct {
  Id    int
  Suit  int
  Rank  int
  Index int
}


  • Id108 张牌,用 0~107 标识每一张牌。
  • Suit:三种花色,用 0~2 标识每一种花色(0:,1:,2:)。
  • Rank9 种点数,用 1~9 标识(如:1条,9条,1筒,9筒,1万,9万等…)。
  • Index:索引(条:1~9,筒:11~19,万:21~29)。


通过一张表来理解


三种花色,每种类型牌的索引(Index):


条(1 ~ 9) 筒(11 ~ 19) 万(21 ~ 29)
1 1条 11 1筒 21 1万
2 2条 12 2筒 22 2万
3 3条 13 3筒 23 3万
4 4条 14 4筒 24 4万
5 5条 15 5筒 25 5万
6 6条 16 6筒 26 6万
7 7条 17 7筒 27 7万
8 8条 18 8筒 28 8万
9 9条 19 9筒 29 9万


所有牌(这里是 108 张)的 ID 编号:


(0 ~ 35) (36 ~ 71 (72 ~ 107
0 1条 36 1筒 72 1万
1 1条 37 1筒 73 1万
2 1条 38 1筒 74 1万
3 1条 39 1筒 75 1万
4 2条 40 2筒 76 2万
5 2条 41 2筒 77 2万
6 2条 42 2筒 78 2万
7 2条 43 2筒 79 2万
8 3条 44 3筒 80 3万
9 3条 45 3筒 81 3万
10 3条 46 3筒 82 3万
11 3条 47 3筒 83 3万
12 4条 48 4筒 84 4万
13 4条 49 4筒 85 4万
14 4条 50 4筒 86 4万
15 4条 51 4筒 87 4万
16 5条 52 5筒 88 5万
17 5条 53 5筒 89 5万
18 5条 54 5筒 90 5万
19 5条 55 5筒 91 5万
20 6条 56 6筒 92 6万
21 6条 57 6筒 93 6万
22 6条 58 6筒 94 6万
23 6条 59 6筒 95 6万
24 7条 60 7筒 96 7万
25 7条 61 7筒 97 7万
26 7条 62 7筒 98 7万
27 7条 63 7筒 99 7万
28 8条 64 8筒 100 8万
29 8条 65 8筒 101 8万
30 8条 66 8筒 102 8万
31 8条 67 8筒 103 8万
32 9条 68 9筒 104 9万
33 9条 69 9筒 105 9万
34 9条 70 9筒 106 9万
35 9条 71 9筒 107 9万


编码实战



通过 ID 获取 Tile

一个算术问题,没啥好说的。

  • 三种花色,每种有 9 类不同的牌,每类又有 4 张相同的牌。

internal/game/tile.go


func TileFromID(id int) *Tile {
  if id < 0 {
    panic("illegal tile id")
  }
  var (
    tmp = id / 4
    h   = tmp / 9
    v   = tmp%9 + 1
    i   = h*10 + v
  )
  return &Tile{Suit: h, Rank: v, Index: i, Id: id}
}


编写单元测试函数


TileFromID 函数上右击选择 Generate Unit Tests For Function,我们编写它的单元测试函数。


微信图片_20220611153249.png

internal/game/tile_test.go


func TestTileFromID(t *testing.T) {
  type args struct {
    id int
  }
  tests := []struct {
    name string
    args args
    want *Tile
  }{
    // 定义一堆用例
    {"1条", args{id: 0}, &Tile{Suit: 0, Rank: 1, Index: 1, Id: 0}},
    {"1条", args{id: 1}, &Tile{Suit: 0, Rank: 1, Index: 1, Id: 1}},
    {"1条", args{id: 2}, &Tile{Suit: 0, Rank: 1, Index: 1, Id: 2}},
    {"1条", args{id: 3}, &Tile{Suit: 0, Rank: 1, Index: 1, Id: 3}},
    {"9条", args{id: 35}, &Tile{Suit: 0, Rank: 9, Index: 9, Id: 35}},
    {"1筒", args{id: 36}, &Tile{Suit: 1, Rank: 1, Index: 11, Id: 36}},
    {"1筒", args{id: 37}, &Tile{Suit: 1, Rank: 1, Index: 11, Id: 37}},
    {"1筒", args{id: 38}, &Tile{Suit: 1, Rank: 1, Index: 11, Id: 38}},
    {"1筒", args{id: 39}, &Tile{Suit: 1, Rank: 1, Index: 11, Id: 39}},
    {"9筒", args{id: 71}, &Tile{Suit: 1, Rank: 9, Index: 19, Id: 71}},
    {"1万", args{id: 72}, &Tile{Suit: 2, Rank: 1, Index: 21, Id: 72}},
    {"1万", args{id: 73}, &Tile{Suit: 2, Rank: 1, Index: 21, Id: 73}},
    {"1万", args{id: 74}, &Tile{Suit: 2, Rank: 1, Index: 21, Id: 74}},
    {"1万", args{id: 75}, &Tile{Suit: 2, Rank: 1, Index: 21, Id: 75}},
    {"9万", args{id: 107}, &Tile{Suit: 2, Rank: 9, Index: 29, Id: 107}},
  }
  for _, tt := range tests {
    t.Run(tt.name, func(t *testing.T) {
      if got := TileFromID(tt.args.id); !reflect.DeepEqual(got, tt.want) {
        t.Errorf("TileFromID() = %v, want %v", got, tt.want)
      }
    })
  }
}


执行:


cd internal/game/mahjong 
go test -v tile_test.go tile.go mahjong.go


微信图片_20220611153349.png

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
8月前
|
Kubernetes Devops 应用服务中间件
基于 Azure DevOps 与阿里云 ACK 构建企业级 CI/CD 流水线
本文介绍如何结合阿里云 ACK 与 Azure DevOps 搭建自动化部署流程,涵盖集群创建、流水线配置、应用部署与公网暴露,助力企业高效落地云原生 DevOps 实践。
957 2
|
7月前
|
Shell 网络安全 开发工具
服务器已经搭建好的项目如何关联至gitee对应仓库并且将服务器的项目代码推送至gitee-优雅草卓伊凡
服务器已经搭建好的项目如何关联至gitee对应仓库并且将服务器的项目代码推送至gitee-优雅草卓伊凡
446 5
|
9月前
|
监控 Java Linux
Apache NiFi项目的编译与部署于CentOS服务器
总而言之,Apache NiFi的编译和部署虽然涉及多个步骤,但这些操作步骤简明扼要,即使是不太熟悉Java或Maven的用户也能跟随指南完成。通过遵循上述步骤,您将能够在CentOS服务器上成功部署Apache NiFi,为您的数据流处理任务建立一个功能强大的平台。
548 16
|
11月前
|
弹性计算 安全
阿里云服务器镜像,快速迁移项目数据
有时候旧服务器快到期了,想把项目、数据、软件挪到新服务器上,如果全部重新搭建的话,那无疑是耗时又费力。有了镜像迁移,就方便了许多。
762 1
|
12月前
|
缓存 Go
如何解决Golang开发中校验和不匹配问题
以上就是解决Golang开发中校验和不匹配问题的一些方法。这就像小刺猬解决他的“果酱瓶”问题一样,清理错误、替换新的、打破旧的,希望对你有所帮助!
220 5
|
Docker Python 容器
Docker——阿里云服务器使用Docker部署python项目全程小记
本文记录了我在阿里云服务器上使用Docker部署python项目(flask为例)的全过程,在这里记录和分享一下,希望可以给大家提供一些参考。
1790 1
|
存储 弹性计算 固态存储
阿里云服务器租用价格参考:云服务器各收费项目收费标准与活动价格
阿里云服务器收费项目有实例价格、预留实例券、专有宿主机、块存储价格、存储容量单位包、带宽价格和快照服务价格,收费模式有包年包月和按量付费模式。本文为大家汇总了2025年阿里云服务器各个收费项目的最新收费标准与云服务器的最新活动价格,以供参考和了解。
|
开发框架 .NET PHP
网站应用项目如何选择阿里云服务器实例规格+内存+CPU+带宽+操作系统等配置
对于使用阿里云服务器的搭建网站的用户来说,面对众多可选的实例规格和配置选项,我们应该如何做出最佳选择,以最大化业务效益并控制成本,成为大家比较关注的问题,如果实例、内存、CPU、带宽等配置选择不合适,可能会影响到自己业务在云服务器上的计算性能及后期运营状况,本文将详细解析企业在搭建网站应用项目时选购阿里云服务器应考虑的一些因素,以供参考。
|
关系型数据库 MySQL Linux
基于阿里云服务器Linux系统安装Docker完整图文教程(附部署开源项目)
基于阿里云服务器Linux系统安装Docker完整图文教程(附部署开源项目)
3044 3

推荐镜像

更多