1. gRPC簡介
gRPC是一種高性能、開源和通用的遠程程序呼叫(RPC)框架,由Google開源并維護,它使用Protocol Buffers(protobuf)作為介面定義語言(IDL),提供跨平臺、跨語言的RPC呼叫支持,gRPC具有以下幾個特點:
- 高性能:使用HTTP/2協議,支持多路復用和流控制等特性,能夠在客戶端和服務器之間高效地傳輸大量資料,同時,gRPC還使用了基于平臺優化的序列化和反序列化技術,提高了通信的效率,
- 簡單易用:gRPC的IDL語言簡單易懂,同時提供了自動生成代碼的工具,方便用戶進行開發,用戶只需要定義好IDL,并生成代碼后即可在代碼中使用類似于本地函式呼叫的方式進行遠程程序呼叫,
- 多語言支持:gRPC支持多種編程語言,如C++, Java, Python, Go, Ruby等,可以在不同編程語言之間進行RPC呼叫,
- 可擴展性:gRPC支持各種擴展,包括攔截器、負載均衡、認證和授權等,可以滿足不同場景下的需求,
- 安全性:gRPC支持SSL/TLS安全傳輸,同時還提供了基于Token的認證機制,確保通信的安全性,
總之,gRPC提供了一種高效、可擴展、多語言、安全的RPC框架,適用于大規模分布式系統中的服務間通信,如微服務架構,
本文以go為例,介紹如何使用gRPC開發一個簡單服務,
2. 準備作業
2.1 安裝protoc
從github系統對應的protoc預編譯版,解壓到/usr/local/
下,以v22.3為例,具體操作如下:
wget https://github.com/protocolbuffers/protobuf/releases/download/v22.3/protoc-22.3-linux-x86_64.zip
unzip protoc-22.3-linux-x86_64.zip -d /usr/local/
ldconfig
protoc --version
# libprotoc 22.3
2.2 安裝go相關插件
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
3. 實踐
3.1 撰寫proto檔案
syntax = "proto3";
option go_package = "./;hello";
package hello;
message HelloRequest{
string name = 1;
}
message HelloResponse{
string message = 1;
}
service ExampleService{
rpc SayHi (HelloRequest) returns (HelloResponse);
}
service ExampleService
就是我們定義的服務,rpc SayHi (HelloRequest) returns (HelloResponse);
就是服務中提供的介面,protoc會根據我們定義的proto檔案生成相應的代碼,
3.2 使用protoc生成代碼
終端下執行以下命令即可生成我們需要的代碼:
protoc --go_out=. --go-grpc_out=. hello.proto
--go_out指定go檔案的生成目錄,--go-grpc_out指定grpc檔案的生成目錄
此時打開生成的go檔案大概率會發現飄紅報錯,此時可以在當前目錄下執行go mod tidy
同步下依賴即可,
3.3 撰寫服務端代碼
示例只是簡單實作一個echo服務,服務端代碼如下:
package main
import (
"context"
"net"
pb "github.com/mengbin92/hello/protos/hello"
"google.golang.org/grpc"
)
// 服務物體
type HelloService struct {
pb.UnimplementedExampleServiceServer
}
// 實作我們proto檔案定義的介面
func (sv *HelloService) SayHi(ctx context.Context, in *pb.HelloRequest) (*pb.HelloResponse, error) {
return &pb.HelloResponse{Message: "hello " + in.Name}, nil
}
func main() {
// 創建grpc服務示例
sv := grpc.NewServer()
// 注冊我們的服務
pb.RegisterExampleServiceServer(sv, new(HelloService))
// 系結埠,提供服務
lis, err := net.Listen("tcp", ":50001")
if err != nil {
panic(err)
}
// 啟動服務
sv.Serve(lis)
}
啟動服務后,服務端會一直阻塞等待客戶端的鏈接,直到收到kill
信號:
go run server.go
3.4 實作客戶端
package main
import (
"context"
"fmt"
pb "github.com/mengbin92/hello/protos/hello"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
)
func main() {
// 創建grpc連接
conn, err := grpc.Dial("localhost:50001", grpc.WithTransportCredentials(insecure.NewCredentials()))
if err != nil {
panic(err)
}
defer conn.Close()
// 實體化客戶端
client := pb.NewExampleServiceClient(conn)
// 發送請求
req := &pb.HelloRequest{Name: "world"}
resp, err := client.SayHi(context.TODO(), req)
if err != nil {
panic(err)
}
fmt.Printf("get response from server: %s\n", resp.Message)
}
客戶端啟動后向服務端發送world
,服務端回傳hello world
:
go run client.go
# get response from server: hello world
至此,一個簡單的gRPC服務就已經搞定了,
宣告:本作品采用署名-非商業性使用-相同方式共享 4.0 國際 (CC BY-NC-SA 4.0)進行許可,使用時請注明出處,
Author: mengbin
blog: mengbin
Github: mengbin92
cnblogs: 戀水無意
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/550315.html
標籤:其他
上一篇:java -- IO流