yog-ral
Version:
node-ral with mcpack and nshead
101 lines (90 loc) • 3.09 kB
JavaScript
/*
* fis
* http://fis.baidu.com/
* 2014/8/20
*/
;
var ConfigNormalizer = require('node-ral').ConfigNormalizer;
var util = require('util');
var logger = require('node-ral').Logger('WebfootNormalizer');
var bns;
var webfootCache = {};
function lazyFetchFromWebfootCache(bnsName) {
bns = bns || require('@baidu/bns');
// 初期调用时使用同步获取服务器配置
if (bns.get_service_conf_async && webfootCache[bnsName]) {
bns.get_service_conf_async(bnsName).then(ret => {
logger.trace('cache updated by get_service_conf_async ' + bnsName);
webfootCache[bnsName] = ret;
}).catch(err => {
logger.warning("BNS " + bnsName + " aysnc update failed: " + err);
});
return webfootCache[bnsName];
}
var ret = bns.get_service_conf(bnsName);
if (ret.error === -1) {
throw new Error('bns fetch failed bns=' + bnsName);
}
webfootCache[bnsName] = ret;
return webfootCache[bnsName];
}
function WebfootNormalizer() {
ConfigNormalizer.call(this);
}
util.inherits(WebfootNormalizer, ConfigNormalizer);
WebfootNormalizer.prototype.normalizeConfig = function (config) {
if (!config.webfoot) {
return config;
}
var bnsConf = lazyFetchFromWebfootCache(config.webfoot);
if (!bnsConf) {
throw new Error('webfoot ' + config.webfoot + ' load failed');
}
bnsConf = JSON.parse(bnsConf);
if (bnsConf.error) {
throw new Error('webfoot ' + config.webfoot + ' load failed, error:' + bnsConf.error);
}
var conf = this._translate(config.webfoot, bnsConf);
var keys = Object.keys(config);
for (var i = 0; i < keys.length; i++) {
if (config[keys[i]] !== null) {
conf[keys[i]] = config[keys[i]];
}
}
logger.trace(config.webfoot + ' webfoot config is updated');
return conf;
};
WebfootNormalizer.prototype.getName = function () {
return 'webfoot';
};
WebfootNormalizer.prototype.needUpdate = function (config) {
if (config.webfoot) {
return true;
}
};
WebfootNormalizer.prototype._translate = function (webfootName, bnsConfig) {
var service = bnsConfig.services[webfootName];
if (!service) {
throw new Error('invalid webfoot info, webfoot: ' + webfootName);
}
var unpack = service.converter.name;
//webfoot兼容,只有mcpack2与json数据打包协议使用本协议进行解包,其余协议均使用string解包
if (['protobuf', 'msgpack', 'mcpack2', 'json'].indexOf(unpack) === -1) {
unpack = 'string';
}
var conf = {
unpack: unpack,
pack: service.converter.name,
balance: 'random',
protocol: service.protocol.name,
retry: parseInt(service.service_retry, 10) || 0,
timeout: service.service_ctimeout + service.service_rtimeout + service.service_wtimeout,
headers: service.Headers || {},
server: [{
bns: webfootName
}],
idc_map: service.idc_map
};
return conf;
};
module.exports = WebfootNormalizer;