gRPC在node.js中的使用

gRPC 一开始由 google 开发,是一款语言中立、平台中立、开源的远程过程调用(RPC)系统。
官方文档地址 https://grpc.io/
中文文档地址 http://doc.oschina.net/grpc?t=58008
gRPC 是什么?(转自官方文档)
在 gRPC 里客户端应用可以像调用本地对象一样直接调用另一台不同的机器上服务端应用的方法,使得您能够更容易地创建分布式应用和服务。与许多 RPC 系统类似,gRPC 也是基于以下理念:定义一个服务,指定其能够被远程调用的方法(包含参数和返回类型)。在服务端实现这个接口,并运行一个 gRPC 服务器来处理客户端调用。在客户端拥有一个存根能够像服务端一样的方法。
gRPC 客户端和服务端可以在多种环境中运行和交互 - 从 google 内部的服务器到你自己的笔记本,并且可以用任何 gRPC 支持的语言来编写。所以,你可以很容易地用 Java 创建一个 gRPC 服务端,用 Go、Python、Ruby 来创建客户端。此外,Google 最新 API 将有 gRPC 版本的接口,使你很容易地将 Google 的功能集成到你的应用里。
使用 protocol buffers
gRPC 默认使用 protocol buffers,这是 Google 开源的一套成熟的结构数据序列化机制(当然也可以使用其他数据格式如 JSON)。正如你将在下方例子里所看到的,你用 proto files 创建 gRPC 服务,用 protocol buffers 消息类型来定义方法参数和返回类型。你可以在 Protocol Buffers 文档找到更多关于 Protocol Buffers 的资料。
Protocol buffers 版本
尽管 protocol buffers 对于开源用户来说已经存在了一段时间,例子内使用的却一种名叫 proto3 的新风格的 protocol buffers,它拥有轻量简化的语法、一些有用的新功能,并且支持更多新语言。当前针对 Java 和 C++ 发布了 beta 版本,针对 JavaNano(即 Android Java)发布 alpha 版本,在protocol buffers Github 源码库里有 Ruby 支持, 在golang/protobuf Github 源码库里还有针对 Go 语言的生成器, 对更多语言的支持正在开发中。 你可以在 proto3 语言指南里找到更多内容, 在与当前默认版本的发布说明比较,看到两者的主要不同点。更多关于 proto3 的文档很快就会出现。虽然你可以使用 proto2 (当前默认的 protocol buffers 版本), 我们通常建议你在 gRPC 里使用 proto3,因为这样你可以使用 gRPC 支持全部范围的的语言,并且能避免 proto2 客户端与 proto3 服务端交互时出现的兼容性问题,反之亦然。
在我的理解中,gRPC就是一种通信的协议,示例请参照官方的教程下载GitHUb中的代码
如果觉得一起下太大我单独下载了上传到自己的github,可以参考一下
https://github.com/402366376/node-gRPC-example
然后自己根据官网的教程编写了一段基于grpc的服务器跟客户端的交互,传输协议是服务端流传输
proto:

syntax = "proto3"; package testPackage; service testService { rpc test (pingRequest) returns (stream pingReply) {} } message pingRequest { } message pingReply { string message = 1; }

【gRPC在node.js中的使用】客户端client:
import { Service } from 'egg'; import * as grpc from 'grpc'; export default class Test extends Service {public async sayHi() { try { const PROTO_PATH = 'app/protos/test.proto'; const testProto = grpc.load(PROTO_PATH).testPackage; const client = new testProto.testService('0.0.0.0:50051', grpc.credentials.createInsecure()); let stream = client.test(); const re = () => { if (!stream) return; stream.cancel(); stream.destroy(); stream = null; }; stream.once('metadata', meta => { console.log('subscribe proc get metadata', meta); }); stream.on('data', data => { let alive = this.config.ipAdress; // console.log(alive); if (alive) { console.log(data); } else { re(); console.log('连接断开'); } }); stream.on('end', () => { console.log('subscribe proc end'); re(); }); stream.once('status', status => { console.log('subscribe get status', status); }); stream.on('error', error => { console.log(Date(), 'subscribe proc get error', error.code, error.message); re(); }); } catch (error) { console.log(error.message); } } }

服务端server:
import { Service } from 'egg'; import * as grpc from 'grpc'; export default class Server extends Service { public async sayHi() { try { const PROTO_PATH = 'app/protos/test.proto'; const testProto = grpc.load(PROTO_PATH).testPackage; let sum = 0; function test(call) { const a = Math.random(); console.log(`收到来自${a}的请求`); setInterval(function () { sum++; call.write('res=' + sum + ' ,id=' + a); console.log(a, sum); }, 1500); }const server = new grpc.Server(); server.addProtoService(testProto.testService.service, { test }); server.bind('0.0.0.0:50051', grpc.ServerCredentials.createInsecure()); server.start(); }catch (error) { console.log(error.message); } } }

写了这小demo上面是截取的重要代码,用的是egg.js框架,用ts写的
完整代码上传的地址:
https://download.csdn.net/download/qq_43064898/10784196
本文参考地址:
http://www.moye.me/2017/02/24/using-grpc-in-nodejs/
2020/03/12
好久没写过博客了
最进整理下代码
项目中使用grpc遇到点问题,之前使用的grpc好像是C还是C++的库,使用nodejs用grpc时可能导致内存没有释放,一直占用的问题,后来使用grpc-js库解决了这个问题
也写过一个gprc-js版本的demo,
用的是egg.js框架,用ts写的,
完整代码上传的地址:
https://download.csdn.net/download/qq_43064898/12244036

    推荐阅读