golang 網路框架之 grpc

2021-08-15 08:47:41 字數 3427 閱讀 5549

grpc 是 google 開源的一款網路框架,具有極好的效能,可能是目前效能最好的網路框架,支援流式 rpc,可以很方便地構建訊息訂閱發布系統,支援幾乎所有主流的語言,使用上面也很簡單,公司很多服務基於 grpc 框架構建,執行非常穩定

開始之前首先你要知道網路框架為你做了哪些事情:

網路協議序列化與反序列化

網路底層通訊

併發管理

以及需要你做哪些事情:

定義通訊的內容(通過協議檔案)

實現通訊的方法(實現協議介面)

以下面兩個例子來分別說明兩種 rpc 服務的簡單用法

協議檔案:

要實現的這個服務很簡單,功能和 echo 命令類似,用乙個字串請求伺服器,返回相同的字串

獲取 grpc

go get google.golang

.org/grpc

go get google.golang

.org/genproto/

定義協議檔案

syntax = "proto3";

package echo;

message echoreq

message echores

service echo

執行如下命令會自動生成echo.pb.go檔案,這個過程其實是把上面這個協議翻譯成 golang:

protoc --go_out=plugins=grpc:. echo.proto
實際專案中可以把這個命令放到乙個 makefile 檔案中,執行make命令即可生成**:

上面命令依賴protoc工具,以及 golang 外掛程式protoc-gen-go,可以通過如下命令獲取

go get -u github.com/golang/protobuf/實現協議介面

type echoserverimp struct 

func (e *echoserverimp) echo(ctx context.context, req *echo.echoreq) (*echo.echores, error)

return res, nil

}

首先要定義乙個介面的實現類echoserverimp,介面的的定義可以在上面生成的檔案echo.pb.go中找到,這個類裡面也可以有一些和業務邏輯相關的成員變數,這裡我們的需求比較簡單,沒有其他的成員

然後需要在介面函式裡面實現我們具體的業務邏輯,這裡僅僅把請求裡面的內容讀出來,再寫回到響應裡面

你還可以為這個類增加其他的函式,比如初始化之類的,根據你具體的業務需求就好

實現服務端

func main() )

address, err := net.listen("tcp", ":3000")

iferr != nil

iferr := server.serve(address); err != nil

}

把我們剛剛實現的類例項註冊到 grpc 裡,再繫結到本地的乙個埠上就可以了,現在可以啟動服務了go run echo_server.go

實現客戶端

func main() 

client := echo.newechoclient(conn)

res, err := client.echo(context.background(), &echo.echoreq)

if err != nil

fmt.printf("message from server: %v", res.getmsg())

}

建立乙個 client 之後,就可以像訪問本地方法一樣訪問我們的服務了,go run echo_client.go hellogrpc

實現乙個 counter 服務,客戶端傳過來乙個數字,服務端從這個數字開始,不停地向下計數返回

定義協議檔案

syntax = "proto3";

package counter;

message countreq

message countres

service counter

定義乙個流式的 rpc 只需要在返回的字段前加乙個 stream 關鍵字就可以

實現服務端

type counterserverimp struct 

func (c *counterserverimp) count(req *counter.countreq, stream counter.counter_countserver) error )

time.sleep(time.duration(500) * time.millisecond)

}return nil

}func main() )

address, err := net.listen("tcp", ":3000")

iferr != nil

iferr := server.serve(address); err != nil

}

介面實現上需要寫乙個死迴圈,不停地呼叫send函式返回結果即可

實現客戶端

func main() 

client := counter.newcounterclient(conn)

stream, err := client.count(context.background(), &counter.countreq)

if err != nil

for

fmt.printf("server count: %v\n", res.getnum())

}}

客戶端的count介面返回的是乙個stream,不斷地呼叫這個streamrecv方法,可以不斷地獲取來自服務端的返回

grpc詳細入門 golang

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

基於golang的網路爬蟲框架

這是乙個用go語言實現的網路爬蟲框架,本框架的核心在於可定製和可擴充套件,使用者可以根據自己的需要定製各個模組,同時,也給出了乙個實現demo供參考。go語言的初學者也可以通過這個專案熟悉go語言的各種特性,尤其是併發程式設計。1 排程器主體 主要用於啟動和停止整個系統,並且從中獲取一些系統執行的狀...

Go語言 gRPC框架使用

上節課已經學習了grpc基本知識,對grpc有了初步的認識。本節課通過程式設計實現grpc程式設計。我們想要實現的是通過grpc框架進行遠端服務呼叫,首先第一步應該是要有服務。利用之前所掌握的內容,grpc框架支援對服務的定義和生成。grpc框架預設使用protocol buffers作為介面定義語...