如何在不定义protobuf的情况下进行远程调用?

发布于 2022-09-07 19:39:25 字数 1315 浏览 15 评论 0

使用 NodeJS 实现网关层,接收前端的HTTP请求,然后转发到内网进行RPC调用。但是 gRPC 的官方文档和示例的 Client 实现都需要引用 protobuf 文件,例如:grpc.load("/xxxx.protobuf")

但是这样每创建一个微服务,都需要在网关层提交一份 protobuf 定义文件,感觉有点太不灵活了,尤其是涉及到更新、版本管理就更麻烦了。不知道大公司是怎么管理 protobuf 文件的。但是我觉得 JS 作为一个动态语言,本身是不需要借助 protobuf 来确定数据类型的。与 golang 等静态语言对接的时候,我们可以不考虑 RPC 的 Stream 调用,可以约束 protobuf 编写时使用基本数据类型,例如 string,int64,bool等,确保 JS 的数据总是能准确转换到静态语言可用的类型。

所以,如何在不定义 protobuf 的情况下进行远程调用?或者,有没有更好的 protobuf 组织和管理的方案?


昨天通过翻阅文档和源码,写出了如下的代码,但是会报错 RPC method not implemented

import grpc from "grpc;

const client = new grpc.Client("127.0.0.1:3005", grpc.credentials.createInsecure())

client.makeUnaryRequest("GetService",
    function serialize(arg) {
        return new Buffer(JSON.stringify(arg));
    },
    function deserialize(argBuf) {
        // 未执行到此处
        console.log(typeof argBuf);
        return argBuf
    }, {
        name: "test"
    },
    null,
    null,
    function () {
        // 未执行到此处
        console.log(arguments);
    }
)

protobuf 定义(省略了一部分)

service Finder {
    rpc GetService (GetServiceRequest) returns (GetServiceReply) {}
}

message GetServiceRequest {
    string name = 1;
}

message GetServiceReply {
    string address = 1;
    string port = 2;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

后来的我们 2022-09-14 19:39:25

题主后来有答案了吗?同想实现

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文