作者:小菠萝 | 来源:互联网 | 2023-08-13 18:07
使用NodeJS实现网关层,接收前端的HTTP请求,然后转发到内网进行RPC调用。但是gRPC的官方文档和示例的Client实现都需要引用protobuf文件,例如:
使用 NodeJS 实现网关层,接收前端的HTTP请求,然后转发到内网进行RPC调用。但是 gRPC 的官方文档和示例的 Client 实现都需要引用 protobuf 文件,例如:
1
| grpc.load("/xxxx.protobuf") |
但是这样每创建一个微服务,都需要在网关层提交一份 protobuf 定义文件,感觉有点太不灵活了,尤其是涉及到更新、版本管理就更麻烦了。不知道大公司是怎么管理 protobuf 文件的。但是我觉得 JS 作为一个动态语言,本身是不需要借助 protobuf 来确定数据类型的。与 golang 等静态语言对接的时候,我们可以不考虑 RPC 的 Stream 调用,可以约束 protobuf 编写时使用基本数据类型,例如 string,int64,bool等,确保 JS 的数据总是能准确转换到静态语言可用的类型。
所以,如何在不定义 protobuf 的情况下进行远程调用?或者,有没有更好的 protobuf 组织和管理的方案?
昨天通过翻阅文档和源码,写出了如下的代码,但是会报错
1
| RPC method not implemented |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| 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 定义(省略了一部分)
1 2 3 4 5 6 7 8 9 10 11 12
| service Finder {
rpc GetService (GetServiceRequest) returns (GetServiceReply) {}
}
message GetServiceRequest {
string name = 1;
}
message GetServiceReply {
string address = 1;
string port = 2;
} |