-
Notifications
You must be signed in to change notification settings - Fork 36
配置系统
node-ral
的一大特色就是对后端服务配置的统一管理,它要求所有配置均在一个文件夹,在初始化过程中,node-ral
会加载整个文件夹中的所有 js
与 json
文件来读取服务配置。因此这个文件夹中必须只保存 node-ral
服务端配置,不能存放其他代码。
配置目录的路径可以在ral.init时指定
为了能够在一个文件中配置多个相关服务,node-ral
不会以文件名作为服务名,而是通过配置中显式指定
// 声明一个服务,其服务名为DEMO
module.export.DEMO = {
}
也可以使用 JSON
文件描述服务
{
"DEMO": {
}
}
node-ral
的配置是扁平化的,无论是通用配置还是请求协议配置,均在同一层级,通过名称区分,比如一个完整的HTTP服务声明会是如下所示
// config/ral/API.js
module.exports.MAPAPI= { // 声明服务名为MAPAPI
// 请求协议与数据格式配置
protocol: 'http', // 使用http协议请求
pack: 'querystring', // 数据封装为query
unpack: 'json', // 约定服务端返回JSON数据
encoding: 'utf-8', // 服务器返回utf-8编码
// 负载均衡与超时重试配置
balance: 'roundrobin', // 负载均衡策略
timeout: 500, // 请求最长超时时间500ms
retry: 1, // 请求重试次数
// HTTP协议特有配置
method: 'GET', // 使用GET请求
query: { // 服务的全局query
ak: '0C62f9f0ee027b6052dfa35b0f38b61a',
output: 'json',
page_size: 10,
page_num: 0,
scope: 1
},
path: '/place/v2/search', // API路径
headers: { // 服务的全局headers
'x-client': 'ral'
},
// 后端地址配置
server: [ // 可以配置多个后端地址
{
host: 'api.map.baidu.com',
port: 80
}
]
}
通过将环境变量YOG_ENV或RAL_ENV设置不同的值,可以使node-ral在加载配置文件夹时,会使用环境变量进行加载
举例来说
当 YOG_ENV=dev 时,在如下情况下,会加载 a.dev.js 与 b.js
- a.dev.js
- a.js
- b.js
当 YOG_ENV=prod 时,在如下情况下,只加载 a.js, b.js, c.prod.js
- a.dev.js
- a.js
- b.js
- c.prod.js
- d.dev.js
当 YOG_ENV=undefined 时,在如下情况下,只加载 a.js, b.js
- a.dev.js
- a.js
- b.js
- c.prod.js
- d.dev.js
此外,还存在一类特殊的配置 xxx.default.js ,这类配置仅在 xxx.js 配置不存在时生效。
环境变量的值不局限于 prod 与 dev,可以根据业务自身的规范决定名称
IDC配置用于服务分布式的部署在多个机房时,引导 node-ral
仅请求对应IDC的后端服务器
首先我们可以在 server
配置中添加服务器所属的IDC
module.exports.MAPAPI= {
// 请求协议与数据格式配置
protocol: 'http', // 使用http协议请求
pack: 'querystring', // 数据封装为query
unpack: 'json', // 约定服务端返回JSON数据
encoding: 'utf-8', // 服务器返回utf-8编码
// 负载均衡与超时重试配置
balance: 'roundrobin', // 负载均衡策略
method: 'GET',
// 后端地址配置
server: [ // 可以配置多个后端地址
{
host: 'jx.api.map.baidu.com',
port: 80,
idc: 'jx'
}, {
host: 'tc.api.map.baidu.com',
port: 80,
idc: 'tc'
}
]
}
当我们在配置目录中添加 idc.js
文件后,node-ral
会读取配置文件,获取当前机器的IDC配置。
// JX 机房部署idc.js
module.exports.idc = 'jx';
为了达到不同机房获取的 idc
配置不一样, 我们在 TC
机房就需要部署不一样的 idc.js
文件来与 JX
机房做出区分
// TC 机房部署idc.js
module.exports.idc = 'tc';
这样Node后端服务器在请求服务时,就只会向同机房的后端进行访问,避免跨机房延迟。
当没有指定当前运行环境的 idc
时, node-ral
会从所有服务器配置中随机抽取服务器进行请求。