简介
在作为 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.0group
(可选):服务组别,默认是 SOFAresponseTimeout
(可选):覆盖上面的全局配置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}.js
里app.config['${appName}.rpc.service.timeout']
优先级次之
// ${app_root}/config/config.{env}.js
exports['sofarpc.rpc.service.timeout'] = 6000; // sofarpc 这个应用的rpc超时时长为 6s,覆盖上面的配置 5s
- 服务级别的再次之(上面示例中的 5s)
- 全局配置最低(上面示例中的 3s)