go-zero 介紹和使用
一、什么是 go-zero?
go-zero 是一個(gè)基于 Go 語(yǔ)言的微服務(wù)框架,提供了高效、簡(jiǎn)單并易于擴(kuò)展的 API 設(shè)計(jì)和開(kāi)發(fā)模式。它主要目的是為開(kāi)發(fā)者提供一種簡(jiǎn)單的方式來(lái)構(gòu)建和管理云原生應(yīng)用。
1.go-zero 的核心特性
-
高性能:
- go-zero 采用了 Go 語(yǔ)言的高并發(fā)特性,具有很高的性能,適合處理大量請(qǐng)求。
-
代碼生成:
- 通過(guò)
goctl工具,開(kāi)發(fā)者可以根據(jù)定義的 API 規(guī)范自動(dòng)生成相應(yīng)的代碼,包括路由、處理邏輯、數(shù)據(jù)模型等,提高開(kāi)發(fā)效率。
- 通過(guò)
-
微服務(wù)架構(gòu):
- 適合構(gòu)建微服務(wù)架構(gòu)的應(yīng)用,支持服務(wù)的拆分、組合及獨(dú)立開(kāi)發(fā)部署。
-
中間件支持:
- 提供了靈活的中間件機(jī)制,可以用于日志、認(rèn)證、限流、跨域等功能。
-
豐富的文檔與社區(qū)支持:
- 提供完善的文檔和示例,社區(qū)活躍,易于獲取支持。
2. 總體架構(gòu)
go-zero 的總體架構(gòu)包括幾個(gè)主要部分:
- Framework(框架):提供服務(wù)的基本功能,包括 HTTP、RPC、API 網(wǎng)關(guān)等。
- Config(配置):支持讀取配置文件并提供配置管理。
- Model(模型):與數(shù)據(jù)庫(kù)交互的模型層,支持 ORM(對(duì)象關(guān)系映射)。
- Middleware(中間件):提供各種中間件功能(如日志、認(rèn)證等)。
- Log(日志):集中管理日志功能的模塊。
- Gateway(網(wǎng)關(guān)):API 網(wǎng)關(guān)的實(shí)現(xiàn),用于轉(zhuǎn)發(fā)請(qǐng)求。
- Etcd:支持服務(wù)注冊(cè)和發(fā)現(xiàn),基于 Etcd 實(shí)現(xiàn)微服務(wù)架構(gòu)。
二、環(huán)境搭建
默認(rèn)go為1.16以及之后的版本
1. 安裝 goctl 工具
goctl 是go-zeron的開(kāi)發(fā)利器,可以根據(jù)api文件生成代碼和文檔,可以根據(jù)sql生成model,以及生成部署k8s yaml、dockerfile等
go install github.com/zeromicro/go-zero/tools/goctl@latest
2. 安裝 protoc
protoc 用來(lái)根據(jù) proto 文件生成RPC代碼
goctl env check --install --verbose --force
3. 安裝 go-zero
使用以下命令安裝 go-zero:
go get -u github.com/zeromicro/go-zero
三、構(gòu)建第一個(gè) API
1.hello word
在實(shí)際開(kāi)發(fā)中,我們通常是根據(jù) API 文件,使用 goctl 工具生成項(xiàng)目代碼。為更好地了解 Go-Zero 的執(zhí)行過(guò)程,我們首先使用 Go-Zero 創(chuàng)建一個(gè)簡(jiǎn)單的 HTTP 服務(wù),輸出一個(gè) Hello World。。
創(chuàng)建一個(gè)hellowrod 目錄,先創(chuàng)建hello.yaml的配置文件
Name: HelloWorld.api # 服務(wù)名
Host: 127.0.0.1 # host地址
Port: 8080 #端口
然后創(chuàng)建 hello.go 文件:
package main
import (
"github.com/zeromicro/go-zero/core/conf"
"github.com/zeromicro/go-zero/rest"
"github.com/zeromicro/go-zero/rest/httpx"
"log"
"net/http"
)
func main() {
var restConf rest.RestConf //rest.RestConf 是一個(gè)http服務(wù)配置結(jié)構(gòu)體
conf.MustLoad("helloword/hello.yaml", &restConf) //用來(lái)讀取并解析配置
s, err := rest.NewServer(restConf) //根據(jù)配置啟動(dòng)一個(gè)新的服務(wù)
if err != nil {
log.Fatal(err)
return
}
s.AddRoute(rest.Route{ // 添加路由
Method: http.MethodGet, //使用get方法
Path: "/hello/world", //路徑
Handler: func(writer http.ResponseWriter, request *http.Request) { // 處理函數(shù)
httpx.OkJson(writer, "Hello World!") //返回一個(gè)Hello World!的json信息
},
})
defer s.Stop()
s.Start() // 啟動(dòng)服務(wù)
}
2. 啟動(dòng)服務(wù)
運(yùn)行 go-zero 服務(wù):
go run hello.go
使用 Postman 或 curl 進(jìn)行 API 測(cè)試。

