go zero入門

一、goctl安裝

goctlgo-zero 的內置腳手架,可以一鍵生成代碼、文檔、部署 k8s yaml、dockerfile 等。

# Go 1.16 及以后版本
go install github.com/zeromicro/go-zero/tools/goctl@latest

檢查是否安裝成功

$ goctl -v
goctl version 1.6.6 darwin/amd64

vscode安裝插件goctl

二、簡單的http服務請求

2.1 通過goctl生成api項目

下面利用goctl實現一個單體服務,通過訂單id獲取訂單信息(id、名稱、價格)
order目錄下

go mod init order
touch order.api

結構如下

    go-zero└── order├── go.mod└── order.api

order.api的代碼

syntax = "v2"type (// 定義請求體OrderInfoReq {OrderId int64 'json:"order_id"' // 訂單ID  }// 定義響應體OrderInfoResp {OrderId int64 'json:"order_id"' // 訂單IDGoodsName string 'json:"goods_name"' // 商品名稱Price int64 'json:"price"' // 商品價格}
)// 定義 HTTP 服務
// 微服務名稱為 order-api
service order-api {// 標記了訂單信息查詢接口的文檔注釋。@doc(summary: "獲取訂單信息")// 指定處理該請求的處理器為orderInfo。@handler orderInfo// 定義接口// 請求方法是post,路徑是/order/info,參數是OrderInfoReq,返回值是OrderInfoResppost /oder/info (OrderInfoReq) returns (OrderInfoResp)
}

在當前目錄下執行

$ goctl api go -api *.api -dir ./  --style=goZero    
Done.// 下載所需要的依賴
$ go mod tidy

該指令的作用是使用 goctl 工具生成 Go 語言的 API 代碼項目

  • api go: 指定生成 Go 語言的 API 代碼。
  • -api *.api: 指定輸入的 API 描述文件,*.api 表示所有的 .api 文件,可以生成多個 API。
  • -dir ./: 指定輸出目錄為當前目錄 (./),生成的代碼將會放置在當前目錄中。
  • --style=goZero: 指定生成代碼的風格為 goZero

當前目錄生成的api項目結構如下

.
├── etc							// 配置文件
│   └── order-api.yaml
├── go.mod
├── internal
│   ├── config					// 配置對應的數據結構
│   │   └── config.go
│   ├── handler					// http部分的代碼
│   │   ├── orderInfoHandler.go
│   │   └── routes.go
│   ├── logic					// 需要自己寫的代碼邏輯
│   │   └── orderInfoLogic.go
│   ├── svc						// 上下文相關依賴
│   │   └── serviceContext.go
│   └── types
│       └── types.go
├── order.api
└── order.go					// 啟動代碼

2.2 實現業務邏輯

根據路由追蹤到OrderInfo方法,實現業務邏輯
在這里插入圖片描述

func (l *OrderInfoLogic) OrderInfo(req *types.OrderInfoReq) (resp *types.OrderInfoResp, err error) {// todo: add your logic here and delete this lineresp  = &types.OrderInfoResp{OrderId: req.OrderId,GoodsName: "車",Price: 100000,}return resp, nil
}

2.3 執行

// 啟動服務
$ go run order.go -f etc/order-api.yaml

etc/order-api.yaml文件定義了啟動的端口號和ip

$ curl -X POST -H "Content-Type: application/json" http://localhost:8888/order/info -d '{"order_id":34}'{"order_id":34,"goods_name":"車","price":100000}%

三、集成Gorm

基于上面的基礎,再增加一個功能:記錄訂單信息(id、名稱、價格)到數據庫

3.1 配置Gorm

etc/order-api.yaml文件中配置參數DataSourceName

Name: order-api
Host: 0.0.0.0
Port: 8888
DataSourceName: root:zxm123578@(127.0.0.1:3306)/MING_DB?charset=utf8

在這里插入圖片描述
internal/config/config.go中添加DataSourceName

type Config struct {rest.RestConfDataSourceName string
}

3.2 啟動Gorm支持

internal目錄下新建模型文件models\models.go

package modelsimport ("gorm.io/gorm"
)type Order struct {gorm.ModelOrderId   int64   `gorm:"index:order_id"`GoodsName string  `gorm:"type:varchar(64)"`Price     float64 `gorm:"type:decimal(10,2);default:0"`
}

修改svc/servicecontext.go代碼如下

