如何将gRPC定义的API引入Web浏览器

Oli*_*ver 71 javascript protocol-buffers node.js microservices grpc

我们想为我们的gRPC微服务构建一个Javascript/HTML gui.由于浏览器端不支持gRPC,我们考虑使用web-socket连接到node.js服务器,该服务器通过grpc调用目标服务.我们很难找到一个优雅的解决方案来做到这一点.特别是,因为我们使用gRPC流来推动我们的微服务之间的事件.似乎我们需要第二个RPC系统,只是为了在前端和node.js服务器之间进行通信.这似乎是很多开销和必须维护的额外代码.

有没有人有这方面的经验,或者知道如何解决这个问题?

Mar*_*cus 33

编辑:自2018年10月23日以来,gRPC-Web项目是GA,这可能是解决您问题的最官方/标准化方式.(即使现在已经2018年......;))

来自GA-Blog:"gRPC-Web,就像gRPC一样,允许您使用Protocol Buffers在客户端(Web)和后端gRPC服务之间定义服务"契约".然后可以自动生成客户端.[...]"

我们最近构建了gRPC-Web(https://github.com/improbable-eng/grpc-web) - 一个遵循建议的gRPC-Web协议的浏览器客户端和服务器包装器.该回购中的例子应该提供一个良好的起点.

如果您使用Golang,它需要一个独立的代理或gRPC服务器的包装器.代理/包装器修改响应以将响应主体中的预告片打包,以便浏览器可以读取它们.

披露:我是该项目的维护者.

  • 杀手级功能是现在可以为任何原型文件创建HTML操场页面,类似于对swagger所做的操作。这样,可以通过浏览器轻松测试任何gRPC服务。 (4认同)

Nic*_*ble 16

不幸的是,你还没有任何好的答案.

完全支持来自浏览器的流式RPC需要浏览器支持HTTP2预告片,并且在撰写此答案时,它们不是.

有关主题的讨论,请参阅此问题.

否则,是的,您需要WebSockets和gRPC之间的完整翻译系统.也许从grpc-gateway获得灵感可能是这个项目的开始,但这仍然是一个很长的镜头.


Cod*_*Ray 10

官方grpc-web(beta)实施于2008年3月23日发布.你可以找到它

https://github.com/grpc/grpc-web

以下说明来自自述文件:

定义您的gRPC服务:

service EchoService {
  rpc Echo(EchoRequest) returns (EchoResponse);

  rpc ServerStreamingEcho(ServerStreamingEchoRequest)
      returns (stream ServerStreamingEchoResponse);
}
Run Code Online (Sandbox Code Playgroud)

用您想要的任何语言构建服务器.

创建您的JS客户端以从浏览器进行调用:

var echoService = new proto.grpc.gateway.testing.EchoServiceClient(
  'http://localhost:8080');
Run Code Online (Sandbox Code Playgroud)

进行一元RPC调用

var unaryRequest = new proto.grpc.gateway.testing.EchoRequest();
unaryRequest.setMessage(msg);
echoService.echo(unaryRequest, {},
  function(err, response) {
    console.log(response.getMessage());
  });
Run Code Online (Sandbox Code Playgroud)

支持从服务器到浏览器的流:

var stream = echoService.serverStreamingEcho(streamRequest, {});
stream.on('data', function(response) {
  console.log(response.getMessage());
});
Run Code Online (Sandbox Code Playgroud)

不支持双向流:

这是一项正在进行中的工作以及grpc-web路线图.虽然有一个示例protobuf显示bidi流,但这个评论清楚地表明这个例子实际上还没有工作.

希望这会很快改变.:)

  • @MatthijsKooijman 他们的回声示例显示了客户端和全双工流:https://github.com/grpc/grpc-web/blob/master/net/grpc/gateway/examples/echo/echo.proto#L96 (2认同)

Ric*_*kyA 7

https://github.com/grpc/上的grpc人员正在构建一个js 实现.

repro位于https://github.com/grpc/grpc-web(给出404 - >),这是当前(2016-12-20)的早期访问,因此您需要请求访问权限.


tmc*_*tmc 6

https://github.com/tmc/grpc-websocket-proxy听起来可能满足您的需求.这将json通过Web套接字转换为grpc(grpc-gateway顶层).