go-zero 快速上手

官網文檔 其實說得很詳細, 作爲一個寫幾年代碼, 但是接手 go 項目不久的 go 新手, 來聊聊我跑 demo 遇到的問題

  • 解決環境問題一: etcd, mysql, redis
  • 解決環境問題二: go mod
  • 編碼中遇到的配置問題
  • 加速開發的一些工具
    • goland 配置 run/debug
    • http client 插件: 編碼化實現 api test
    • goreman 輕鬆管理多服務

環境準備一: 安裝etcd, mysql, redis

官網就一句話, 至於背後要怎麼折騰, 就看開發者自己了, 當然目前最簡單最推薦的方式 -- docker, 直接使用 docker-composer 啓動

version: '3.1'
services:
  mysql:
    image: mysql
    ports:
      - "3306:3306"
    environment:
      TZ: Asia/Shanghai
      MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
  redis:
    image: redis:alpine
    volumes:
      - ./config/redis.conf:/etc/redis/redis.conf
      - ./data/redis:/data
    ports:
      - "6379:6379"
  etcd:
    image: quay.io/coreos/etcd
    environment: 
      ETCD_ADVERTISE_CLIENT_URLS: "http://0.0.0.0:2379"
      ETCD_LISTEN_CLIENT_URLS: "http://0.0.0.0:2379"
      ETCDCTL_API: "3"
    ports: 
      - 2379:2379 # http

啓動的話也超級簡單, 就一行:

docker-compose up -d

啓動好了後一定要 check, 避免環境的問題一直遺留到代碼才發現

# redis-client
brew install redis
redis-cli -h localhost

# mysql-client
brew install mycli # mycli 和 mysql 兼容, 會有代碼提示, 推薦
mysql -hlocalhost -uroot -proot

# etcd-client
brew install etcd
etcdctl --endpoints <url> # 後面接相應的命令
member list # 查看 etcd server
put foo bar
get foo
del foo

PS: 建議做筆記, 這種入門級的內容往往最常用, 但是一段時間不接觸, 又最容易遺忘, 比如 etcdctl, 不翻筆記真不記得

當然, 直接使用 docker 也行, docker-compose 只是 docker run 的 trick:

# 最近切換到了 podman, 感興趣可以看文後的連接, 有 podman 快速上手
alias docker=podman
podman run -d -p6379:6379 redis:alpine
podman run -d -p3306:3306 -e TZ='Asia/Shanghai' -e MYSQL_ROOT_PASSWORD=root mysql
podman run -d -p2379:2379 -e ETCD_ADVERTISE_CLIENT_URLS='http://0.0.0.0:2379' -e ETCD_LISTEN_CLIENT_URLS='http://0.0.0.0:2379' -e ETCDCTL_API='3' quay.io/coreos/etcd

環境準備二: go mod

接觸 go 比較早但是一直不深, 就會對 go 的環境停留在似懂非懂的狀態, 然後經常遇到一些奇奇怪怪的問題, 這裏簡單總結了下 go 項目使用 go mod:

go mod init xxx # 初始化, 後續在項目執行 go run/build 就都會使用到 go mod
go mod vendor # copy 依賴到項目下的 vendor 目錄, 方便 IDE 代碼提示
go env -w GOPROXY=https://goproxy.cn/,direct # 設置代理, 這樣 go mod 下載包才快
export GOPROXY=https://goproxy.cn/,direct # 也可以設置到環境變量裏
go env # 檢查 go env

# 下面的 env 可設可不設
GO111MODULE="on" # 現在默認是 auto, 後續默認是 on, 有 go.mod 的項目下執行 go 命令, 都會是 go mod 模式下
GOFLAGS="-mod=vendor" # 默認值, 配合 go mod vendor 使用

有了這些後, 基本就能無障礙跑官方 demo 了, enjoy

編碼中遇到的配置問題

add.yaml 爲例:

# go 中 mysql dsn 的示例: user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local
DataSource: root:root@tcp(localhost:3306)/gozero # 這裏需要加上 pass 部分
Table: book
Cache:
  - Host: localhost:6379
    Pass: "123" # 需要注意, yaml 中會自動識別 int/string 類型, 這裏 Pass 需要使用 string 類型, 需要加 "" 指定

這裏遇到的幾個問題:

  • 需要熟悉 go 中 dsn 的配置, go-zero 中的配置 DataSource 其實是複用
  • 配置的問題還不夠完善, 需要有一定的源碼閱讀能力, yaml 文件會初始化到 config.go 中, 配置項和裏面的 struct 可以對應起來
  • yaml 中數據類型自動識別的小細節, 詳情見上面的註釋

加速開發的一些工具

goland 配置 run/debug

以 api gateway 爲例, 要運行, 在 api 目錄下執行 go run 即可:

go run bookstore.go -f etc/bookstore-api.yaml # -f 可以不加, bookstore.go 有設置默認值

可以在 goland 中輕鬆配置 run/debug:

  • menu > run > edit configurations...
  • 使用 template 中的 go build 模板, 改一下項目執行的目錄即可
  • 配置好後, 可以直接使用 ⌃R 運行 ⌃D debug

詳細文檔: goland > run/debug

http client 插件: 編碼化實現 api test

通常進行 api test 有 2 種方式:

  • 簡單情況下, 直接使用 curl 測試, 比如 curl -i baidu.com
  • 複雜情況下, 使用圖形化工具, 比如 postman 等

但是這些方案, 都在 編碼性 方面很一般, 如果不能編碼, 複用和修改 能力都大打折扣

所以我推薦:

2 者基本大同小異, 以 demo 中的 api 爲例:

###
http://localhost:8888/check?book=go-zero

###
http://localhost:8888/add?book=go-zero&price=10
  • ### 表示一個 api case
  • coding 過程中會有代碼提示, 自動處理 http 相關的細節
  • 執行(run) 非常簡單, 圖形界面/快捷鍵 都有支持

運行的結果如下, 輕鬆查看請求細節:

GET http://localhost:8888/check?book=go-zero

HTTP/1.1 200 OK
Content-Type: application/json
Date: Wed, 30 Dec 2020 05:53:47 GMT
Content-Length: 25

{
  "found": true,
  "price": 10
}

Response code: 200 (OK); Time: 49ms; Content length: 25 bytes

goreman 輕鬆管理多服務

拿 demo 舉例, 有 api add check 3 個服務, 要同時運行 3 個服務才能體驗完整流程, 在 goreman 下可以這樣做:

  • 安裝 goreman
brew install goreman
  • 編寫 Procfile 文件
# 定義好每個服務
api: cd api; go run bookstore.go
add: cd rpc/add; go run add.go
check: cd rpc/check; go run check.go
  • run
goreman start add check api

寫在最後

當然要秀一下 QPS 啦: Requests/sec: 44110.50

➜  bookstore wrk -t10 -c1000 -d40s --latency 'http://localhost:8888/check?book=go-zero'
Running 40s test @ http://localhost:8888/check?book=go-zero
  10 threads and 1000 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    19.91ms    9.06ms 103.27ms   63.78%
    Req/Sec     4.44k   575.52     5.57k    80.67%
  Latency Distribution
     50%   20.29ms
     75%   26.22ms
     90%   31.21ms
     99%   42.30ms
  1766254 requests in 40.04s, 224.03MB read
  Socket errors: connect 0, read 1062, write 0, timeout 0
Requests/sec:  44110.50
Transfer/sec:      5.59MB

附本機配置:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章