package svcimport ("order/internal/config""order/internal/models""gorm.io/driver/mysql""gorm.io/gorm""gorm.io/gorm/schema"
)type ServiceContext struct {Config config.Config// DbEngin 數據庫引擎DbEngin *gorm.DB
}func NewServiceContext(c config.Config) *ServiceContext {// 啟動Gorm支持db, err := gorm.Open(mysql.Open(c.DataSourceName), &gorm.Config{NamingStrategy: schema.NamingStrategy{TablePrefix:   "o_", // 表名前綴SingularTable: true, // 使用單數表名},})if err != nil {panic(err)}//自動同步更新表結構db.AutoMigrate(&models.Order{})return &ServiceContext{Config:  c,DbEngin: db,}
}

3.3 實現業務邏輯

logic/orderRecordLogic.go文件實現業務邏輯

func (l *OrderRecordLogic) OrderRecord(req *types.OrderRecordReq) (resp *types.OrderRecordResp, err error) {// todo: add your logic here and delete this lineorder := models.Order{GoodsName: req.GoodsName,Price:     float64(req.Price),OrderId:   req.OrderId,}result := l.svcCtx.DbEngin.Create(&order)return &types.OrderRecordResp{OrderId: order.OrderId,}, result.Error
}

3.4 執行

先啟動mysql,再啟動服務

// 啟動服務
$ go run order.go -f etc/order-api.yaml
$ curl -X POST -H "Content-Type: application/json" http://localhost:8888/order/record -d '{"order_id":34,"goods_name":"手機","price":5000}'{"order_id":34}%

四、通過api調用rpc服務

上面例子的商品名稱是寫死的,下面通過調用商品的rpc服務來獲取商品信息。

安裝protoc
安裝etcd

4.1 通過goctl生成rpc服務

在go-zero下新建目錄goods

go mod init goods
touch goods.proto
    go-zero└── goods├── go.mod└── goods.proto└── order

goods.proto代碼如下

syntax = "proto3";
package goods;
option go_package = "./goods";// 定義請求體
message GoodsRequest {int64 goods_id = 1;
}// 定義響應體
message GoodsResponse {int64 goods_id = 1;string goods_name = 2;double price = 3;
}service Goods {rpc GetGoods(GoodsRequest) returns (GoodsResponse);
}

在當前目錄下使用goctl生成一個rpc項目

goctl rpc protoc *.proto --go_out=./types --go-grpc_out=./types --zrpc_out=.
.
├── etc
│   └── goods.yaml
├── go.mod
├── goods.go
├── goods.proto
├── goodsclient
│   └── goods.go
├── internal
│   ├── config
│   │   └── config.go
│   ├── logic
│   │   └── getgoodslogic.go
│   ├── server
│   │   └── goodsserver.go
│   └── svc
│       └── servicecontext.go
└── types└── goods├── goods.pb.go└── goods_grpc.pb.go

4.2 實現業務邏輯

logic/getgoodslogic.go中實現業務邏輯

func (l *GetGoodsLogic) GetGoods(in *goods.GoodsRequest) (*goods.GoodsResponse, error) {// todo: add your logic here and delete this lineresp := &goods.GoodsResponse{GoodsId: in.GoodsId,GoodsName: "樂高",Price: 500,}return resp, nil
}

4.3 api調用rpc服務

不管是rpc之間的互相調用,還是api調用rpc,我們都需要知道rpc的proto文件。本文通過go work來實現

$ go work init order
$ go work use goods

接下來需要對orderapi項目進行修改

1. 修改配置文件order/etc/order-api.yaml

Name: order-api
Host: 0.0.0.0
Port: 8888DataSourceName: root:zxm123578@(127.0.0.1:3306)/MING_DB?charset=utf8Etcd:Hosts:- 127.0.0.1:2379Key: goods.rpc

2. 修改order/internal/config/config.go文件

package configimport ("github.com/zeromicro/go-zero/rest""github.com/zeromicro/go-zero/zrpc"
)type Config struct {rest.RestConfDataSourceName string//定義rpc服務GoodsRpc zrpc.RpcClientConf
}

3. 修改order/internal/svc/serviceContext.go

package svcimport ("goods/goodsclient""order/internal/config""order/internal/models""github.com/zeromicro/go-zero/zrpc""gorm.io/driver/mysql""gorm.io/gorm""gorm.io/gorm/schema"
)type ServiceContext struct {Config config.Config// DbEngin 數據庫引擎DbEngin *gorm.DB//定義rpc類型Goods goodsclient.Goods
}func NewServiceContext(c config.Config) *ServiceContext {// 啟動Gorm支持db, err := gorm.Open(mysql.Open(c.DataSourceName), &gorm.Config{NamingStrategy: schema.NamingStrategy{TablePrefix:   "o_", // 表名前綴SingularTable: true, // 使用單數表名},})if err != nil {panic(err)}//自動同步更新表結構db.AutoMigrate(&models.Order{})return &ServiceContext{Config:  c,DbEngin: db,//引入gprc服務Goods: goodsclient.NewGoods(zrpc.MustNewClient(c.GoodsRpc)),}
}

