golang gRPC服務
阿新 • • 發佈:2021-10-13
下載grpc通用編譯器
- 下載地址:https://github.com/protocolbuffers/protobuf/releases
- 下載對應的格式,然後將檔案加入環境變數
安裝go專用的protoc的生成器
- 安裝命令:go get -v github.com/golang/protobuf/protoc-gen-go
- 安裝後會在GOPATH目錄下生成可執行檔案,protobuf的編譯器外掛protoc-gen-go,等下執行protoc命令會自動呼叫這個外掛
編寫protobuf檔案
// 語法為proto3 syntax = "proto3"; // 指定包名為pb package pb; // 表示在當前目錄下生成.go檔案,並且包名為pb option go_package = "./;pb"; // 定義客戶端傳到服務端的請求體格式 message Request{ string Name = 1; int32 Age = 2; } // 定義服務端響應到客戶端的響應體格式 message Response{ string remarks = 3; } // 定義一個Hello的服務 service Hello{ // 定義Say方法 rpc Say(Request) returns(Response); }
- 編譯命令 :protoc --go_out=plugins=grpc:./ *.proto
RegisterHelloServer
用於註冊服務的函式GrpcHello
實現這個介面用於返回結果給客戶端
服務端
package main import ( "context" "day01/server/pb" "fmt" "google.golang.org/grpc" "net" ) // 實現Hello介面用於返回結果給客戶端 type GrpcHello struct { } // 介面具體的方法 func (this *GrpcHello) Say(cx context.Context, req *pb.Request) (*pb.Response, error) { /* cx context.Context 上下文管理 req *pb.Request 這個就是我們之前在protobuff中寫的Request,也就是客戶端傳上來的請求內容都在這裡面 */ // 例項化Response物件,也就是我們在protobuff中寫的Response,將返回的內容封裝之後返回給客戶端 res := pb.Response{ Remarks: fmt.Sprintf("姓名:%s 年齡:%d", req.Name, req.Age), } return &res, nil } func main() { //建立一個grpc物件 grpcServer := grpc.NewServer() // 註冊服務 pb.RegisterHelloServer(grpcServer, &GrpcHello{}) // 監聽 listen, err := net.Listen("tcp", "127.0.0.1:8888") defer listen.Close() if err != nil { fmt.Println("建立監聽失敗...", err) return } fmt.Println("啟動監聽...") grpcServer.Serve(listen) }
客戶端
package main import ( "context" "fmt" "google.golang.org/grpc" "day01/client/pb" ) func main() { // 連線服務端,並且新增grpc.WithInsecure(),不然沒有證書會報錯 conn, err := grpc.Dial("127.0.0.1:8888", grpc.WithInsecure()) if err != nil { fmt.Println("連線服務端出錯...") return } defer conn.Close() // 建立grpc服務客戶端 serverClient := pb.NewHelloClient(conn) // 呼叫Say服務 response, err := serverClient.Say(context.Background(), &pb.Request{Age: 18, Name: "老王"}) if err != nil { fmt.Println("傳送訊息失敗...", err) return } fmt.Println(response) }