雙向流式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 也是乙個很好的選擇。這是因為在新建乙個雙向佇列的時候,你可以指定這個佇列的大小,如果這個佇列滿員...