系列文章目錄
第一章 grpc基本概念與安裝
第二章 grpc入門示例
第三章 proto文件數據類型
第四章 多服務示例
第五章 多proto文件示例
第六章 服務器流式傳輸
第七章 客戶端流式傳輸
第八章 雙向流示例
文章目錄
- 一、前言
- 二、定義proto文件
- 三、編寫server服務端
- 四、編寫Client客戶端
- 五、測試
- 六、示例代碼
一、前言
多服務,即一個rpc提供多個服務給外界調用。好比喚醒
服務,可以有語音喚醒
、人臉喚醒
、觸摸喚醒
、人體喚醒
。以此為基礎,做一個示例。
二、定義proto文件
這里定義2個服務,一個語音喚醒
服務,人臉喚醒
服務。語音喚醒
服務又包含各種各樣的方法,比如狗叫
、坤叫
,狗會汪汪汪叫,貓會喵喵喵叫,坤會???,這里以狗叫
為例。人臉喚醒又包含各種各樣的方法,比如一耳光
,一巴掌
,畢竟沒幾個人挨一巴掌還沒醒的,這里以一巴掌
為例。
新建wake.proto
文件示例如下:
// 指定proto版本
syntax = "proto3";package wake_grpc; // 指定默認包名// 指定golang包名
option go_package = "/wake_proto";//語音喚醒服務
service VoiceWakeService {//狗叫rpc DogBark(Request)returns(Response){}
}//人臉喚醒服務
service FaceWakeService {//一巴掌rpc ASlap(Request)returns(Response){}
}//請求參數
message Request{string name = 1;
}
//響應參數
message Response{string sound = 1;
}
在go_grpc_study/example_2/grpc_proto
目錄下新建Terminal,執行生成文件,命令如下
protoc --go_out=. --go-grpc_out=. ./wake.proto
目錄結構變更后為
三、編寫server服務端
新建server
目錄,新建main.go
文件
目錄結構如下
編寫server/main.go
文件
package mainimport ("context""fmt"wake_grpc2 "go_grpc_study/example_2/grpc_proto/wake_proto""google.golang.org/grpc""google.golang.org/grpc/grpclog""net"
)// 新版本 gRPC 要求必須嵌入 UnimplementedGreeterServer 結構體
type VoiceWakeServer struct {wake_grpc2.UnimplementedVoiceWakeServiceServer
}
type FaceWakeServer struct {wake_grpc2.UnimplementedFaceWakeServiceServer
}func (VoiceWakeServer) DogBark(ctx context.Context, request *wake_grpc2.Request) (pd *wake_grpc2.Response, err error) {fmt.Println("語音喚醒入參:", request.Name)pd = new(wake_grpc2.Response)pd.Sound = "汪汪汪~"return
}func (FaceWakeServer) ASlap(ctx context.Context, request *wake_grpc2.Request) (pd *wake_grpc2.Response, err error) {fmt.Println("人臉喚醒入參:", request.Name)pd = new(wake_grpc2.Response)pd.Sound = "塞班~"return
}func main() {// 監聽端口listen, err := net.Listen("tcp", ":8080")if err != nil {grpclog.Fatalf("Failed to listen: %v", err)}// 創建一個gRPC服務器實例。s := grpc.NewServer()// 將server結構體注冊為gRPC服務。wake_grpc2.RegisterVoiceWakeServiceServer(s, &VoiceWakeServer{})wake_grpc2.RegisterFaceWakeServiceServer(s, &FaceWakeServer{})fmt.Println("grpc server running :8080")// 開始處理客戶端請求。err = s.Serve(listen)
}
具體步驟如下:
- 1)定義2個結構體,結構體名稱無所謂,必須包含pb.UnimplementedGreeterServer 對象
- 2)實現 .proto文件中定義的API,
即DogBark狗叫方法
,ASlap一巴掌方法
- 3)將服務描述及其具體實現注冊到
gRPC
中
四、編寫Client客戶端
新建client
目錄,新建main.go
文件
目錄結構如下
編寫clinet/main.go
文件
package mainimport ("context""fmt"wake_grpc2 "go_grpc_study/example_2/grpc_proto/wake_proto""google.golang.org/grpc""google.golang.org/grpc/credentials/insecure""log"
)func main() {addr := ":8080"// 使用 grpc.Dial 創建一個到指定地址的 gRPC 連接。// 此處使用不安全的證書來實現 SSL/TLS 連接conn, err := grpc.Dial(addr, grpc.WithTransportCredentials(insecure.NewCredentials()))if err != nil {log.Fatalf(fmt.Sprintf("grpc connect addr [%s] 連接失敗 %s", addr, err))}defer conn.Close()voiceClient := wake_grpc2.NewVoiceWakeServiceClient(conn)res, err := voiceClient.DogBark(context.Background(), &wake_grpc2.Request{Name: "張三",})fmt.Println(res, err)faceClient := wake_grpc2.NewFaceWakeServiceClient(conn)res, err = faceClient.ASlap(context.Background(), &wake_grpc2.Request{Name: "李四",})fmt.Println(res, err)
}
具體步驟如下:
- 1)首先使用 grpc.Dial() 與 gRPC 服務器建立連接
- 2)使用
wake_grpc2.NewVoiceWakeServiceClient(conn)
、wake_grpc2.NewFaceWakeServiceClient(conn)
初始化客戶端 - 3)通過客戶端調用
ServiceAPI
方法voiceClient.DogBark
、faceClient.ASlap
五、測試
在server
目錄下,啟動服務端
go run main.go
在clinet
目錄下,啟動客戶端
go run main.go
服務端運行結果
客戶端運行結果
六、示例代碼
go_grpc_study:grpc學習golang版
完成ヾ(?°?°?)ノ゙