【gRPC】快速開始 | Go

Prerequisites(先決條件)

獲取示例代碼

  1. 下載實(shí)例代碼
    $ git clone -b v1.46.0 --depth 1 https://github.com/grpc/grpc-go
    
  2. 切換代碼目錄
    $ cd grpc-go/examples/helloworld
    

運(yùn)行示例

在 examples/helloworld 目錄下:

  1. 編譯和執(zhí)行服務(wù)端代碼
    $ go run greeter_server/main.go
    
  2. 在另外一個(gè)終端中桃笙,編譯和執(zhí)行客戶端代碼,會(huì)看到客戶端輸出:
    $ go run greeter_client/main.go
    Greeting: Hello world
    

更新 gRPC 服務(wù)

在本節(jié)中蒙幻,將使用額外的 server 方法更新應(yīng)用程序漓雅。gRPC服務(wù)是使用 protocol buffers 定義的。
現(xiàn)在耕渴,只需要知道服務(wù)器和客戶端存根都有一個(gè) SayHello()RPC方法拘悦,該方法從客戶端獲取一個(gè) HelloRequest 參數(shù),并從服務(wù)器返回一個(gè) HelloReply橱脸,該方法的定義如下:

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

打開 helloworld/helloworld.proto础米,添加一個(gè)新的方法 SayHelloAgain()

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply) {}
  rpc SayHelloAgain (HelloRequest) returns (HelloReply) {}
}

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

重新生成 gRPC 代碼

在可以使用新的服務(wù)方法之前,需要重新編譯更新后的 .proto 文件添诉。
在 examples/helloworld 目錄下屁桑,運(yùn)行下面的命令:

$ protoc --go_out=. --go_opt=paths=source_relative \
--go-grpc_out=. --go-grpc_opt=paths=source_relative \
helloworld/helloworld.proto

paths:用于指定生成文件的路徑的結(jié)構(gòu),有兩個(gè)值:
1. paths=import 相對(duì)于導(dǎo)入路徑栏赴, 默認(rèn)值
2. paths=source_relative 相對(duì)于輸入文件蘑斧,即proto文件的路徑

重新生成的 helloworld/helloworld.pb.go 和 helloworld/helloworld_grpc.pb.go 文件中包含:

  • xxx.pb.go
    它包含用于填充、序列化和檢索 請(qǐng)求和響應(yīng)消息類型 的所有protocol buffer 代碼须眷。
  • xxx_grpc.pb.go
    客戶端使用的 服務(wù)中定義的方法調(diào)用的接口類型(或存根)乌叶。
    服務(wù)器要實(shí)現(xiàn)的接口類型。

更新并運(yùn)行應(yīng)用程序

雖然已經(jīng)生成了客戶端柒爸、服務(wù)端代碼准浴,但是任然需要示例程序中 實(shí)現(xiàn)和調(diào)用 新的方法。

  1. 更新 服務(wù)端
    打開 greeter_server/main.go 添加下面的函數(shù):
    func (s *server) SayHelloAgain (ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
      retrn &pb.HelloReply{Message: "Hello again " + in.GetName()}, nil
    }
    
  2. 更新客戶端
    打開 greeter_client/main.go 在 main() 函數(shù)體的最下方添加下面代碼:
    r, err = c.SayHelloAgain(ctx, &pb.HelloRequest{Name: name})
    if err != nil {
      log.Fatalf("could not greet : %v", err)
    }
    log.Printf("Greetine : %s", r.GetMessage())
    
  3. 運(yùn)行
    # 運(yùn)行 server
    go run greeter_server/main.go
    
    # 運(yùn)行 client
    go run greeter_client/main.go Alice
    
    # client 輸出
    2021/05/15 23:55:08 Greeting: Hello Alice
    2021/05/15 23:55:08 Greeting: Hello again Alice
    

