在微服務和分散式系統的世界中,服務之間的高效通訊至關重要。這就是 Google 開發的高效能 RPC(遠端過程呼叫)框架 gRPC 發揮作用的地方。與 Go(一種專為簡單和高效而設計的靜態類型編譯程式語言)相結合,gRPC 可以幫助您建立強大且可擴展的 Web 服務。
gRPC 代表 google Remote Procedure C全部。它是一個開源框架,使用 HTTP/2 進行傳輸,使用 Protocol Buffers 作為介面描述語言,並提供身份驗證、負載平衡等功能。 gRPC 可讓您在 .proto 檔案中定義服務方法和訊息類型,然後可以使用該檔案產生多種語言的用戶端和伺服器程式碼。
### 先決條件
開始前,請確保您已安裝以下軟體:
您可以使用以下指令安裝Go插件:
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
更新您的路徑,以便協議編譯器可以找到插件:
export PATH="$PATH:$(go env GOPATH)/bin"
透過開啟終端並輸入以下內容來確認 protoc 已在您的系統中安裝和設定:
protoc --version
您應該會看到與此類似的輸出
C:\Users\Guest>protoc --version ~ libprotoc 27.3
如果它無法辨識protoc指令,那麼您可以使用Chocolatey for windows來安裝protocol buffers:
choco install protoc
如果不是這種情況,即您沒有安裝 Chocolatey 或您使用的是不同的作業系統,您可以在此處查看官方安裝文件。
建立 .proto 檔案來定義您的 gRPC 服務。例如:
helloworld.proto
syntax = "proto3"; package helloworld; message HelloRequest { string name = 1; } message HelloResponse { string message = 1; } service Greeter { rpc SayHello (HelloRequest) returns (HelloResponse) {} }
從 .proto 檔案產生 Go 代碼:
protoc --go_out=. --go-grpc_out=. helloworld.proto
在 Go 中建立伺服器:
server.go
package main import ( "context" "log" "net" "google.golang.org/grpc" pb "path/to/your/proto" ) type server struct { pb.GreeterServer } func main() { lis, err := net.Listen("tcp", ":8080") if err != nil { log.Fatalf("failed to listen: %v", err) } log.Printf("Server started at %v", lis.Addr()) grpcServer := grpc.NewServer() pb.RegisterGreeterServer(grpcServer, &server{}) if err := grpcServer.Serve(lis); err != nil { log.Fatalf("failed to serve: %v", err) } } // SayHello name should be the same RPC name as defined in your proto file func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloResponse, error) { return &pb.HelloResponse{Message: "Hello " in.Name}, nil }
在 Go 中建立客戶端:
client.go
package main import ( "context" "log" "os" "time" "google.golang.org/grpc" pb "path/to/your/proto" ) func main() { conn, err := grpc.NewClient("localhost:8080", grpc.WithTransportCredentials(insecure.NewCredentials())) if err != nil { log.Fatalf("did not connect: %v", err) } defer conn.Close() client := pb.NewGreeterClient(conn) name := "John Doe" if len(os.Args) > 1 { name = os.Args[1] } callSayHello( client, name ) } func callSayHello(client pb.GrpcServiceClient, name string) { ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() res, err := client.SayHello(ctx, &pb.HelloRequest{Name: name}) if err != nil { log.Fatalf("Failed to called: %v", err) } log.Printf("%v", res) }
gRPC 和 Go 一起為建立高效能、可擴展的 Web 服務提供了強大的組合。透過利用兩者的優勢,您可以創建高效、可靠且易於維護和擴展的應用程式。
示範儲存庫連結:Github.com
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3