官網文檔 其實說得很詳細, 作爲一個寫幾年代碼, 但是接手 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 等
但是這些方案, 都在 編碼性
方面很一般, 如果不能編碼, 複用和修改 能力都大打折扣
所以我推薦:
- idea 下使用 http client 插件
- vscode 下使用 rest client 插件
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
附本機配置: