NodeJS 实现一个简单的gRPC demo

2022-02-22 17:14:33 浏览数 (1)

由于项目中用到的gRPC,抽时间翻阅了一下gRPC相关的资料,现记录一下。

gRPC是谷歌开源的,需要定义接口协议文件,该文件是使用 protocol buffers

具体格式

https://developers.google.com/protocol-buffers/docs/overview

该文件定义后,可以通过一些工具转化为可供其他语言适应的类。如java, nodejs,python,go, c

grpc协议会将传输的数据序列化为二进制流进行传输,此外主要特点是,必须遵循严格的接口协议,调用远程的方法,就像调用本地的一样。

想要更加具体了解的可以看看这个文章

https://studygolang.com/articles/21897?fr=sidebar

定义.proto文件

代码语言:c复制
syntax = "proto3";

package pet;

// 服务名为 Adopt 
// 方法为 AdoptPet
service Adopt {
  rpc AdoptPet(PetRequest) returns (PetReply) {}
}

// 请求时 需传递type
message PetRequest {
  string type = 1;
}

// 返回体只包含name属性
message PetReply {
  string name = 1;
}

服务端文件 server.js

代码语言:javascript复制
const PROTO_PATH = __dirname   '/pet.proto'

var grpc = require('@grpc/grpc-js') // 用于创建服务的的核心库
var protoLoader = require('@grpc/proto-loader') // 用于加载,解析,序列化 proto文件的库
var packageDefinition = protoLoader.loadSync(
  PROTO_PATH,
  {
    keepCase: true,
    longs: String,
    enums: String,
    defaults: true,
    oneofs: true
  }
)

var pet_proto = grpc.loadPackageDefinition(packageDefinition).pet;

function AdoptPet(call, callback) {
  callback(null, { name: 'Tom' })
}

function start() {
  var server = new grpc.Server();
  server.addService(pet_proto.Adopt.service, { AdoptPet })

  server.bindAsync('0.0.0.0:50052', grpc.ServerCredentials.createInsecure(), () => {
    server.start();
  })

}

start()

客户端client.js

代码语言:javascript复制
var PROTO_PATH = __dirname   '/pet.proto'

var grpc = require('@grpc/grpc-js')
var protoLoader = require('@grpc/proto-loader')
var packageDefinition = protoLoader.loadSync(
  PROTO_PATH,
  {
    keepCase: true,
    longs: String,
    enume: String,
    defaults: true,
    oneofs: true,
  }
)

var pet_proto = grpc.loadPackageDefinition(packageDefinition).pet;

function main() {
  var target = 'localhost:50052'
  var client = new pet_proto.Adopt(target, grpc.credentials.createInsecure())

  client.AdoptPet({ type: 'dog' }, function (error, res) {
    console.log('pet name:', res.name)
  })
}

main()

需要安装 @grpc/grpc-js, @grpc/proto-loader 两个库。

0 人点赞