前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >NodeJS 实现一个简单的gRPC demo

NodeJS 实现一个简单的gRPC demo

原创
作者头像
拿我格子衫来
发布2022-02-22 17:14:33
1K0
发布2022-02-22 17:14:33
举报
文章被收录于专栏:TopFETopFE

由于项目中用到的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 两个库。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 定义.proto文件
  • 服务端文件 server.js
  • 客户端client.js
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档