雲原生專案實踐DevOps(GitOps)+K8S+BPF+SRE,從0到1使用Golang開發生產級麻將遊戲伺服器—第1篇

為少發表於2021-02-01

專案初探

專案地址:

這將是一個完整的,完全踐行 DevOps/GitOpsKubernetes 上雲流程的 Golang 遊戲伺服器開發的系列教程。

這個系列教程是對開源專案 Nanoserver 的完整拆解,旨在幫助大家快速上手 Golang(遊戲)伺服器後端開發。通過實踐去理解 Golang 開發的精髓 —— Share memory by communication(通過通訊共享記憶體)

同時這個專案可能還會涉及到 Linux 效能調優(BPF相關的工具)和系統保障(SRE)的相關的工作。

同志們,伺服器端程式是跑在 Linux 上面的。為啥效能上不來,可能真的是對作業系統瞭解的太少(共勉)。

服務端

我調整過後的專案:

原專案

我的本地環境:

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

# 清理資料檔案
# docker volume ls
# docker volume rm nanoserver_db_data

容器啟動後,會自動幫我們建立資料庫 - scmj

啟動服務端程式

已啟動好 MySql 後,我執行如下命令:

go run .

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

我們可以進入 http://localhost:8080/ 檢視一下:

客戶端

Kirk-Wang/nanoserver 中,為少已經放了一份專注於除錯伺服器邏輯的 apk

安裝安卓模擬器

這裡我推薦網易的 MuMu模擬器

安裝 APK

mahjong.apk,已經放到筆者修改過的專案中。這裡我們使用多開助手,開4個空來血戰。

客戶端登入

我們點選微信登入。

發現登入失敗……

如何解決?請繼續閱讀。

解決客戶端登入失敗問題

當然這問題,也好解決:

  1. 按作者所說那樣,反編譯 apk,找到 appConfig.luac,使用二進位制編輯器改完伺服器地址,然後重新打包。

  1. 直接使用代理,如 Charles 進行請求地址轉發。(本地除錯伺服器程式完全夠了)

Charles 對客戶端請求地址轉發

使用 Map Remote 對映到你本機除錯的地址就完全夠了。

加入 guest 測試渠道 konglai

重新登入進入遊戲

完美,搞定。

測試 & 湊一局血戰到底

建立房間

加入房間

開始遊戲

檢視伺服器日誌

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: 構建 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

GitOps & ArgoCD 宣告式雲原生漸進式部署

我是為少
微信:uuhells123
公眾號:黑客下午茶
加我微信(互相學習交流),關注公眾號(獲取更多學習資料~)

相關文章