Golang RPC 之 gRPC

gRPC 簡介:

gRPC 是一款高性能、開源的 RPC 框架,產(chǎn)自 Google,基于 ProtoBuf 序列化協(xié)議進行開發(fā),支持多種語言(Golang、Python、Java等),本篇只介紹 Golang 的 gRPC 使用。因為 gRPC 對 HTTP/2 協(xié)議的支持使其在 Android、IOS 等客戶端后端服務(wù)的開發(fā)領(lǐng)域具有良好的前景。gRPC 提供了一種簡單的方法來定義服務(wù),同時客戶端可以充分利用 HTTP/2 stream 的特性,從而有助于節(jié)省帶寬、降低 TCP 的連接次數(shù)、節(jié)省CPU的使用等。

安裝:

  1. gRPC 的安裝:

$ go get -u google.golang.org/grpc

  1. 因為 gRPC 是基于 protobuf 實現(xiàn)的接口序列化,所以也要安裝 protobuf: 安裝及簡介教程。

實踐:

下面我們使用 gRPC 定義一個接口,該接口實現(xiàn)對傳入的數(shù)據(jù)進行大寫的格式化處理。

  1. 創(chuàng)建項目 golang Demo 工程:


    Paste_Image.png
  1. client目錄下的 main.go 實現(xiàn)了客戶端用于發(fā)送數(shù)據(jù)并打印接收到 server 端處理后的數(shù)據(jù)
  1. server 目錄下的 main.go 實現(xiàn)了服務(wù)端用于接收客戶端發(fā)送的數(shù)據(jù),并對數(shù)據(jù)進行大寫處理后返回給客戶端

  2. example 包用于編寫 proto 文件并生成 data 接口

  3. 定義 gRPC 接口:

syntax = "proto3";
package example;
service FormatData {
    rpc DoFormat(Data) returns (Data){}
}
message Data {
    string text = 1;
}
  1. 編譯 protobuf:

$ protoc -I=. --go_out=plugins=grpc:. . // 在 example 目錄中執(zhí)行編譯,會生成:data.pb.go

  1. 實現(xiàn) server 端:
package main
import (
    "Demo/example"
    "net"
    "google.golang.org/grpc"
    "google.golang.org/grpc/reflection"
    "golang.org/x/net/context"
    "strings"
    "log"
)
// 定義監(jiān)聽地址
const (
    HOST string = "localhost"
    PORT string = "8080"
)
// 定義接口
type FormatData struct{}
func (fd *FormatData) DoFormat(ctx context.Context, in *example.Data) (out *example.Data, err error) {
    str := in.Text
    out = &example.Data{Text: strings.ToUpper(str)}
    return out, nil
}
// 直接在 main 方法中注冊接口
func main() {
    listener, err := net.Listen("tcp", HOST+":"+PORT)
    if err != nil {
        log.Fatalln("faile listen at: " + HOST + ":" + PORT)
    } else {
        log.Println("Demo server is listening at: " + HOST + ":" + PORT)
    }
    rpcServer := grpc.NewServer()
    example.RegisterFormatDataServer(rpcServer, &FormatData{})
    reflection.Register(rpcServer)
    if err = rpcServer.Serve(listener); err != nil {
        log.Fatalln("faile serve at: " + HOST + ":" + PORT)
    }
}
  1. 實現(xiàn) client 端:
package main
import (
    "google.golang.org/grpc"
    "log"
    "Demo/example"
    "golang.org/x/net/context"
)
// 定義請求地址
const (
    ADDRESS string = "localhost:8080"
)
// main 方法實現(xiàn)對 gRPC 接口的請求
func main() {
    conn, err := grpc.Dial(ADDRESS, grpc.WithInsecure())
    if err != nil {
        log.Fatalln("Can't connect: " + ADDRESS)
    }
    defer conn.Close()
    client := example.NewFormatDataClient(conn)
    resp,err := client.DoFormat(context.Background(), &example.Data{Text:"hello,world!"})
    if err != nil {
        log.Fatalln("Do Format error:" + err.Error())
    }
    log.Println(resp.Text)
}
  1. 執(zhí)行驗證結(jié)果:
  1. 先啟動 server,之后再執(zhí)行 client
  1. client 側(cè)控制臺如果打印的結(jié)果為: HELLO,WORLD! ,證明 gRPC 接口定義成功
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,695評論 19 139
  • 1)簡介 gRPC負載平衡的主要實現(xiàn)機制是外部負載平衡,即通過外部負載平衡器來向客戶端提供更新后的服務(wù)器列表。 g...
    Jay_Guo閱讀 13,649評論 6 22
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,287評論 6 342
  • ProtoBuf: 是一套完整的 IDL(接口描述語言),出自Google,基于 C++ 進行的實現(xiàn),開發(fā)人員可以...
    謝煙客閱讀 20,356評論 3 16
  • 昨天結(jié)束了清華博物館組織的“文博夏令營”活動。一路行程,感觸良多。 這次參觀不但了解了藏族的佛教和民族歷史,也為藏...
    四月野在成長閱讀 147評論 1 2

友情鏈接更多精彩內(nèi)容