4. 修改order/internal/logic/orderInfoLogic.go

func (l *OrderInfoLogic) OrderInfo(req *types.OrderInfoReq) (resp *types.OrderInfoResp, err error) {// todo: add your logic here and delete this linegoodRequest := new(goods.GoodsRequest)goodRequest.GoodsId = req.OrderIdgoodsInfo, err := l.svcCtx.Goods.GetGoods(l.ctx, goodRequest)if err != nil {return nil, err}resp = &types.OrderInfoResp{OrderId:   req.OrderId,GoodsName: goodsInfo.GoodsName,Price:     goodsInfo.Price,}return resp, nil
}

4.4 執行

依次啟動mysqll、etcd 、rpc和api

$ mysql -u root -p
# goods目錄下
$ etcd
# goods目錄下
$ go run goods.go -f etc/goods.yaml
# order目錄下
$ go run order.go -f etc/order.yaml

通過curl進行post請求,查看結果

$  curl -X POST -H "Content-Type: application/json" http://localhost:8888/order/info -d '{"order_id":34}' {"order_id":34,"goods_name":"樂高","price":500}%  

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/41355.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/41355.shtml
英文地址,請注明出處:http://en.pswp.cn/web/41355.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vue2響應式原理+模擬實現v-model

效果 簡述原理 配置對象傳入vue實例 模板解析,遍歷出所有文本節點,利用正則替換插值表達式為真實數據 data數據代理給vue實例,以后通過this.xxx訪問 給每個dom節點增加觀察者實例,由觀察者群組管理,內部每一個鍵值…

sqlite 數據庫 介紹

文章目錄 前言一、什么是 SQLite ?二、語法三、SQLite 場景四、磁盤文件 前言 下載 目前已經出到了, Version 3.46.0 SQLite,是一款輕型的數據庫,是遵守ACID的關系型數據庫管理系統,它包含在一個相對小的C庫中。它是…

VMware虛擬機配置橋接網絡