3.代碼簡(jiǎn)單分析
初始化配置
var restConf rest.RestConf //聲明一個(gè)restConf變量,用于保存HTTP服務(wù)的配置
RestConf 是一個(gè)http服務(wù)配置結(jié)構(gòu)體,在go-zero中具體實(shí)現(xiàn)為:
RestConf struct {
service.ServiceConf
Host string `json:",default=0.0.0.0"`
Port int
/*
省略掉未用到的參數(shù)
*/
}
需要注意的是,YAML 配置文件的字段名必須與結(jié)構(gòu)體字段一致,但不區(qū)分大小寫(xiě)。
go-zero能夠自動(dòng)將配置文件解析到結(jié)構(gòu)體中:
conf.MustLoad("helloword/hello.yaml", &restConf) //加載并解析配置文件hello.yaml
從go-zero代碼中可以看到 ,它支持json 、toml 、 yaml 、yml等四種格式。
var (
fillDefaultUnmarshaler = mapping.NewUnmarshaler(jsonTagKey, mapping.WithDefault())
loaders = map[string]func([]byte, any) error{
".json": LoadFromJsonBytes,
".toml": LoadFromTomlBytes,
".yaml": LoadFromYamlBytes,
".yml": LoadFromYamlBytes,
}
)
創(chuàng)建HTTP服務(wù)器
`s, err := rest.NewServer(restConf)`//使用加載的配置創(chuàng)建新的HTTP服務(wù)器實(shí)例
添加路由
例如,以是一個(gè)簡(jiǎn)單的路由實(shí)現(xiàn):
s:= rest.NewServer()
s.AddRoutes(routes) // routes 是定義好的路由
s.Start()
go-zero 支持 RESTful 路由方式,可以在路由中定義處理的 HTTP 方法(GET、POST 等)。
s.AddRoute(rest.Route{
Method: http.MethodGet, //指定請(qǐng)求方法為GET
Path: "/hello/world", //定義請(qǐng)求路徑。
Handler: func(writer http.ResponseWriter, request *http.Request) { // 處理函數(shù)
httpx.OkJson(writer, "Hello World!") //返回一個(gè)Hello World!的json信息
},
})
啟動(dòng)服務(wù)
s.Start()//啟動(dòng)HTTP服務(wù)器,開(kāi)始監(jiān)聽(tīng)和處理傳入的請(qǐng)求。
4.go-zero服務(wù)執(zhí)行流程
啟動(dòng)服務(wù)器: 通常在
main.go中,您會(huì)初始化rest.Server實(shí)例,并調(diào)用RegisterHandlers函數(shù)來(lái)注冊(cè)路由。路由注冊(cè): 在
RegisterHandlers中調(diào)用AddRoutes方法來(lái)將路由添加到服務(wù)器。這里注冊(cè)的路由將用于處理特定的 HTTP 請(qǐng)求。接收請(qǐng)求: 當(dāng)客戶端發(fā)送一個(gè)請(qǐng)求到 服務(wù)器會(huì)根據(jù)路徑和請(qǐng)求方法查找對(duì)應(yīng)的路由。
調(diào)用處理程序: 如果找到匹配的路由,服務(wù)器將會(huì)調(diào)用
UserHandler(serverCtx)。這個(gè)處理程序通常會(huì)接收http.ResponseWriter和*http.Request參數(shù)。執(zhí)行業(yè)務(wù)邏輯: 在
UserHandler函數(shù)內(nèi)部,使用serverCtx訪問(wèn)全局配置、并執(zhí)行相應(yīng)的業(yè)務(wù)邏輯。返回響應(yīng): 最后,處理程序會(huì)通過(guò)
http.ResponseWriter返回相應(yīng)的 HTTP 響應(yīng),包括設(shè)置狀態(tài)碼、響應(yīng)頭和響應(yīng)體。