RPC 代理(Proxy)配置

2018/6/15 posted in  Microservice

https://github.com/eggjs/egg-sofa-rpc/wiki/RPC-%E4%BB%A3%E7%90%86%EF%BC%88Proxy%EF%BC%89%E9%85%8D%E7%BD%AE

简介

在作为 RPC 的调用方时,我们需要对我们调用的服务做一些预先申明,然后生成一些本地代理代码,然后你就可以像调用一个本地方法一样调用一个远程接口了。

在 eggjs 里面,我们约定这个客户端接口声明文件位于 ${app_root}/config/proxy.js

一个简单的配置

我们先看一个简单的配置(如下),它的基本含义是:我需要调用 sofarpc 应用暴露的 com.alipay.sofa.rpc.test.ProtoService 这个服务。

'use strict';

module.exports = {
  services: [{
    appName: 'sofarpc',
    api: {
      ProtoService: 'com.alipay.sofa.rpc.test.ProtoService',
    },
  }],
};

配置好以后(确保已经将接口定义文件 *.proto 放置到了 proto 目录下),我们运行 egg-rpc-generator 工具就可以生成服务的调用代理文件:${app_root}/app/proxy/ProxyService.js

$ egg-rpc-generator

[EggRpcGenerator] framework: /egg-rpc-demo/node_modules/egg, baseDir: /egg-rpc-demo
[ProtoRPCPlugin] found "com.alipay.sofa.rpc.test.ProtoService" in proto file
[ProtoRPCPlugin] save all proto info into "/egg-rpc-demo/run/proto.json"

完整的配置示例和详解

'use strict';

module.exports = {
  errorAsNull: false,
  responseTimeout: 3000,              
  services: [{
    appName: 'sofarpc',
    api: {
      ProtoService: {
        interfaceName: 'com.alipay.sofa.rpc.test.ProtoService',
        version: '1.0',
        group: 'SOFA',
        errorAsNull: true,
        responseTimeout: 5000,
        method: {
          echoObj: {
            responseTimeout: 10000,
          },
        },
      },
    },
  }],
};
  • errorAsNull (可选):是否将后台服务错误以 null 返回, 默认为 false,不处理,直接抛异常。该配置有两个层级,在根节点的是全局的,针对所有服务,下面的服务配置中可以覆盖全局配置
  • responseTimeout (可选):服务的超时间隔,如果超过则会抛 RpcSocketConnectTimeoutError 异常。该配置也有三个层级,在根节点的是全局的,针对所有服务,下面的服务和方法配置中可以覆盖全局配置
  • services(必选):RPC 依赖的服务列表,它是一个 Object 数组,每一个 item 代表一个服务提供者(应用)
    • appName(必选):RPC 服务提供者的应用名。这个为什么是必选参数,是为了方便我们在 egg 的配置文件 ${app_root}/config/config.{env}.js 中,按照应用维度进行配置
    • app.config['${appName}.rpc.service.enable']:为 true 时开启此服务,默认为 true
    • app.config['${appName}.rpc.service.url']:直接配置 rpc 服务的地址(硬负载)。
    • app.config['${appName}.rpc.service.timeout']:服务请求的超时时间(服务级别的),单位为 ms,默认为 3000 它的默认 responseTimeout 是 antx['${appname}.tr.service.timeout']:服务请求的超时时间,单位为 ms,默认为 5000
    • api(必选):服务列表(key-value),其中 key 为生成 proxy 文件的名字,value 是服务接口名(interfaceName)。如果需要进行更加细粒度的配置,value 也支持以下对象格式:
    • interfaceName(必选): 服务接口名
    • version (可选):服务的默认版本号,如:1.0.0、1.0.0.daily。如果不填,默认值是 1.0
    • group (可选):服务组别,默认是 SOFA
    • responseTimeout(可选):覆盖上面的全局配置
    • errorAsNull (可选:覆盖上面的全局配置
    • method(可选):方法级别配置(key-value 键值对),key 为方法名,value 是一个对象,结构如下:
      • responseTimeout(可选):覆盖上面的全局和服务配置

几个配置之间的优先级

上面配置中,我们看到好几次 responseTimeout 这个配置,如果都配了,它们的优先级是怎么样的呢?

  • 方法级别的优先级最高。下面 echoObj 方法超时时长为 10s
module.exports = {
  responseTimeout: 3000,              
  services: [{
    appName: 'sofarpc',
    api: {
      ProtoService: {
        interfaceName: 'com.alipay.sofa.rpc.test.ProtoService',
        responseTimeout: 5000,
        method: {
          echoObj: {
            responseTimeout: 10000,
          },
        },
      },
    },
  }],
};
  • egg 的配置文件 config/config.{env}.jsapp.config['${appName}.rpc.service.timeout'] 优先级次之
// ${app_root}/config/config.{env}.js
exports['sofarpc.rpc.service.timeout'] = 6000; // sofarpc 这个应用的rpc超时时长为 6s,覆盖上面的配置 5s
  • 服务级别的再次之(上面示例中的 5s)
  • 全局配置最低(上面示例中的 3s)