1. 安装依赖
首先,确保你已经安装了 grpc-tools 和 grpc_tools_node_protoc_ts:
npm install grpc-tools grpc_tools_node_protoc_ts --save-dev
2. 定义 .proto 文件
假设我们有两个 .proto 文件:service_a.proto 和 service_b.proto。
service_a.proto:
syntax = "proto3";
package myproject;
service servicea {
rpc method1 (request1) returns (response1) {}
rpc method2 (request2) returns (response2) {}
}
message request1 { string name = 1; }
message response1 { string message = 1; }
message request2 { string name = 1; }
message response2 { string message = 1; }service_b.proto:
syntax = "proto3";
package myproject;
service serviceb {
rpc method3 (request3) returns (response3) {}
rpc method4 (request4) returns (response4) {}
}
message request3 { string name = 1; }
message response3 { string message = 1; }
message request4 { string name = 1; }
message response4 { string message = 1; }3. 生成 grpc 代码
使用 npx grpc_tools_node_protoc 生成 grpc 代码,并指定输出目录:
npx grpc_tools_node_protoc --js_out=import_style=commonjs,binary:./generated --grpc_out=grpc_js:./generated --proto_path=. service_a.proto npx grpc_tools_node_protoc --js_out=import_style=commonjs,binary:./generated --grpc_out=grpc_js:./generated --proto_path=. service_b.proto
生成文件解释
运行上述命令后,将在 ./generated 目录中生成以下文件:
service_a_pb.js 和 service_b_pb.js:
- 包含 protocol buffers 消息的定义和序列化/反序列化逻辑。
- 定义了
.proto文件中声明的消息类型,并提供了相应的 getter 和 setter 方法。 service_a_grpc_pb.js和service_b_grpc_pb.js:- 包含 grpc 服务的客户端和服务器端的接口定义。
- 定义了服务的方法,并提供了用于调用这些方法的客户端和服务器端的代码。
4. 实现服务器
创建 server.js 文件,包含服务的实现:
const grpc = require('@grpc/grpc-js');
const serviceaproto = require('./generated/service_a_grpc_pb');
const serviceamessages = require('./generated/service_a_pb');
const servicebproto = require('./generated/service_b_grpc_pb');
const servicebmessages = require('./generated/service_b_pb');
function method1(call, callback) {
const reply = new serviceamessages.response1();
reply.setmessage('response from method1: ' + call.request.getname());
callback(null, reply);
}
function method2(call, callback) {
const reply = new serviceamessages.response2();
reply.setmessage('response from method2: ' + call.request.getname());
callback(null, reply);
}
function method3(call, callback) {
const reply = new servicebmessages.response3();
reply.setmessage('response from method3: ' + call.request.getname());
callback(null, reply);
}
function method4(call, callback) {
const reply = new servicebmessages.response4();
reply.setmessage('response from method4: ' + call.request.getname());
callback(null, reply);
}
function main() {
const server = new grpc.server();
server.addservice(serviceaproto.serviceaservice, { method1: method1, method2: method2 });
server.addservice(servicebproto.servicebservice, { method3: method3, method4: method4 });
server.bindasync('0.0.0.0:50051', grpc.servercredentials.createinsecure(), () => {
server.start();
});
}
main();5. 实现客户端
创建 client.js 文件,包含客户端的实现:
const grpc = require('@grpc/grpc-js');
const serviceaproto = require('./generated/service_a_grpc_pb');
const serviceamessages = require('./generated/service_a_pb');
const servicebproto = require('./generated/service_b_grpc_pb');
const servicebmessages = require('./generated/service_b_pb');
function main() {
const clienta = new serviceaproto.serviceaclient('localhost:50051', grpc.credentials.createinsecure());
const clientb = new servicebproto.servicebclient('localhost:50051', grpc.credentials.createinsecure());
const request1 = new serviceamessages.request1();
request1.setname('world');
clienta.method1(request1, (err, response) => {
if (err) console.error(err);
else console.log('response from method1:', response.getmessage());
});
const request3 = new servicebmessages.request3();
request3.setname('world');
clientb.method3(request3, (err, response) => {
if (err) console.error(err);
else console.log('response from method3:', response.getmessage());
});
}
main();6. 运行服务器和客户端
确保你已经安装了所有必要的依赖:
npm install @grpc/grpc-js
然后,分别运行服务器和客户端:
node server.js node client.js
到此这篇关于nodejs grpc 多个 .proto 文件的文章就介绍到这了,更多相关nodejs grpc .proto 文件内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论