總結(jié)

  • gRPC基本使用流程
  1. .proto 文件中定義 service捎稚、message

  2. 通過 protocol buffer 編譯器生成代碼

  3. 創(chuàng)建服務(wù)端
    3.1 實(shí)現(xiàn) servic 中定義的接口
    gRPC 允許你定義四種類型的服務(wù)方法

    3.2 啟動(dòng)一個(gè)gRPC 服務(wù)乐横,監(jiān)聽客戶端請(qǐng)求
    一旦你實(shí)現(xiàn)了所有的方法,我們需要啟動(dòng)一個(gè) gRPC 服務(wù)今野,目的是客戶端能夠使用我們的服務(wù)葡公。
    如何構(gòu)建并啟動(dòng)一個(gè)服務(wù):
    3.2.1 指定用于 監(jiān)聽客戶端請(qǐng)求的端口
    lis, err := net.Listen(...)

    3.2.2 創(chuàng)建一個(gè) gRPC 服務(wù)實(shí)例
    grpcServer := grpc.NewServer(...)

    3.2.3 在 gRPC服務(wù)器上注冊(cè)我們的服務(wù)實(shí)現(xiàn)
    pb.RegisterRouterGuideServer(...)

    3.2.4 在服務(wù)器上使用 端口詳細(xì)信息 調(diào)用Serve() 方法,以執(zhí)行阻塞等待条霜,直到進(jìn)程被終止 或 調(diào)用 Stop()
    grpcServer.Serve(...)

    lis, err := net.Listen("tcp", fmt.Sprintf("localhost:%d", *port))
    if err != nil {
      log.Fatalf("failed to listen: %v", err)
    }
    
    var opts []grpc.ServerOption
    ...
    grpcServer := grpc.NewServer(opts...)
    pb.RegisterRouteGuideServer(grpcServer, newServer())
    grpcServer.Serve(lis)
    
  4. 創(chuàng)建客戶端

  5. 創(chuàng)建一個(gè)stub
    要調(diào)用服務(wù)方法催什,我們首先需要?jiǎng)?chuàng)建一個(gè)gRPC通道來與服務(wù)器通信。我們通過將服務(wù)器地址和端口號(hào)傳遞給 grpc.Dial() 來創(chuàng)建它宰睡,如下所示:

    var opts []grpc.DialOption
    ...
    conn, err := grpc.Dial(*serverAddr, opts...)
    if err != nil {
    ...
    }
    defer conn.Close()
    

    可以使用 DialOptions 在 grpc.Dial 中設(shè)置身份驗(yàn)證憑據(jù)(例如蒲凶,TLS气筋、GCE憑據(jù)或JWT憑據(jù)),當(dāng)服務(wù)需要這些憑據(jù)時(shí)可以使用它們旋圆。

    一旦 gRPC通道 設(shè)置好宠默,我們就需要一個(gè)客戶端存根來執(zhí)行RPC。我們使用從 .proto文件 生成的 pb包 提供的 NewRouteGuideClient方法 獲得它灵巧。

    client := pb.NewRouteGuideClient(conn)
    
  6. 調(diào)用服務(wù)方法
    gRPC允許定義四種類型的服務(wù)方法

  7. 執(zhí)行客戶端搀矫、服務(wù)端應(yīng)用程序

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市刻肄,隨后出現(xiàn)的幾起案子瓤球,更是在濱河造成了極大的恐慌,老刑警劉巖敏弃,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件冰垄,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡权她,警方通過查閱死者的電腦和手機(jī)虹茶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來隅要,“玉大人蝴罪,你說我怎么就攤上這事〔角澹” “怎么了要门?”我有些...
    開封第一講書人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)廓啊。 經(jīng)常有香客問我欢搜,道長(zhǎng),這世上最難降的妖魔是什么谴轮? 我笑而不...
    開封第一講書人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任炒瘟,我火速辦了婚禮,結(jié)果婚禮上第步,老公的妹妹穿的比我還像新娘疮装。我一直安慰自己,他們只是感情好粘都,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開白布廓推。 她就那樣靜靜地躺著,像睡著了一般翩隧。 火紅的嫁衣襯著肌膚如雪樊展。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,754評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音专缠,去河邊找鬼雷酪。 笑死,一個(gè)胖子當(dāng)著我的面吹牛藤肢,可吹牛的內(nèi)容都是我干的太闺。 我是一名探鬼主播糯景,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼嘁圈,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了蟀淮?” 一聲冷哼從身側(cè)響起最住,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎怠惶,沒想到半個(gè)月后涨缚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡策治,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年脓魏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片通惫。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡茂翔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出履腋,到底是詐尸還是另有隱情珊燎,我是刑警寧澤,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布遵湖,位于F島的核電站悔政,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏延旧。R本人自食惡果不足惜谋国,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望迁沫。 院中可真熱鬧烹卒,春花似錦、人聲如沸弯洗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽牡整。三九已至藐吮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背谣辞。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工迫摔, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人泥从。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓句占,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親躯嫉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子纱烘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • grpc是后臺(tái)服務(wù)通信最常用的rpc框架。使用grpc需要預(yù)先定義協(xié)議文件(proto)祈餐,然后生成相應(yīng)的接口代碼才...
    霹靂楊閱讀 680評(píng)論 0 0
  • 1.簡(jiǎn)介 在gRPC中擂啥,客戶端應(yīng)用程序可以直接調(diào)用不同計(jì)算機(jī)上的服務(wù)器應(yīng)用程序上的方法,就像它是本地對(duì)象一樣帆阳,使您...
    第八共同體閱讀 1,880評(píng)論 0 6
  • 1哺壶,關(guān)于grpc-go golang 可以可以做grpc的服務(wù)端和客戶端。 官網(wǎng)的文檔: http://www.g...
    ebayboy閱讀 1,079評(píng)論 0 1
  • gRPC(Remote Procedure Calls) 概述 GRPC是一個(gè)高性能蜒谤、通用的開源RPC框架尚粘,基于底...
    鬼鸮閱讀 17,928評(píng)論 0 1
  • 彩排完嫉称,天已黑
    劉凱書法閱讀 4,220評(píng)論 1 3