轉載:虛擬機橋接網絡配置 一、VMware三種網絡連接方式 VMware提供了三種網絡連接方式,VMnet0, VMnet1, Vmnet8,分別代表橋接,Host-only及NAT模式。在VMware的編輯-虛擬網絡編輯器可看到對應三種連接方式的設置(如下圖…

美好生活的 100 條建議

簡介 一些簡潔明了的人生建議,易于理解,并且能夠為日常生活中的各個方面提供實用的指導。 財富 (Possessions) 1. If you want to find out about people’s opinions on a product, google \reddit. You’ll get real people arguing, as compared t…

SpringBoot2.2.6使用spring-boot-validation讀取不到自定義配置文件中的屬性

SpringBoot2.2.6沒有做message.properties文件中屬性的自動讀取配置。解決方法有兩種: 1. 升級springboot版本到2.6.x以上 2. 在現有springboot版本的基礎上添加以下自定義配置: Configuration public class RequestParamValidationConfig implements…

學習筆記——交通安全分析12

目錄 前言 當天學習筆記整理 4信控交叉口交通安全分析 結束語 前言 #隨著上一輪SPSS學習完成之后,本人又開始了新教材《交通安全分析》的學習 #整理過程不易,喜歡UP就點個免費的關注趴 #本期內容接上一期11筆記 當天學習筆記整理 4信控交叉口交…

ORA-03115 ORA-06594--空間不足 rman 磁帶壓縮備份 控制文件恢復后備份信息丟失

---用舊的控制文件恢復后 這個控制文件本身的備份信息不在此還原出的控制文件中。所以這個備份的控制文件就刪不掉,看不到。 但是只要設置正確的dbid,還是可以用恢復這個控制文件的 正常未恢復過controlfile的話,這個控制文件備份信息在現有…

Square Root SAM論文原理

文章目錄 Square Root SAM論文原理核心原理SLAM問題的3種表示貝葉斯網絡因子圖(Factor graph)馬爾科夫隨機場(Markov Random Field, MRF) SLAM最小二乘問題&線性化因式分解 factorization矩陣與圖(Matrices ? Graphs)因式分解&變量消元(Factori…

Kafka系列之Kafka知識超強總結

一、Kafka簡介 Kafka是什么 Kafka是一種高吞吐量的分布式發布訂閱消息系統(消息引擎系統),它可以處理消費者在網站中的所有動作流數據。 這種動作(網頁瀏覽, 搜索和其他用戶的行動)是在現代網絡上的許多社…

14-22 劍和遠方2 - 深度神經網絡中的學習機制

概論 在第一部分中,我們深入探討了人工智能的興衰簡史以及推動人工智能發展的努力。我們研究了一個簡單的感知器,以了解其組件以及簡單的 ANN 如何處理數據和權重層。在簡單的 ANN 中,不會對數據執行特定操作。ANN 中的激活函數是一個線性函…

Surface splatting (2D Gaussian splatting)代碼分析

源碼地址 colab.research.google.com/drive/1qoclD7HJ3-o0O1R8cvV3PxLhoDCMsH8W 核心代碼 surface_splatting def surface_splatting(means3D, scales, quats, colors, opacities, intrins, viewmat, projmat):# Rasterization setupprojmat torch.zeros(4,4).cuda()projm…

flask使用定時任務flask_apscheduler(APScheduler)

Flask-APScheduler描述: Flask-APScheduler 是一個 Flask 擴展,增加了對 APScheduler 的支持。 APScheduler 有三個內置的調度系統可供您使用: Cron 式調度(可選開始/結束時間) 基于間隔的執行(以偶數間隔運行作業…

c#中的超時終止

在C#中,可以使用CancellationToken和Task的超時機制來實現調用方法時的超時終止。 一 用Task.Delay(int)模擬耗時操作 static async Task Main(string[] args){using (var cts new CancellationTokenSource(1 * 1000)){await doSomething(cts.Token);}Console.Wr…

移動校園(7)ii:uniapp響應攔截器處理token,以及微信小程序報錯當前頁面正在處于跳轉狀態,請稍后再進行跳轉....

依據昨天的寫完,在token過期之后,再次調用接口,會觸發后端攔截,扔進全局錯誤處理中間件 前端說明提示都沒有,只有一個這個,現在優化一下,再寫一個類似全局后置守衛,當狀態碼是401的時…

RAID 冗余磁盤陣列

RAID也是Linux操作系統中管理磁盤的一種方式。 只有Linux操作系統才支持LVM的磁盤管理方式。 而RAID是一種通用的管理磁盤的技術,使用于多種操作系統。 優勢:提升數據的讀寫速度,提升數據的可靠性。具體實現哪什么功能,要看你所…

RGB樹-美團2023筆試(codefun2000)

題目鏈接 RGB樹-美團2023筆試(codefun2000) 題目內容 塔子哥是一位著名的冒險家,他經常在各種森林里探險。今天,他來到了道成林,這是一片美麗而神秘的森林。在探險途中,他遇到了一棵 n 個節點的樹,樹上每個節點都被涂…

LVGL移植與VS模擬器使用

一、移植文件介紹 二、移植部分 第一步:創建LVGL文件夾 第二步: 構造LVGL文件夾:LVGL - GUI - lvgl - 第三步:添加文件 3.1 從examples中添加2個.c文件 3.2 從src中添加文件 draw文件 extra文件 第四步: 三、Ke…

Linux系統安裝軟件包的方法rpm和yum詳解

起因: 本篇文章是記錄學習Centos7的歷程 關于rpm 常見命令 1)查看已經安裝的軟件包 rpm -q 軟件包名 2)查看文件的相關信息 rpm -qi 軟件包名 3)查看軟件包的依賴關系 就是說要想安裝這個軟件包,就必須把一些前…

三級_網絡技術_04_中小型網絡系統總體規劃與設計

1.下列關于路由器技術特征的描述中,正確的是()。 吞吐量是指路由器的路由表容量 背板能力決定了路由器的吞吐量 語音、視頻業務對延時抖動要求較低 突發處理能力是以最小幀間隔值來衡量的 2.下列關于路由器技術特征的描述中,正確的是()。 路由器的…

springboot公寓租賃系統-計算機畢業設計源碼03822

摘要 1 緒論 1.1 研究背景與意義 1.2選題背景 1.3論文結構與章節安排 2 公寓租賃系統系統分析 2.1 可行性分析 2.1.1 技術可行性分析 2.1.2 經濟可行性分析 2.1.3 法律可行性分析 2.2 系統功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系統用例分析 2.4 系…