A tour of gRPC:05 - gRPC server straming 服务端流
![A tour of gRPC:05 - gRPC server straming 服务端流](https://static001.geekbang.org/infoq/b2/b252150ea58d62794d4b8ca44edbf0f2.jpeg)
在上一篇中,我们实现了 gRPC 中的 unary call,即客户端发一个请求,服务端回复一个响应。并尝试了 它在跨语言的情型下调用。在本篇中,我们将尝试实现 server straming 即客户端发送一个请求,服务 端回复多个响应,并同样尝试跨语言的调用。
go server straming call
1. 添加 filter_message.proto 用于描述筛选条件。
![](https://static001.geekbang.org/infoq/d2/d2d85bc3a8892f7cfea67de70ec695b2.jpeg?x-oss-process=image/resize,p_80/auto-orient,1)
2. 修改 laptop_service.proto 添加 一个搜索的 service。
![](https://static001.geekbang.org/infoq/1f/1f7617c275ebb32ce9658f451306c2c5.jpeg?x-oss-process=image/resize,p_80/auto-orient,1)
3. 运行 make clean 和 make gen 生成代码
4. 在 laptop_store.go 在 LaptopStore 接口中添加 Search 函数,并添加相应实现。(因为深拷⻉多次使用,这里抽出一个函数)
![](https://static001.geekbang.org/infoq/1b/1bd88e0a47f91188f0e95648c83f345f.jpeg?x-oss-process=image/resize,p_80/auto-orient,1)
5. 在 laptop_server.go 中添加 SearchLaptop 方法
![](https://static001.geekbang.org/infoq/23/23e9de9d427ac487cee43ffa6dbccc75.jpeg?x-oss-process=image/resize,p_80/auto-orient,1)
6. 将 client 包下的 main.go 中的 createLaptop 逻辑抽出来,并在 main 函数中利用 for 创建 10 个; 添加一个过滤条件
![](https://static001.geekbang.org/infoq/4b/4bda3ee0725b0e308e74b80ac1d6fee0.jpeg?x-oss-process=image/resize,p_80/auto-orient,1)
7. make server 运行服务器 make client 运行客户端,查看结果,运行正常
![](https://static001.geekbang.org/infoq/5c/5c3ef9f8a61cd5824d01aeaab09f62fb.jpeg?x-oss-process=image/resize,p_80/auto-orient,1)
![](https://static001.geekbang.org/infoq/fa/fa02354fab6c5d4531211ab980862635.jpeg?x-oss-process=image/resize,p_80/auto-orient,1)
可以观察到,在创建了 10 个 Laptop,接收了筛选条件后,server 会检查逐条检查 map 中的数据,如果 符合,则返回一条,即结果分多次逐条返回。
Java server straming call
1. 将 gRpc go Straming 中编写的 filter_message.proto 和 laptop_service.protp 文件拷⻉ 至 Java 项目的 proto 文件夹中,并运行 mvn clean 和 mvn comple
2. 在 LaptopStore 接口中新增 search 方法
![](https://static001.geekbang.org/infoq/02/020f2ea088d33d7e3ff26913e366f15a.jpeg?x-oss-process=image/resize,p_80/auto-orient,1)
3. 新增一个接口 LaptopStream 其只有一个 send 方法
![](https://static001.geekbang.org/infoq/8c/8cf3095d8c8c85e28bf226c96a05b4be.jpeg?x-oss-process=image/resize,p_80/auto-orient,1)
4. 在 InMemoryLaptopStore 中实现上面新增的 search 方法
![](https://static001.geekbang.org/infoq/93/93093885653ec3ea2d5d9c5fa2fcecb0.jpeg?x-oss-process=image/resize,p_80/auto-orient,1)
5. 在 LaptopService 编写一个 searchLaptop 方法作作为服务端的实现。
![](https://static001.geekbang.org/infoq/63/63c4f98348ce2a85533e152a95261ebb.jpeg?x-oss-process=image/resize,p_80/auto-orient,1)
6. 接下来实现 LaptopClient 中实现客户端逻辑,增加一个 SearchLaptop 方法。
![](https://static001.geekbang.org/infoq/ef/efd57d401845306a1d7672ee2049a0af.jpeg?x-oss-process=image/resize,p_80/auto-orient,1)
7. 修改 LaptopClient 中的 main 方法,先创建 10 个 Laptop 再进行过滤查询
![](https://static001.geekbang.org/infoq/78/788fdb2e2d1fc04ff55ae939be9fc680.jpeg?x-oss-process=image/resize,p_80/auto-orient,1)
运行 server 再运行 client
![](https://static001.geekbang.org/infoq/13/137e17f01ae92712c323749ce2918a17.jpeg?x-oss-process=image/resize,p_80/auto-orient,1)
![](https://static001.geekbang.org/infoq/41/41848a774afecb245f27bf6cfc265d89.jpeg?x-oss-process=image/resize,p_80/auto-orient,1)
可以观察到,server 的结果是多次返回的,这也是 server straming 的特性。
跨语言的 server straming call 测试
我们先运行 Java 的 server 再运行 golang 的 client。
![](https://static001.geekbang.org/infoq/9a/9af5c8d906eb005657f14d7b2b21d30d.jpeg?x-oss-process=image/resize,p_80/auto-orient,1)
再反过来,运行 golang 的 server 和 Java 的 client。
![](https://static001.geekbang.org/infoq/49/49d21d6b91cab154929abf7372973c88.jpeg?x-oss-process=image/resize,p_80/auto-orient,1)
运行的结果符合预期,并且符合 server straming 的特性。
![](https://static001.geekbang.org/infoq/b9/b9760b00e3a549216b50e94ccf4e2827.jpeg?x-oss-process=image/resize,p_80/auto-orient,1)
![](https://static001.geekbang.org/infoq/de/deae985ff4fabc7123991464421bd544.jpeg?x-oss-process=image/resize,p_80/auto-orient,1)
![](https://static001.geekbang.org/infoq/9d/9d3abba7b4cfe3e32b78cdb1b198b22d.jpeg?x-oss-process=image/resize,p_80/auto-orient,1)
版权声明: 本文为 InfoQ 作者【BUG侦探】的原创文章。
原文链接:【http://xie.infoq.cn/article/0abcb9ea02df8ee35a25b79be】。文章转载请联系作者。
评论