重要提示
- 因官網(wǎng)重新改版,本文是基于官網(wǎng)最新版本的文檔并整合舊文檔重新進(jìn)行全面總結(jié)、歸納。
- 本文主要對(duì)官網(wǎng) 快速開始 進(jìn)行提煉總結(jié),未涉及部分將在后續(xù)章節(jié)陸續(xù)補(bǔ)充完善。
1 相關(guān)命令
-
go-zero
的goctl
工具下載
go install github.com/zeromicro/go-zero/tools/goctl@latest
- 驗(yàn)證
goctl
的安裝結(jié)果:
goctl -v
-
goctl
一鍵安裝protoc
、protoc-gen-go
、protoc-gen-go-grpc
goctl env check --install --verbose --force
-
go-zero
快速生成API
服務(wù)
goctl api new greet
-
api
文件格式化
goctl api format --dir xxx.api
-
go-zero
快速生成RPC
服務(wù)
goctl rpc new demo
2 參考文檔
- 官方文檔:go-zero
3 架構(gòu)圖
4 go-zero開發(fā)環(huán)境搭建
go-zero
的是基于go
語言的,所以首先需要安裝配置go
環(huán)境,go
的安裝配置可參考:Golang安裝配置、GoLand安裝配置 ,此處不再贅述。
4.1 注意事項(xiàng)
注意:如果是更新go-zero
相關(guān)組件的版本,建議先備份原來的組件,防止最新版本的組件出現(xiàn)不兼容的問題。
4.2 go-zero 需要安裝的組件
goctl
protoc
protoc-gen-go
protoc-gen-go-grpc
4.3 自動(dòng)安裝
和 4.4 手動(dòng)安裝
均能安裝go-zero
的環(huán)境,如果按照4.3 自動(dòng)安裝
某個(gè)組件失敗,可按4.4 手動(dòng)安裝
來安裝缺失的組件。
4.3 自動(dòng)安裝
- 先下載
goctl
go install github.com/zeromicro/go-zero/tools/goctl@latest
- 驗(yàn)證
goctl
的安裝結(jié)果:goctl -v
D:\Software\Golang\GOPATH\bin>goctl -v
goctl version 1.5.3 windows/amd64
-
goctl
一鍵安裝protoc
、protoc-gen-go
、protoc-gen-go-grpc
goctl env check --install --verbose --force
4.4 手動(dòng)安裝
-
goctl
安裝
go install github.com/zeromicro/go-zero/tools/goctl@latest
-
Protobuf
下載安裝
需要先下載protoc執(zhí)行器
- 到 https://github.com/protocolbuffers/protobuf/releases 分別下載
Windows
和Linux
環(huán)境的執(zhí)行器 - 選擇最新版本的
protoc
下載 - 將下載的文件解壓,將解壓后的bin目錄加入到環(huán)境變量的path下。
- 查看安裝是否成功:
protoc --version
Protobuf
下Go
、GRPC
插件的安裝
protoc-gen-go
:Go
專用的protoc
的編譯器插件,安裝后會(huì)在GOPATH
的bin
目錄下生成一個(gè)protoc-gen-go.exe
protoc-gen-go-grp
:Go
調(diào)用grpc
的插件,安裝后會(huì)在GOPATH
的bin
目錄下生成一個(gè)protoc-gen-go-grpc.exe
go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.26
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.1
至此使用Protobuf
的準(zhǔn)備工作就做完了。
5 單體服務(wù)
5.1 簡單入門
參考文檔:api demo 代碼生成
- 快速生成
API
服務(wù),API
服務(wù)如果不與Service
端【RPC端
】交互,則可以獨(dú)立成一個(gè)單獨(dú)的服務(wù)。
goctl api new greet
- 目錄結(jié)構(gòu):
.
│ go.mod
│ greet.api
│ greet.go
│
├─etc
│ greet-api.yaml
│
└─internal
├─config
│ config.go
│
├─handler
│ greethandler.go
│ routes.go
│
├─logic
│ greetlogic.go
│
├─svc
│ servicecontext.go
│
└─types
types.go
- 啟動(dòng)服務(wù):
cd greet
go mod init
go mod tidy
go run greet.go -f etc/greet-api.yaml
- 默認(rèn)偵聽在 8888 端口(可以在配置文件里修改端口),請(qǐng)求:
curl -i http://localhost:8888/from/you
返回如下:
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Traceparent: 00-0c577bd0a5d96c7b9669d3bba60d6b09-5f4e42e62eb6a79e-00
Date: Mon, 19 Jun 2023 14:25:01 GMT
Content-Length: 4
null
5.2 api語法
參考:api語法
5.3 api 文件格式化
參考:api文件格式化
在api
文件編寫完之后,我們的api
內(nèi)容參差不齊,就有如下內(nèi)容:
# 格式化前
syntax = "v1"
type User {
Id int64 `json:"id"`
Name string `json:"name"`
Age int `json:"age"`
Description string `json:"description"`
}
type Student {
Id int64 `json:"id"`
No int64 `json:"no"`
Name string `json:"name"`
Age int `json:"age"`
Description string `json:"description"`
}
service User {
@handler ping
get /ping
}
這樣的api
文件不夠美觀,不便于閱讀,可以使用 goctl api format
命令對(duì) api
文件進(jìn)行格式化。
# 格式化后
syntax = "v1"
type User {
Id int64 `json:"id"`
Name string `json:"name"`
Age int `json:"age"`
Description string `json:"description"`
}
type Student {
Id int64 `json:"id"`
No int64 `json:"no"`
Name string `json:"name"`
Age int `json:"age"`
Description string `json:"description"`
}
service User {
@handler ping
get /ping
}
6 微服務(wù)
6.1 簡單入門
參考文檔:gRPC demo 代碼生成
- 快速生成
RPC
服務(wù)
goctl rpc new demo
- 目錄結(jié)構(gòu):
.
│ demo.go
│ demo.proto
│ go.mod
│
├─demo
│ demo.pb.go
│ demo_grpc.pb.go
│
├─democlient
│ demo.go
│
├─etc
│ demo.yaml
│
└─internal
├─config
│ config.go
│
├─logic
│ pinglogic.go
│
├─server
│ demoserver.go
│
└─svc
servicecontext.go
- 編寫簡單的邏輯代碼:
- 找到
/demo/internal/logic/demologic.go
文件,編輯該文件,將 29 行替換為如下代碼:
return &demo.Response{
Pong:"pong",
}, nil
- 修改配置文件
/demo/etc/demo.yaml
,刪除 3 至 7 行使用Etcd注冊(cè)服務(wù)的內(nèi)容
,然后在追加內(nèi)容Mode: dev
至末尾:
goctl 生成最小化 gRPC 服務(wù)默認(rèn)啟動(dòng)會(huì)向 ETCD 注冊(cè)中心注冊(cè)當(dāng)前服務(wù)的信息,本次演示就不需要注冊(cè)中心,所以刪除了配置文件中的注冊(cè)中心配置。
原始配置:
Name: demo.rpc
ListenOn: 0.0.0.0:8080
Etcd:
Hosts:
- 127.0.0.1:2379
Key: demo.rpc
更改后的配置:
Name: demo.rpc
ListenOn: 0.0.0.0:8080
Mode: dev
- 啟動(dòng)服務(wù):
# 進(jìn)入服務(wù)目錄
$ cd /demo
# 整理依賴文件
$ go mod tidy
# 啟動(dòng) go 程序
$ go run demo.go
當(dāng)控制臺(tái)有如下輸出 Starting rpc server at 0.0.0.0:8080...
,說明服務(wù)已經(jīng)啟動(dòng)成功,接著我們來訪問一下該 gRPC 服務(wù)。
- 訪問
gRPC
服務(wù)
使用Postman
訪問測(cè)試,注意這是訪問gRPC
服務(wù),所以需要?jiǎng)?chuàng)建grpc類型的請(qǐng)求。
當(dāng)在Postman
中看到如下輸出內(nèi)容時(shí),代表你的服務(wù)已經(jīng)啟動(dòng),并能成功訪問。文章來源:http://www.zghlxwxcb.cn/news/detail-493177.html
{
"pong": "pong"
}
6.2 proto 語法
參考:proto 語法文章來源地址http://www.zghlxwxcb.cn/news/detail-493177.html
7 目錄結(jié)構(gòu)介紹
- 目錄結(jié)構(gòu)
example
├── etc
│ └── example.yaml
├── main.go
└── internal
├── config
│ └── config.go
├── handler
│ ├── xxxhandler.go
│ └── xxxhandler.go
├── logic
│ └── xxxlogic.go
├── svc
│ └── servicecontext.go
└── types
└── types.go
- 各文件介紹
-
example
:單個(gè)服務(wù)目錄,一般是某微服務(wù)名稱。 -
etc
:靜態(tài)配置文件目錄。 -
main.go
:程序啟動(dòng)入口文件。 -
internal
:單個(gè)服務(wù)內(nèi)部文件,其可見范圍僅限當(dāng)前服務(wù)。 -
config
:靜態(tài)配置文件對(duì)應(yīng)的結(jié)構(gòu)體聲明目錄。 -
handler
:handler 目錄,可選,一般 http 服務(wù)會(huì)有這一層做路由管理,handler 為固定后綴。 -
logic
:業(yè)務(wù)目錄,所有業(yè)務(wù)編碼文件都存放在這個(gè)目錄下面,logic 為固定后綴。 -
svc
:依賴注入目錄,所有 logic 層需要用到的依賴都要在這里進(jìn)行顯式注入。 -
types
:結(jié)構(gòu)體存放目錄。
到了這里,關(guān)于go-zero學(xué)習(xí) 第一章 基礎(chǔ)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!