我希望我的 React.js Web 应用程序能够连接到实现 gRPC 服务器反射协议的 gRPC 服务器。
使用 gRPC 反射将允许 Web 应用程序动态发现和使用方法,而不必导入原始文件。
我查看了一些库,例如 grpc-js-reflection-api-client 和 gprc-reflection-js,但这些库通过依赖于
@grpc/grpc-js
假定 Node.js 运行时,但事实并非如此从浏览器应用程序运行它们似乎是可行的。
还有另一种方法来使用 gRPC 反射,也许使用像 grpc-web 这样的库?
这是一个简单的例子,与我想做的事情一致(来自
grpc-js-reflection-api-client
的代码片段):
const { GrpcReflection } = require('grpc-js-reflection-client');
const grpc = require('@grpc/grpc-js');
function getChannelCredentials() {
return grpc.ChannelCredentials.createSsl();
}
(async()=> {
const client = new GrpcReflection(
'grpcb.in:9001',
getChannelCredentials(),
);
console.log(await client.listServices());
})();
不幸的是,gRPC Web 无法支持标准 gRPC 反射协议。问题是反射是一种双向流 RPC 和 gRPC Web 不支持双向流,因为大多数 HTTP/2 浏览器实现中缺少 HTTP/2 预告片支持。
此 RPC 定义为使用双向流的原因是,它确保所有类型信息都来自单个后端服务器,并且当前端由负载均衡器时,不会出现不一致的服务器返回不一致类型信息的情况。
如果您愿意编写自己的反射服务器实现,您可以将其作为服务器端流式 RPC 来实现,这受 gRPC Web 支持。当然,您要么需要确保与负载均衡器的粘性会话,要么确保所有后端服务器都同意所有类型信息。
这也意味着您不能依赖任何现有的反射客户端库。无论如何,您肯定会在这里越野。