GRPC是一个跨语言通信技术(协议)
准备
依赖
npm install @grpc/proto-loader
npm install @grpc/grpc-js
const grpc = require("@grpc/grpc-js");
const protoLoader = require("@grpc/proto-loader");
设置解析规则,即.proto文件
创建一个.proto文件: GRPC.proto 如下 (客服端传递消息字符串到服务端,服务端返回code和list)
syntax = "proto3";
package GRPC;
service Greeter {
rpc SaySend (GRPCRequest) returns (GRPCReply) {}
}
message GRPCRequest {
string msg = 1;
}
message GRPCReply {
int32 code = 1;
message Row{
int32 id = 3;
string value = 4;
}
repeated Row data = 2;
}
服务端
开启服务,如下:
console.log("GRPC-服务端")
/*
服务端
*/
const grpc = require("@grpc/grpc-js");
const protoLoader = require("@grpc/proto-loader");
/**
* 引入proto规则
*/
const PROTO_PATH = __dirname + "/GRPC.proto";
const packageDefinition = protoLoader.loadSync(PROTO_PATH, {
keepCase: true,
longs: String,
enums: String,
defaults: true,
oneofs: true,
});
const GRPC_proto = grpc.loadPackageDefinition(packageDefinition).GRPC;//最后这个是规则里的package
function main() {
var server = new grpc.Server();
server.addService(GRPC_proto.Greeter.service, {
saySend: (call, callback) => {
console.log("有来自客户端的消息:" + call.request.msg)
//收到请求后,进行反馈
callback(null, { code: 200, data: randomList() });
},
});
server.bindAsync(
"127.0.0.1:50051",//设置IP端口
grpc.ServerCredentials.createInsecure(),
() => {
server.start();
}
);
}
//生成随机列表-测试用
const randomList = ()=>{
let indx = Math.floor(Math.random() *10)
let arr = []
for(i=0;i<indx;i++){
arr.push({
id:i,
value:new Date().getTime()
})
}
return arr
}
main();
客户端
访问服务,如下:
console.log("GRPC-客户端")
/*
客户端
*/
const grpc = require("@grpc/grpc-js");
const protoLoader = require("@grpc/proto-loader");
/**
* 引入proto规则
*/
const PROTO_PATH = __dirname + "/GRPC.proto";
let packageDefinition = protoLoader.loadSync(PROTO_PATH, {
keepCase: true,
longs: String,
enums: String,
defaults: true,
oneofs: true,
});
var GRPC_proto = grpc.loadPackageDefinition(packageDefinition).GRPC;//最后这个是规则里的package
function main() {
//建立连接
const client = new GRPC_proto.Greeter(
"127.0.0.1:50051",//请求地址
grpc.credentials.createInsecure()
);
//轮询发送消息到服务端,并打印反馈消息
setInterval(() => {
//发送消息,并在回调里等待反馈
client.saySend({ msg: new Date() }, (err, response) => {
if (response) {
console.log("服务端消息:",response);
}
});
}, 1000)
}
main();