云原生項目實踐DevOps(GitOps)+K8S+BPF+SRE,從0到1使用Golang開發(fā)生產(chǎn)級麻將游戲服務器—第1篇

banner.png

項目初探

項目地址:

這將是一個完整的,完全踐行 DevOps/GitOpsKubernetes 上云流程的 Golang 游戲服務器開發(fā)的系列教程。

這個系列教程是對開源項目 Nanoserver 的完整拆解,旨在幫助大家快速上手 Golang(游戲)服務器后端開發(fā)。通過實踐去理解 Golang 開發(fā)的精髓 —— Share memory by communication(通過通信共享內(nèi)存)。

同時這個項目可能還會涉及到 Linux 性能調(diào)優(yōu)(BPF相關(guān)的工具)和系統(tǒng)保障(SRE)的相關(guān)的工作。

同志們,服務器端程序是跑在 Linux 上面的。為啥性能上不來,可能真的是對操作系統(tǒng)了解的太少(共勉)。

服務端

我調(diào)整過后的項目:

原項目

我的本地環(huán)境:

go version
# go version go1.14.14 darwin/amd64

使用容器運行 MySQL & Adminer

docker-compose.mysql.yaml

version: '3.1'
services:
  db:
    image: mysql
    command: 
      - --default-authentication-plugin=mysql_native_password
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci
    restart: always
    networks:
      - db_network
    ports:
      - "3306:3306"
    volumes:
      - 'db_data:/bitnami/mysql/data'
    environment:
      MYSQL_DATABASE: scmj
      MYSQL_ROOT_PASSWORD: 123456
    healthcheck:
      test: ['CMD', '/opt/bitnami/scripts/mysql/healthcheck.sh']
      interval: 15s
      timeout: 5s
      retries: 6
  adminer:
    image: adminer
    restart: always
    networks:
      - db_network
    ports:
      - 8080:8080
volumes:
  db_data:
    driver: local
networks:
  db_network:
    driver: "bridge"

啟動

docker-compose -f docker-compose.mysql.yaml up
# docker-compose -f docker-compose.mysql.yaml up -d 后臺運行
# docker-compose -f docker-compose.mysql.yaml down 卸載
# docker-compose -f docker-compose.mysql.yaml ps

# 清理數(shù)據(jù)文件
# docker volume ls
# docker volume rm nanoserver_db_data

容器啟動后,會自動幫我們創(chuàng)建數(shù)據(jù)庫 - scmj

啟動服務端程序

已啟動好 MySql 后,我運行如下命令:

go run .

正常你會看到如下截圖(會自動的創(chuàng)建表和索引):

1.png

我們可以進入 http://localhost:8080/ 查看一下:

2.png

客戶端

Kirk-Wang/nanoserver 中,為少已經(jīng)放了一份專注于調(diào)試服務器邏輯的 apk。

安裝安卓模擬器

這里我推薦網(wǎng)易的 MuMu模擬器。

3.png

安裝 APK

mahjong.apk,已經(jīng)放到筆者修改過的項目中。這里我們使用多開助手,開4個空來血戰(zhàn)。

4.png
5.png

客戶端登錄

我們點擊微信登錄。

6.png
7.png

發(fā)現(xiàn)登錄失敗……

如何解決?請繼續(xù)閱讀。

解決客戶端登錄失敗問題

當然這問題,也好解決:

  1. 按作者所說那樣,反編譯 apk,找到 appConfig.luac,使用二進制編輯器改完服務器地址,然后重新打包。
8.png
  1. 直接使用代理,如 Charles 進行請求地址轉(zhuǎn)發(fā)。(本地調(diào)試服務器程序完全夠了)

Charles 對客戶端請求地址轉(zhuǎn)發(fā)

使用 Map Remote 映射到你本機調(diào)試的地址就完全夠了。

9.png
10.png

加入 guest 測試渠道 konglai

11.png

重新登錄進入游戲

12.png
13.png

完美,搞定。

測試 & 湊一局血戰(zhàn)到底

創(chuàng)建房間

14.png

加入房間

15.png

開始游戲

16.png

查看服務器日志

17.png

DevOps(Drone CI/CD) & DevOps

.drone.yml

kind: pipeline
type: kubernetes
name: NanoServer

steps:

  - name: 更新 Chart.yaml appVersion
    image: busybox
    commands:
      - echo $DRONE_COMMIT
      - '[ -n "$DRONE_COMMIT" ] && (
          sed -i "s/APP_VERSION/${DRONE_COMMIT}/g" k8s/nanoserver/nanoserver/Chart.yaml;
        )'
      - cat k8s/nanoserver/nanoserver/Chart.yaml

  - name: 構(gòu)建 Docker Image
    image: plugins/docker
    settings:
      debug: true
      dockerfile: Dockerfile.prod
      repo: hub.your-domain.com/library/nanoserver
      tags: ${DRONE_COMMIT}
      registry: hub.your-domain.com
      username:
        from_secret: docker_user
      password:
        from_secret: docker_pass

  - name: 上云(HelmV3) -> K8S Cluster
    image: pelotech/drone-helm3
    settings:
      helm_command: upgrade
      chart: ./k8s/nanoserver/nanoserver
      release: nanoserver
      vaules_yaml: ./k8s/nanoserver/values.yaml
      namespace: nano
      api_server:
        from_secret: api_server
      kubernetes_token:
        from_secret: k8s_token
      skip_tls_verify: true

trigger:
  branch:
    - master
devops1.png
devops2.png

GitOps & ArgoCD 聲明式云原生漸進式部署

gitops.png
argocd.png
我是為少
微信:uuhells123
公眾號:黑客下午茶
加我微信(互相學習交流),關(guān)注公眾號(獲取更多學習資料~)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容