java - 将 gRPC 服务的响应流式传输到 REST 客户端
问题描述
我正在尝试编写同时使用 gRPC 和 REST 的服务。实现技术有 Java、Spring Boot 和 gRPC。一个示例使用场景如下:
目的是有外部客户端可以通过 REST 端点和/或通过 gRPC 调用与应用程序交互。在内部,有“网关”服务提供外部接口并负责在外部客户端和“域”服务之间传输/路由请求和响应,这些服务执行实际工作。内部服务将通过 gRPC 进行通信。
外部客户端不知道内部如何处理事情,域服务没有外部接口。
我已经能够获得一个基本的请求/响应模式来端到端地工作,但我不确定如何实现涉及流式传输的模式(在任一方向上)。实际上,这并不完全正确——我已经能够让 gRPC 站点 ( https://grpc.io/ ) 上提供的基本示例正常工作。
这是我正在尝试做的一个例子,我似乎无法弄清楚如何工作:
“域”服务具有将对象集合(即流源)返回给请求者的能力。域使用 gRPC 逻辑将这些对象提供给调用客户端(在本例中为“网关”)。外部客户端对网关服务进行 REST 调用,以请求域服务提供的对象集合。
据我所知,域和网关之间的通信很好,但是当它试图将信息发送回外部客户端时出现问题。有关代码和我遇到的错误的具体详细信息,请参阅相关问题Problem return stream of response from gRPC service to RESTful client。
想到的一个问题是:REST 是否可以用于处理信息流(在任一方向)?如果不能,我有什么选择(如果有的话)?如果可以,我该怎么做?
更新:
我已经对上面引用的同伴 SO 发布进行了更新。
解决方案
您可以尝试 StreamingResponseBody (https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/servlet/mvc/method/annotation/StreamingResponseBody.html),它允许写入输出流而不阻塞主线程。
推荐阅读
- python - 无法注销用户 django 身份验证
- r - 通过标题和图表在 knitr 中循环
- android - android build failed gradle 无法解决
- c# - ItemsControl 不更新 ItemsSource 绑定
- python - 插入 heapq 是否比插入 bisect 快?
- apache-kafka - Confluent Kafka GCS(Google Cloud Storage)连接器在加载属性文件时出现解析错误
- python - How to print a list of dicts as an aligned table?
- r - 将列添加到 R data.table 并使用用户定义的函数聚合,将输出作为向量返回
- c# - 绑定数据 Xamarin 表单
- ios - 当 iPhone 处于单应用模式时,在应用内安装内部应用