如何将gRPC定义的API带到Web浏览器

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

有没有人有经验做这样的事情或有一个想法如何可以解决?

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

支持来自浏览器的stream式RPC完全需要浏览器支持HTTP2预告片,并且在写这个答案的时候,它们不是。

关于这个话题的讨论请看这个问题 。

否则,是的,你需要WebSockets和gRPC之间的完整翻译系统。 也许从grpc网关获得灵感可能是这样一个项目的开始,但这仍然是一个很长的一步 。

https://github.com/tmc/grpc-websocket-proxy听起来像它可能会满足您的需求。; 这翻译JSON在networking套接字grpc(grpc网关顶层)。

https://github.com/grpc/的grpc人正在构build一个js 实现 。

repro是在https://github.com/grpc/grpc-web (给404 – >),这是目前(2016-12-20)在早期访问,所以你需要请求访问。

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

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

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

GRPC总线WebSocket代理通过在WebSocket连接上代理所有GRPC调用来完成这一任务,从而为您提供与浏览器中的Node GRPC API非常相似的内容。 与GRPC网关不同,它可以同时处理stream请求和stream式响应,也可以处理非stream式呼叫。

有一个服务器和客户端组件。 GRPC总线WebSocket代理服务器可以通过执行docker run gabrielgrant/grpc-bus-websocket-proxy

在浏览器端,您需要安装GRPC Bus WebSocket代理客户端,使用npm install grpc-bus-websocket-client

然后用new GBC(<grpc-bus-websocket-proxy address>, <protofile-url>, <service map>)创build一个新的GBC对象。

例如:

 var GBC = require("grpc-bus-websocket-client"); new GBC("ws://localhost:8080/", 'helloworld.proto', {helloworld: {Greeter: 'localhost:50051'}}) .connect() .then(function(gbc) { gbc.services.helloworld.Greeter.sayHello({name: 'Gabriel'}, function(err, res){ console.log(res); }); // --> Hello Gabriel }); 

客户端库期望能够通过AJAX请求下载.proto文件。 service-map提供了代理服务器所见的proto文件中定义的不同服务的URL。

有关更多详细信息,请参阅GRPC Bus WebSocket代理客户端自述文件