如何在没有 Node.js 的浏览器客户端中使用 gRPC 反射?

问题描述 投票:0回答:1

我希望我的 React.js Web 应用程序能够连接到实现 gRPC 服务器反射协议的 gRPC 服务器。

使用 gRPC 反射将允许 Web 应用程序动态发现和使用方法,而不必导入原始文件。

我查看了一些库,例如 grpc-js-reflection-api-clientgprc-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());
})();
javascript grpc grpc-web
1个回答
0
投票

不幸的是,gRPC Web 无法支持标准 gRPC 反射协议。问题是反射是一种双向流 RPC 和 gRPC Web 不支持双向流,因为大多数 HTTP/2 浏览器实现中缺少 HTTP/2 预告片支持。

此 RPC 定义为使用双向流的原因是,它确保所有类型信息都来自单个后端服务器,并且当前端由负载均衡器时,不会出现不一致的服务器返回不一致类型信息的情况。

如果您愿意编写自己的反射服务器实现,您可以将其作为服务器端流式 RPC 来实现,这受 gRPC Web 支持。当然,您要么需要确保与负载均衡器的粘性会话,要么确保所有后端服务器都同意所有类型信息。

这也意味着您不能依赖任何现有的反射客户端库。无论如何,您肯定会在这里越野。

© www.soinside.com 2019 - 2024. All rights reserved.