Rpc 的時代要來臨了

Krisji發表於2019-09-10

1 RPC的闡述

rpc就是遠端呼叫的意思 客戶端傳送一個資料 服務端接手並且解析 中間過程互相建立tcp 連線 ,指定的協議規範 可以用以下這個協議 為什麼要用它呢 現如今時代異構系統互相呼叫 方便而且傳輸不比json慢

Google Protocol Buffer( 簡稱 Protobuf)
輕便高效的序列化資料結構的協議,可以用於網路通訊和資料儲存。
 特點:效能高、傳輸快、維護方便,反正就是各種好,各種棒
一些第三方rpc庫都會支援protobuf  

2 RPC的使用方式

2.1 安裝
https://github.com/protocolbuffers/protobuf/releases/latest
下載它 並且解壓 把protoc39\bin 加入到你的環境變數
這是protobuf編譯器,將.proto檔案,轉譯成protobuf的原生資料結構
2.2 GO中的使用方式
    2.2.1 首先你要使用go的一個外掛 go get github.com/golang/protobuf/protoc-gen-go 此時會在你的GOPATH 的bin目錄下生成可執行檔案. protobuf的編譯器外掛protoc-gen-go
    2.2.2 建立如下中間檔案叫做prod.proto
    syntax="proto3";
    message  ProdRequest {
        int32 prod_id =1;   //傳入的商品ID
    }
    message ProdResponse{
        int32 prod_stock=1;//商品庫存
    }
   然後執行 protoc --go_out=../Prod.proto  就會生成一個協議檔案,大致完成。

3 RPC 的服務端簡單使用 【以GO做個範列】

3.3.1  建立一個服務結構體檔案Prod.proto
    syntax="proto3";
    package services;
    message  ProdRequest {
            int32 prod_id =1;   //傳入的商品ID
    }
    message ProdResponse{
            int32 prod_stock=1;//商品庫存
    }
3.3.2 建立一個服務結構體
    type ProdService struct {
    }
    func(this *ProdService) GetProdStock(ctx context.Context, request *ProdRequest) (*ProdResponse, error) {
          return &ProdResponse{ProdStock:20},nil
    }
3.3.3 建立一個RPC服務 埠8081
    rpcServer:=grpc.NewServer()
    services.RegisterProdServiceServer(rpcServer,new(services.ProdService))
    lis,_:=net.Listen("tcp",":8081")
    rpcServer.Serve(lis)
    注意:使用此包來開發
    google.golang.org/grpc

4 RPC的客戶端呼叫 【以GO做個範列】

引入  google.golang.org/grpc 這個包
client,err:=grpc.Dial(":8081",grpc.WithInsecure())
if err!=nil{
    log.Fatal(err)
}
defer client.Close()
prodClient:=services.NewProdServiceClient(client)
res,err:=prodClient.GetProdStock(
    context.Background(),
    &services.ProdRequest{ProdId:12},
    )
if err!=nil{
    log.Fatal(err)
}
fmt.Println(res.ProdStock)
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章