系列文章目錄
第一章 grpc基本概念與安裝
第二章 grpc入門示例
第三章 proto文件數據類型
第四章 多服務示例
第五章 多proto文件示例
第六章 服務器流式傳輸
第七章 客戶端流式傳輸
第八章 雙向流示例
文章目錄
- 一、前言
- 二、定義proto文件
- 2.1 公共proto文件
- 2.2 語音喚醒proto文件
- 2.3 人臉喚醒proto文件
- 2.4 生成go代碼
- 2.5 注意
- 三、編寫server服務端
- 四、編寫Client客戶端
- 五、測試
- 六、示例代碼
一、前言
當項目大起來之后,會有很多個service,rpc,message(即服務,方法,結構體
),這樣閱讀起來又困難,不同的業務服務都寫在一個文件,又容易導致開發人員混亂。所以我們會需要將不同服務放在不同的proto文件中。同時也可以放一些公共的proto文件。最主要的目的就是方便閱讀,查找,使用
。本質其實是生成的go文件放在同一個包下
。
二、定義proto文件
這里還是以喚醒服務
為例,定義2個服務,語音喚醒
、人臉喚醒
。我們都知道,喚醒服務
入參需要一個人名name
,出參的時候會有聲音sound
。這些就可以放在公共的proto
里面,他們都是語音喚醒
、人臉喚醒
的共同內容
2.1 公共proto文件
新建common.proto
文件
// 指定proto版本
syntax = "proto3";
// 指定默認包名
package wake_grpc;// 指定golang包名
option go_package = "/wake_proto";//請求參數
message Request{string name = 1;
}
//響應參數
message Response{string sound = 1;
}
2.2 語音喚醒proto文件
前面我們說過,喚醒,不僅有語音喚醒
,還有 人臉喚醒
,這些都屬于喚醒
的服務。語音喚醒服務又分,狗叫聲喚醒
、貓叫聲喚醒
、坤叫聲喚醒
。所以這里我們把他們(即語音喚醒
、人臉喚醒
)拆分開,不同業務做細分。
新建voice_wake.proto
文件。關鍵詞import
引入公共proto文件
// 指定proto版本
syntax = "proto3";
// 指定默認包名
package wake_grpc;
// 指定golang包名
option go_package = "/wake_proto";
//引入公共proto文件
import "common.proto";//語音喚醒服務
service VoiceWakeService {//狗叫rpc DogBark(Request)returns(Response){}
}
2.3 人臉喚醒proto文件
正如我前面所說,把人臉喚醒
也拆分出來,不同業務做細分。
新建face_wake.proto
文件。關鍵詞import
引入公共proto文件
// 指定proto版本
syntax = "proto3";
// 指定默認包名
package wake_grpc;
// 指定golang包名
option go_package = "/wake_proto";
//引入公共proto文件
import "common.proto";//人臉喚醒服務
service FaceWakeService {//一巴掌rpc ASlap(Request)returns(Response){}
}
目錄結構變更后為
2.4 生成go代碼
在go_grpc_study/example_3/grpc_proto
目錄下新建Terminal,執行生成文件,命令如下
protoc --go_out=. --go-grpc_out=. ./common.proto
protoc --go_out=. --go-grpc_out=. ./voice_wake.proto
protoc --go_out=. --go-grpc_out=. ./face_wake.proto
目錄結構變更后為
2.5 注意
voice_wake.proto
文件、face_wake.proto
文件必須得加上package
,并且要和import的package
相同
還有值得一提的是,voice_wake.proto
文件、face_wake.proto
文件引入公共proto時,golang編譯器會報紅色警告。但
不影響后續的使用!
不影響后續的使用!
不影響后續的使用!
如下face_wake.proto
文件,有知道如何解決報紅色警告的,也可以評論留言。
三、編寫server服務端
新建server
目錄,新建main.go
文件
目錄結構如下
編寫server/main.go
文件
package mainimport ("context""fmt"wake_grpc3 "go_grpc_study/example_3/grpc_proto/wake_proto""google.golang.org/grpc""google.golang.org/grpc/grpclog""net"
)// 新版本 gRPC 要求必須嵌入 UnimplementedGreeterServer 結構體
type VoiceWakeServer struct {wake_grpc3.UnimplementedVoiceWakeServiceServer
}
type FaceWakeServer struct {wake_grpc3.UnimplementedFaceWakeServiceServer
}func (VoiceWakeServer) DogBark(ctx context.Context, request *wake_grpc3.Request) (pd *wake_grpc3.Response, err error) {fmt.Println("語音喚醒入參:", request.Name)pd = new(wake_grpc3.Response)pd.Sound = "汪汪汪~"return
}func (FaceWakeServer) ASlap(ctx context.Context, request *wake_grpc3.Request) (pd *wake_grpc3.Response, err error) {fmt.Println("人臉喚醒入參:", request.Name)pd = new(wake_grpc3.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_grpc3.RegisterVoiceWakeServiceServer(s, &VoiceWakeServer{})wake_grpc3.RegisterFaceWakeServiceServer(s, &FaceWakeServer{})fmt.Println("grpc server running :8080")// 開始處理客戶端請求。err = s.Serve(listen)
}
具體步驟如下:
- 1)定義2個結構體,結構體名稱無所謂,必須包含
wake_grpc3.UnimplementedVoiceWakeServiceServer
、wake_grpc3.UnimplementedFaceWakeServiceServer
對象 - 2)實現 .proto文件中定義的API,
即DogBark狗叫方法
,ASlap一巴掌方法
- 3)將服務描述及其具體實現注冊到 gRPC 中
四、編寫Client客戶端
新建client
目錄,新建main.go
文件
目錄結構如下
編寫clinet/main.go
文件
package mainimport ("context""fmt"wake_grpc3 "go_grpc_study/example_3/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_grpc3.NewVoiceWakeServiceClient(conn)res, err := voiceClient.DogBark(context.Background(), &wake_grpc3.Request{Name: "王五",})fmt.Println(res, err)faceClient := wake_grpc3.NewFaceWakeServiceClient(conn)res, err = faceClient.ASlap(context.Background(), &wake_grpc3.Request{Name: "趙6",})fmt.Println(res, err)
}
具體步驟如下:
- 1)首先使用 grpc.Dial() 與 gRPC 服務器建立連接
- 2)使用
wake_grpc3.NewVoiceWakeServiceClient(conn)
、wake_grpc3.NewFaceWakeServiceClient(conn)
初始化客戶端 - 3)通過客戶端調用
ServiceAPI
方法voiceClient.DogBark
、faceClient.ASlap
五、測試
在server
目錄下,啟動服務端
go run main.go
在clinet
目錄下,啟動客戶端
go run main.go
服務端運行結果
客戶端運行結果
六、示例代碼
go_grpc_study:grpc學習golang版
完成ヾ(?°?°?)ノ゙