-
Notifications
You must be signed in to change notification settings - Fork 36
RAL扩展
node-ral
对请求协议、数据格式、负载均衡策略以及配置标准化的扩展都是通过面向对象继承基类来实现。node-ral
中所有的继承都是使用 node
的 util.inherit
进程继承。
扩展的基类,请求协议、数据格式、负载均衡策略的基类均基于RalModule扩展而来。主要用于实现对扩展文件按分类进行加载和分发。
需要实现的接口有
RalModule.prototype.getName = function(){
throw new Error('Not Implemented');
};
RalModule.prototype.getCategory = function(){
throw new Error('Not Implemented');
};
以 protocol.js 为例,他对 RalModule
的实现部署是
var RalModule = require('./ralmodule.js');
function Procotol(){
RalModule.call(this);
}
util.inherits(Procotol, RalModule);
Procotol.prototype.getCategory = function(){
return 'protocol';
};
module.exports = Procotol;
由于 protocol.js 是请求协议的基类,因此还留下了 getName
供具体的请求协议实现。
扩展请求协议需要继承的基类,请求协议要求实现的函数有
Procotol.prototype.normalizeConfig = Procotol.normalizeConfig = function(context){
return context;
};
Procotol.prototype._request = function(config, callback){
throw new Error('Not Implemented');
};
Procotol.prototype.getName = function () {
throw new Error('Not Implemented');
};
其中 normalizeConfig
是可选实现,每次请求均会调用 normalizeConfig
对传入的配置进行规范化工作。
_request
函数是请求协议的核心实现,它要求直接返回一个 Stream
或 EventEmiter
,我们称其为 请求发起对象
,同时 callback
也要求返回一个 Stream
或 EventEmiter
,我们称其为 数据接收对象
。
如果用户选用的数据格式是 isStreamify
数据,请求发起对象
会被 ral
框架 pipe
数据,如果用户选用的数据格式不是 isStreamify
数据,经过数据格式转换后的数据会通过 config.payload
传入。
数据接收对象
要求在接收到原始二进制数据后,不做任何处理,使用 me.emit('data', data)
将数据完整返回,传回给数据格式处理。并在请求结束后 me.emit('end')
通知 node-ral
框架请求结束。
用于扩展数据格式的打包与解包,数据格式需要实现的函数有
Converter.prototype.pack = function(config, data){
throw new Error('Not Implemented');
};
Converter.prototype.unpack = function(config, data){
throw new Error('Not Implemented');
};
Converter.prototype.getCategory = function(){
return 'converter';
};
Converter.prototype.getName = function () {
throw new Error('Not Implemented');
};
Converter.prototype.isStreamify = false;
数据格式分为 isStreamify
格式和 非 isStreamify
格式,它们的区别在于 isStreamify
格式要求 pack
与 unpack
函数均返回 Stream
, 功能是输入数据流,进行transform后输出数据流供请求协议使用。非 isStreamify
格式则是直接返回一个数据对象,无需使用 Stream
。
pack
函数是数据格式的打包函数,他会将用户传入的 data
打包为符合数据格式要求的对象,比如字符串、对象或者是二进制Buffer等等。
unpack
则是对数据格式的解包函数,他会将服务端返回数据解析为服务数据格式要求的对象。
用于扩展负载均衡策略,负载均衡策略需要实现的函数有
RoundRobinBalance.prototype.getName = function(){
throw new Error('Not Implemented');
};
RoundRobinBalance.prototype.fetchServer = function(balanceContext){
throw new Error('Not Implemented');
};
其中核心函数fetchServer
传入的参数 balanceContext.reqIDCServers
中存放的是在匹配过IDC后的服务端列表,这个函数要求反正列表中的其中一个 Server
作为后端服务使用。
用于扩展全局的配置规范化功能,并且可以提供定时更新的能力,可以用于实现基于服务发现协议的配置扩展。属于高阶功能,如果有使用需求可以提issue沟通。