grpc詳細入門 golang

2021-10-10 01:58:42 字數 2925 閱讀 8315

所謂rpc(remote procedure call 遠端過程呼叫)框架實際是提供了一套機制,使得應用程式之間可以進行通訊,而且也遵從server/client模型。使用的時候客戶端呼叫server端提供的介面就像是呼叫本地的函式一樣。

grpc原理:

比如 a (client) 呼叫 b (server) 提供的remoteadd方法:

首先,a與b之間建立乙個tcp連線;

然後,a把需要呼叫的方法名(這裡是remoteadd)以及方法引數(10, 20)序列化成位元組流傳送出去;

接著,b接受a傳送過來的位元組流,然後反序列化得到目標方法名,方法引數,接著執行相應的方法呼叫(可能是localadd)並把結果30返回;

最後,a接受遠端呼叫結果,輸出30。

rpc框架就是把我剛才說的這幾點些細節給封裝起來,給使用者暴露簡單友好的api使用。

grpc的優勢,如下:

1.grpc可以通過protobuf來定義介面,從而可以有更加嚴格的介面約束條件。

2.通過protobuf可以將資料序列化為二進位制編碼,這會大幅減少需要傳輸的資料量,從而大幅提高效能。

3.grpc可以方便地支援流式通訊。

流程:

1.建立介面檔案---- .proto檔案

syntax = "proto3";  //語法宣告

package helloworld; //包名

// greeter 微服務,定義乙個rpc服務並具有乙個方法,該方法接收hellorequest,並返回乙個helloreply,此時可以在.proto檔案中進行如下定義:

service greeter

}//生成的介面**作為客戶端與服務端的約定,服務端必須實現定義的所有介面方法,客戶端直接呼叫同名方法向服務端發起請求。

// hellorequest 請求資料格式,message對應golang中的struct

message hellorequest

// helloreply 響應資料格式

message helloreply

將proto檔案編譯成go檔案,生成golang的服務**

protoc -i helloworld/ helloworld/helloworld.proto --go_out=plugins=grpc:helloworld
2.服務端**

package main

import (

"context"

"log"

"net"

"google.golang.org/grpc"

pb "google.golang.org/grpc/examples/helloworld/helloworld"

"google.golang.org/grpc/reflection"

)const (

port = ":50051"

)type server struct{} //服務物件

// sayhello 實現服務的介面 在proto中定義的所有服務都是介面

func (s *server) sayhello(ctx context.context, in *pb.hellorequest) (*pb.helloreply, error) , nil

}func main()

s := grpc.newserver() //起乙個服務

pb.registergreeterserver(s, &server{})

// 註冊反射服務 這個服務是cli使用的 跟服務本身沒有關係

reflection.register(s)

if err := s.serve(lis); err != nil

}

3.客戶端**

package main

import (

"context"

"log"

"os"

"time"

"google.golang.org/grpc"

pb "google.golang.org/grpc/examples/helloworld/helloworld"

)const (

address = "localhost:50051"

defaultname = "world"

)func main()

defer conn.close()

c := pb.newgreeterclient(conn)

// contact the server and print out its response.

name := defaultname

if len(os.args) > 1

// 1秒的上下文

ctx, cancel := context.withtimeout(context.background(), time.second)

defer cancel()

r, err := c.sayhello(ctx, &pb.hellorequest)

if err != nil

log.printf("greeting: %s", r.message)

}

4.欄位規則

repeated: 標識字段可以重複任意次,類似陣列。

5.預設值:

字串型別預設為空字串

位元組型別預設為空位元組

布林型別預設false

數值型別預設為0值

enums型別預設為第乙個定義的列舉值,必須是0

GRPC基礎入門

專案中要使用rpc協議框架來實現兩個系統之間的介面呼叫。a系統呼叫b系統的相應介面,因為考慮到http請求會包含更多冗餘資訊,造成請求過大,因此選用了rpc眾多框架中的grpc。grpc是google開源的rpc框架,目前版本1.0.0,看jar包引入包括netty與okhttp,同時序列化中使用的...

gRPC入門小結

首先要知道rpc是什麼 remote procedure call的簡稱,翻譯成中文就是遠端過程呼叫。rpc主要是為了解決以下倆個問題 grpc 一開始由 google 開發,是一款語言中立 平台中立 開源的遠端過程呼叫 rpc 系統,g有global的意思 在grpc裡客戶端應用可以像呼叫本地物件...

golang 網路框架之 grpc

grpc 是 google 開源的一款網路框架,具有極好的效能,可能是目前效能最好的網路框架,支援流式 rpc,可以很方便地構建訊息訂閱發布系統,支援幾乎所有主流的語言,使用上面也很簡單,公司很多服務基於 grpc 框架構建,執行非常穩定 開始之前首先你要知道網路框架為你做了哪些事情 網路協議序列化...