GRPC在node中的使用

159 阅读1分钟

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();

输出

服务端

fwd.png

客户端

khd.png