NodeJS?GRPC?多個(gè)?.proto?文件的處理步驟
1. 安裝依賴
首先,確保你已經(jīng)安裝了 grpc-tools 和 grpc_tools_node_protoc_ts:
npm install grpc-tools grpc_tools_node_protoc_ts --save-dev
2. 定義 .proto 文件
假設(shè)我們有兩個(gè) .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
生成文件解釋
運(yùn)行上述命令后,將在 ./generated 目錄中生成以下文件:
service_a_pb.js 和 service_b_pb.js:
- 包含 Protocol Buffers 消息的定義和序列化/反序列化邏輯。
- 定義了
.proto文件中聲明的消息類型,并提供了相應(yīng)的 getter 和 setter 方法。 service_a_grpc_pb.js和service_b_grpc_pb.js:- 包含 gRPC 服務(wù)的客戶端和服務(wù)器端的接口定義。
- 定義了服務(wù)的方法,并提供了用于調(diào)用這些方法的客戶端和服務(wù)器端的代碼。
4. 實(shí)現(xiàn)服務(wù)器
創(chuàng)建 server.js 文件,包含服務(wù)的實(shí)現(xiàn):
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. 實(shí)現(xiàn)客戶端
創(chuàng)建 client.js 文件,包含客戶端的實(shí)現(xiàn):
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. 運(yùn)行服務(wù)器和客戶端
確保你已經(jīng)安裝了所有必要的依賴:
npm install @grpc/grpc-js
然后,分別運(yùn)行服務(wù)器和客戶端:
node server.js node client.js
到此這篇關(guān)于NodeJS GRPC 多個(gè) .proto 文件的文章就介紹到這了,更多相關(guān)NodeJS GRPC .proto 文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
npm install常見錯(cuò)誤類型及對應(yīng)的解決方案
在前端開發(fā)中,npm是最常用的包管理工具,通過 npm install 命令,開發(fā)者可以輕松地安裝項(xiàng)目所需的依賴包,然而,在實(shí)際使用過程中,npm install 可能會因?yàn)楦鞣N原因而報(bào)錯(cuò),本文將詳細(xì)介紹一些常見的 npm install 錯(cuò)誤類型、發(fā)生原因及其對應(yīng)的解決方案,需要的朋友可以參考下2025-03-03
如何解決安裝websocket還是報(bào)錯(cuò)Cannot find module'ws&apos
這篇文章主要介紹了如何解決安裝websocket還是報(bào)Cannot find module'ws'問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02
使用Node.js配合Nginx實(shí)現(xiàn)高負(fù)載網(wǎng)絡(luò)
這篇文章主要介紹了使用Node.js配合Nginx實(shí)現(xiàn)高負(fù)載網(wǎng)絡(luò),Node的異步加上Nginx的反向代理在性能上實(shí)在是給力!需要的朋友可以參考下2015-06-06
Node.js實(shí)現(xiàn)一個(gè)HTTP服務(wù)器的方法示例
這篇文章主要介紹了Node.js實(shí)現(xiàn)一個(gè)HTTP服務(wù)器的方法示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05

