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
,不斷地呼叫這個stream
的recv
方法,可以不斷地獲取來自服務端的返回 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作為介面定義語...