NodeJS 实现一个简单的gRPC demo

举报
拿我格子衫来 发表于 2022/03/18 00:59:21 2022/03/18
【摘要】 由于项目中用到的gRPC,抽时间翻阅了一下gRPC相关的资料,现记录一下。 gRPC是谷歌开源的,需要定义接口协议文件,该文件是使用 protocol buffers 具体格式 https://dev...

由于项目中用到的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文件

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;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

服务端文件 server.js


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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

客户端client.js

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

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

文章来源: fizzz.blog.csdn.net,作者:拿我格子衫来,版权归原作者所有,如需转载,请联系作者。

原文链接:fizzz.blog.csdn.net/article/details/123071447

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。