1.0.2 • Published 2 years ago

@chandre/egg-grpc-client v1.0.2

Weekly downloads
-
License
MIT
Repository
github
Last release
2 years ago

@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
        }
    }
  }
}
1.0.2

2 years ago

1.0.1

2 years ago

1.0.0

3 years ago