go-zero(一) 介紹和使用

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 的核心特性

  1. 高性能

    • go-zero 采用了 Go 語(yǔ)言的高并發(fā)特性,具有很高的性能,適合處理大量請(qǐng)求。
  2. 代碼生成

    • 通過(guò) goctl 工具,開(kāi)發(fā)者可以根據(jù)定義的 API 規(guī)范自動(dòng)生成相應(yīng)的代碼,包括路由、處理邏輯、數(shù)據(jù)模型等,提高開(kāi)發(fā)效率。
  3. 微服務(wù)架構(gòu)

    • 適合構(gòu)建微服務(wù)架構(gòu)的應(yīng)用,支持服務(wù)的拆分、組合及獨(dú)立開(kāi)發(fā)部署。
  4. 中間件支持

    • 提供了靈活的中間件機(jī)制,可以用于日志、認(rèn)證、限流、跨域等功能。
  5. 豐富的文檔與社區(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è)試。

image.png

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í)行流程

  1. 啟動(dòng)服務(wù)器: 通常在 main.go 中,您會(huì)初始化 rest.Server 實(shí)例,并調(diào)用 RegisterHandlers 函數(shù)來(lái)注冊(cè)路由。

  2. 路由注冊(cè): 在 RegisterHandlers 中調(diào)用 AddRoutes 方法來(lái)將路由添加到服務(wù)器。這里注冊(cè)的路由將用于處理特定的 HTTP 請(qǐng)求。

  3. 接收請(qǐng)求: 當(dāng)客戶端發(fā)送一個(gè)請(qǐng)求到 服務(wù)器會(huì)根據(jù)路徑和請(qǐng)求方法查找對(duì)應(yīng)的路由。

  4. 調(diào)用處理程序: 如果找到匹配的路由,服務(wù)器將會(huì)調(diào)用 UserHandler(serverCtx)。這個(gè)處理程序通常會(huì)接收 http.ResponseWriter*http.Request 參數(shù)。

  5. 執(zhí)行業(yè)務(wù)邏輯: 在 UserHandler 函數(shù)內(nèi)部,使用 serverCtx 訪問(wèn)全局配置、并執(zhí)行相應(yīng)的業(yè)務(wù)邏輯。

  6. 返回響應(yīng): 最后,處理程序會(huì)通過(guò) http.ResponseWriter 返回相應(yīng)的 HTTP 響應(yīng),包括設(shè)置狀態(tài)碼、響應(yīng)頭和響應(yīng)體。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請(qǐng)通過(guò)簡(jiǎn)信或評(píng)論聯(lián)系作者。

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

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