Go gRPC教程 雙向流式RPC(五)

2022-01-15 01:16:14 字數 3034 閱讀 4352

雙向流式rpc:客戶端和服務端雙方使用讀寫流去傳送乙個訊息序列,兩個流獨立操作,雙方可以同時傳送和同時接收。

情景模擬:雙方對話(可以一問一答、一問多答、多問一答,形式靈活)。新建both_stream.proto檔案

1.定義傳送資訊

// 定義流式請求資訊

message streamrequest

2.定義接收資訊

// 定義流式響應資訊

message streamresponse

3.定義服務方法conversations

雙向流式rpc,只要在請求的引數前和響應引數前都新增stream即可

service stream;

}

4.編譯proto檔案

進入both_stream.proto所在目錄,執行指令:

protoc --go_out=plugins=grpc:./ ./both_stream.proto

1.定義我們的服務,並實現routelist方法

這裡簡單實現對話中一問一答的形式

// streamservice 定義我們的服務

type streamservice struct{}

// conversations 實現conversations方法

func (s *streamservice) conversations(srv pb.stream_conversationsserver) error

if err != nil

err = srv.send(&pb.streamresponse)

if err != nil

n++log.printf("from stream client question: %s", req.question)

}}

2.啟動grpc伺服器

const (

// address 監聽位址

address string = ":8000"

// network 網路通訊協議

network string = "tcp"

)func main()

log.println(address + " net.listing...")

// 新建grpc伺服器例項

grpcserver := grpc.newserver()

// 在grpc伺服器註冊我們的服務

pb.registerstreamserver(grpcserver, &streamservice{})

//用伺服器 serve() 方法以及我們的埠資訊區實現阻塞等待,直到程序被殺死或者 stop() 被呼叫

err = grpcserver.serve(listener)

if err != nil

}

執行服務端

go run server.go

:8000 net.listing...

1.建立呼叫服務端conversations方法

// conversations 呼叫服務端的conversations方法

func conversations()

for n := 0; n < 5; n++ )

if err != nil

res, err := stream.recv()

if err == io.eof

if err != nil

// 列印返回值

log.println(res.answer)

} //最後關閉流

err = stream.closesend()

if err != nil

}

2.啟動grpc客戶端

// address 連線位址

const address string = ":8000"

var streamclient pb.streamclient

func main()

defer conn.close()

// 建立grpc連線

streamclient = pb.newstreamclient(conn)

conversations()

}

執行客戶端,獲取到服務端的應答

go run client.go

from stream server answer: the 1 question is stream client rpc 0

from stream server answer: the 2 question is stream client rpc 1

from stream server answer: the 3 question is stream client rpc 2

from stream server answer: the 4 question is stream client rpc 3

from stream server answer: the 5 question is stream client rpc 4

服務端獲取到來自客戶端的提問

from stream client question: stream client rpc 0

from stream client question: stream client rpc 1

from stream client question: stream client rpc 2

from stream client question: stream client rpc 3

from stream client question: stream client rpc 4

本篇介紹了雙向流式rpc的簡單使用。

參考:grpc官方文件中文版

Go gRPC框架2 單項 RPC

grpc 思想 定義乙個服務,指定其可以被遠端呼叫的方法及其引數和返回型別。rpc sayhello hellorequest returns helloresponse rpc lotsofreplies hellorequest returns stream helloresponse rpc ...

RabbitMQ Go客戶端教程6 RPC

本文翻譯自rabbitmq官網的go語言客戶端系列教程,本文首發於我的個人部落格 liwenzhou.com,教程共分為六篇,本文是第六篇 rpc。這些教程涵蓋了使用rabbitmq建立訊息傳遞應用程式的基礎知識。你需要安裝rabbitmq伺服器才能完成這些教程,請參閱安裝指南或使用docker映象...

python教程 對雙向佇列的理解

介紹 deque 是什麼 collections.deque 類 雙向佇列 是乙個執行緒安全 可以快速從兩端新增或者刪除元素的資料型別。而且如果想要有一種資料型別來存 放 最近用到的幾個元素 deque 也是乙個很好的選擇。這是因為在新建乙個雙向佇列的時候,你可以指定這個佇列的大小,如果這個佇列滿員...