grpc入門Unary模式使用方法示例教程
gRPC支持類型方法
gRPC支持四種類型的方法,分別是:
- Unary模式
- 客戶端流模式
- 服務(wù)端流模式
- 雙向流模式
其中最常見的是Unary模式(即一元模式),我們在本章節(jié)僅介紹Unary模式。
Unary模式,也可以稱為“一問一答模式”,客戶端發(fā)送一個請求給服務(wù)端,服務(wù)端返回一個響應(yīng),和一次普通的函數(shù)調(diào)用類似。
示意圖如下:

下面我們來實現(xiàn)一個簡單的Unary接口。
要通過grpc提供接口,可以分為以下三個步驟:
- 接口定義(.proto文件)。
- 生成相關(guān)代碼。
- 服務(wù)端開發(fā)。
- 客戶端開發(fā)。
接口定義
我們這里實現(xiàn)一個簡單的greet功能,項目目錄結(jié)構(gòu)如下:
proto 存放proto文件。
pb 存放生成的go文件。
server 服務(wù)端代碼。
client 客戶端代碼。
bin 可執(zhí)行文件。
proto文件定義如下(greet.proto):
syntax = "proto3";
package proto;
option go_package = "git.gqnotes.com/guoqiang/grpcexercises/greet/pb";
service GreetService {
rpc Greet(GreetRequest) returns(GreetResponse) {}
}
message GreetRequest {
string greeting = 1;
}
message GreetResponse {
string result = 1;
}定義Makefile,方便執(zhí)行相關(guān)操作:
tidy:
go mod tidy
greet-gen:
protoc -Igreet/proto/ --go_out=./greet --go_opt=module=git.gqnotes.com/guoqiang/grpcexercises/greet --go-grpc_out=./greet --go-grpc_opt=module=git.gqnotes.com/guoqiang/grpcexercises/greet greet/proto/*.proto
greet-build:
go build -o ./greet/bin/server-osx ./greet/server
go build -o ./greet/bin/client-osx ./greet/client
.PHONY: tidy greet-gen greet-build生成相關(guān)代碼
在項目目錄(greet上級目錄)下執(zhí)行如命令:
make greet-gen
執(zhí)行成功,在pb目錄下生成相關(guān)文件。
服務(wù)端開發(fā)
在server目錄下添加兩個文件:
- main.go,服務(wù)入口文件。
- Greet.go,Greet方法實現(xiàn)。
代碼如下:
<details>
<summary>main.go</summary>
package main
import (
"git.gqnotes.com/guoqiang/grpcexercises/greet/pb"
"google.golang.org/grpc"
"google.golang.org/grpc/reflection"
"log"
"net"
)
func main() {
// 實現(xiàn)服務(wù)端邏輯,監(jiān)聽5632端口
lis, err := net.Listen("tcp", ":5632")
if err != nil {
log.Fatalf("failed to listen: %v", err)
return
}
s := grpc.NewServer()
// 注冊服務(wù)
pb.RegisterGreetServiceServer(s, &Server{})
reflection.Register(s)
log.Println("grpc server start")
if err = s.Serve(lis); err != nil {
log.Fatalf("failed to serve: %v", err)
return
}
}
type Server struct {
pb.UnimplementedGreetServiceServer
}</details>
<details>
<summary>Greet.go</summary>
package main
import (
"context"
"git.gqnotes.com/guoqiang/grpcexercises/greet/pb"
"log"
"time"
)
// Greet greet
func (s *Server) Greet(ctx context.Context, req *pb.GreetRequest) (*pb.GreetResponse, error) {
log.Printf("Greet function was invoked with %v\n", req)
result := "Hello " + req.GetGreeting() + ", now time is:" + time.Now().String()
res := &pb.GreetResponse{
Result: result,
}
return res, nil
}</details>
客戶端開發(fā)
在client目錄下添加客戶端代碼,有兩個文件:
- main.go,程序入口文件。
- Greet.go,具體方法文件。
文件內(nèi)容如下:
<details>
<summary>main.go</summary>
package main
import (
"git.gqnotes.com/guoqiang/grpcexercises/greet/pb"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
"log"
)
func main() {
conn, err := grpc.Dial(":5632", grpc.WithTransportCredentials(insecure.NewCredentials()))
if err != nil {
log.Fatalf("failed to dial: %v", err)
return
}
defer conn.Close()
// 實例化客戶端
client := pb.NewGreetServiceClient(conn)
// 調(diào)用方法
Greet(client)
}</details>
<details>
<summary>Greet.go</summary>
package main
import (
"context"
"git.gqnotes.com/guoqiang/grpcexercises/greet/pb"
"log"
)
func Greet(client pb.GreetServiceClient) {
response, err := client.Greet(context.Background(), &pb.GreetRequest{
Greeting: "xiaoming",
})
if err != nil {
log.Fatalf("failed to call Greet: %v", err)
return
}
log.Printf("response:%+v\n", response)
}</details>
執(zhí)行
在項目目錄下執(zhí)行make tidy,拉取相關(guān)庫,然后執(zhí)行 make greet-build,生成可執(zhí)行文件。
然后在命令行下執(zhí)行如下命令,啟動服務(wù)端程序:
./greet/bin/server-osx
執(zhí)行如下命令,測試客戶端文件:
./greet/bin/client-osx
執(zhí)行結(jié)果如下:
2023/12/02 15:02:26 response:result:"Hello xiaoming now time is:2023-12-02 15:02:26.443767 +0800 CST m=+1268.825308543"
代碼地址 https://git.gqnotes.com/guoqiang/grpcexercises
以上就是grpc入門Unary模式使用方法示例教程的詳細(xì)內(nèi)容,更多關(guān)于grpc Unary模式的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
go實現(xiàn)thrift的網(wǎng)絡(luò)傳輸性能及需要注意問題示例解析
這篇文章主要為大家介紹了go實現(xiàn)thrift的網(wǎng)絡(luò)傳輸性能及需要注意問題示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-09-09
Golang中的archive/zip包的常用函數(shù)詳解
Golang 中的 archive/zip 包用于處理 ZIP 格式的壓縮文件,提供了一系列用于創(chuàng)建、讀取和解壓縮 ZIP 格式文件的函數(shù)和類型,下面小編就來和大家講解下常用函數(shù)吧2023-08-08
Go語言Http?Server框架實現(xiàn)一個簡單的httpServer
這篇文章主要為大家介紹了Go語言Http?Server框架實現(xiàn)一個簡單的httpServer抽象,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-04-04
夯實Golang基礎(chǔ)之?dāng)?shù)據(jù)類型梳理匯總
這篇文章主要8為大家介紹了夯實Golang基礎(chǔ)之?dāng)?shù)據(jù)類型梳理匯總,有需要的朋友可以借鑒參考下,希望能夠有所幫助2023-10-10

