網(wǎng)站開(kāi)發(fā)視頻壓縮上傳seo資源
官方網(wǎng)址:https://go-zero.dev/docs/tasks/cli/grpc-demo
項(xiàng)目結(jié)構(gòu)
demo包
兩個(gè)文件均為protoc-gen-go-grpc自動(dòng)生成
構(gòu)成一個(gè)完整的 gRPC 服務(wù)的定義和實(shí)現(xiàn)
democlient包
demo.go goctl生成的客戶端代碼
- Request 和 Response 別名: 定義了 Request 和 Response 兩個(gè)別名,實(shí)際上是從 demo 包中導(dǎo)入的對(duì)應(yīng)的消息類(lèi)型。
- Demo 接口: 定義了一個(gè) Demo 接口,其中包含了調(diào)用 gRPC 服務(wù)中 Ping 方法的方法聲明。
- defaultDemo 結(jié)構(gòu)體: 實(shí)現(xiàn)了 Demo 接口,包含一個(gè) zrpc.Client 類(lèi)型的字段,用于與 gRPC 服務(wù)建立連接。
- NewDemo 函數(shù): 用于創(chuàng)建并返回 Demo 接口的實(shí)例,需要傳入一個(gè) zrpc.Client 類(lèi)型的參數(shù),用于建立連接。
- Ping 方法: 是 Demo 接口中的實(shí)際方法,通過(guò) defaultDemo 結(jié)構(gòu)體的實(shí)例調(diào)用 gRPC 服務(wù)中的 Ping 方法。
etc包
demo.yaml
- Name:demo.rpc 服務(wù)名稱
- ListenOn:0.0.0.0:8080 指定服務(wù)監(jiān)聽(tīng)的地址和端口
- Mode:dev 服務(wù)運(yùn)行在開(kāi)發(fā)模式 (dev)
internal包
config/config.go
zrpc結(jié)構(gòu)體源碼如下
logic/pinglogic.go
- **PingLogic 結(jié)構(gòu)體:**包含了處理 gRPC 請(qǐng)求的上下文、服務(wù)上下文以及日志記錄器
- NewPingLogic 函數(shù): 創(chuàng)建并返回 PingLogic 結(jié)構(gòu)體的實(shí)例,初始化了上下文和服務(wù)上下文,并通過(guò) logx.WithContext 方法創(chuàng)建了與上下文關(guān)聯(lián)的日志記錄器
- Ping 方法: 是處理 gRPC 請(qǐng)求的具體邏輯方法。接收一個(gè) demo.Request 類(lèi)型的參數(shù) in,并返回一個(gè) *demo.Response 類(lèi)型和一個(gè) error
server/demoserver.go 由goctl生成的grpc服務(wù)端代碼
- DemoServer 結(jié)構(gòu)體: 實(shí)現(xiàn) demo.UnimplementedDemoServer 接口,表示該結(jié)構(gòu)體用于處理 gRPC 請(qǐng)求,包含了一個(gè) svcCtx 字段–指向 svc.ServiceContext 結(jié)構(gòu)體的指針
- NewDemoServer 函數(shù): 用于創(chuàng)建并返回 DemoServer 結(jié)構(gòu)體的實(shí)例
- Ping 方法: 是 DemoServer 處理 gRPC 請(qǐng)求的具體方法。它接收一個(gè)上下文 ctx 和一個(gè) demo.Request 類(lèi)型的參數(shù) in,并返回一個(gè) *demo.Response 類(lèi)型和一個(gè) error。在這個(gè)方法中,它創(chuàng)建了一個(gè) logic.NewPingLogic 實(shí)例,然后調(diào)用了 l.Ping(in) 方法,將請(qǐng)求交由具體的業(yè)務(wù)邏輯處理。
svc/servicecontext.go
創(chuàng)建返回svc結(jié)構(gòu)體實(shí)例
demo.proto
用于生成不同語(yǔ)言的gRPC代碼
- syntax = “proto3”;: 指定使用 protobuf 3 語(yǔ)法
- package demo;: 指定生成的 Go 代碼的包路徑
- option go_package=“./demo”;: 指定生成的 Go 代碼的包路徑
- message Request: 定義了一個(gè)消息類(lèi)型 Request,其中包含一個(gè)字符串字段 ping
- message Response: 定義了一個(gè)消息類(lèi)型 Response,其中包含一個(gè)字符串字段 pong
- service Demo: 定義了一個(gè)服務(wù)接口 Demo,包含一個(gè) Ping 方法,該方法接收 Request 消息作為參數(shù),并返回 Response 消息
— string pong = 1; 不代表值為1,代表他的編號(hào)為1(protobuf語(yǔ)法
demo.go
- 加載配置文件: 使用 flag 包解析命令行參數(shù),獲取配置文件路徑,并通過(guò) conf.MustLoad 加載配置信息到結(jié)構(gòu)體 c 中
- 創(chuàng)建服務(wù)上下文: 使用 svc.NewServiceContext 創(chuàng)建服務(wù)上下文,將配置信息傳遞給服務(wù)上下文
- 創(chuàng)建 gRPC 服務(wù): 使用 zrpc.MustNewServer 創(chuàng)建 gRPC 服務(wù),同時(shí)注冊(cè)了 Demo 服務(wù)。如果是開(kāi)發(fā)或測(cè)試模式,還注冊(cè)了 gRPC 服務(wù)反射服務(wù),以方便 gRPC 工具的使用
- 啟動(dòng) gRPC 服務(wù): 使用 s.Start() 啟動(dòng) gRPC 服務(wù),監(jiān)聽(tīng)指定的地址