如何将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代理客户端自述文件