1.0.2 • Published 2 years ago
@chandre/egg-grpc-client v1.0.2
@chandre/egg-grpc-client
支持 grpc拦截器,请求流、响应流、双向流、自定义服务别名、定义默认响应超时时间、安全验证
安装
$ npm i @chandre/egg-grpc-client --save
使用
// {app_root}/config/plugin.js
exports.grpcClient = {
enable: true,
package: '@chandre/egg-grpc-client',
};
配置
// {app_root}/config/config.default.js
exports.grpcClient = {
client: {
// GRPC 服务器
endpoint: '127.0.0.1:50051',
// 方法调用默认响应超时
timeout: 5000,
// 认证
secure: false,
// 双向认证
// secure: {
// ca: '/home/app/ca.pem',
// key: '/cert/client.key',
// chain: '/cert/client.pem',
// },
// 拦截器、protobuf协议文件加载目录
baseDir: 'app/grpc',
// 拦截器
interceptors: ['beforeRequest'],
// 自定义服务别名
service: {
'demo.Hello': 'HelloService'
},
// 协议文件加载选项
protoOptions: {
keepCase: true,
defaults: true,
oneofs: true,
longs: String,
enums: String,
}
}
};
拦截器
// {app_root}/app/grpc/intercepter/beforeRequest.js
module.exports = function(app) {
const grpc = app.grpc;
return function(options, callNext) {
return new grpc.InterceptingCall(nextCall(options))
}
}
protobuf 协议
//{app_root}/app/grpc/proto/demo.proto
// 语法版本声明,必须放在非注释的第一行
syntax = "proto3";
// 包名定义
package demo;
message HelloRequest {
string message = 1;
}
message HelloResponse {
string message = 1;
}
service Hello {
rpc echo (HelloRequest) returns (HelloResponse) {};
}
调用
class HomeController extends Controller {
async helloEcho() {
const { ctx, app } = this;
const rpc = app.rpc;
const metadata = new app.grpc.Metadata()
metadata.add('user', 123456);
const req = rpc.HelloService.echo({
message: 'hello'
}, metadata, {
deadline: Date.now() + 3000 // 覆盖默认响应超时时间, Infinity = 不限制
})
// 监听状态
req.call.on("status", status => {
console.log(status)
})
// 等待响应
try {
const res = await req.promise();
ctx.body = res;
} catch(err) {
ctx.body = {
code: err.code,
message: err.message
}
}
}
}