Skip to content

RAL扩展

hefangshi edited this page May 6, 2015 · 2 revisions

扩展API

node-ral 对请求协议、数据格式、负载均衡策略以及配置标准化的扩展都是通过面向对象继承基类来实现。node-ral 中所有的继承都是使用 nodeutil.inherit 进程继承。

RalModule

扩展的基类,请求协议、数据格式、负载均衡策略的基类均基于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 供具体的请求协议实现。

Protocol

扩展请求协议需要继承的基类,请求协议要求实现的函数有

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 函数是请求协议的核心实现,它要求直接返回一个 StreamEventEmiter,我们称其为 请求发起对象,同时 callback 也要求返回一个 StreamEventEmiter,我们称其为 数据接收对象

如果用户选用的数据格式是 isStreamify 数据,请求发起对象 会被 ral 框架 pipe 数据,如果用户选用的数据格式不是 isStreamify 数据,经过数据格式转换后的数据会通过 config.payload 传入。

数据接收对象 要求在接收到原始二进制数据后,不做任何处理,使用 me.emit('data', data) 将数据完整返回,传回给数据格式处理。并在请求结束后 me.emit('end') 通知 node-ral 框架请求结束。

Converter

用于扩展数据格式的打包与解包,数据格式需要实现的函数有

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 格式要求 packunpack 函数均返回 Stream, 功能是输入数据流,进行transform后输出数据流供请求协议使用。非 isStreamify 格式则是直接返回一个数据对象,无需使用 Stream

pack 函数是数据格式的打包函数,他会将用户传入的 data 打包为符合数据格式要求的对象,比如字符串、对象或者是二进制Buffer等等。

unpack 则是对数据格式的解包函数,他会将服务端返回数据解析为服务数据格式要求的对象。

Balance

用于扩展负载均衡策略,负载均衡策略需要实现的函数有

RoundRobinBalance.prototype.getName = function(){
    throw new Error('Not Implemented');
};

RoundRobinBalance.prototype.fetchServer = function(balanceContext){
    throw new Error('Not Implemented');
};

其中核心函数fetchServer 传入的参数 balanceContext.reqIDCServers 中存放的是在匹配过IDC后的服务端列表,这个函数要求反正列表中的其中一个 Server 作为后端服务使用。

ConfigNormalizer

用于扩展全局的配置规范化功能,并且可以提供定时更新的能力,可以用于实现基于服务发现协议的配置扩展。属于高阶功能,如果有使用需求可以提issue沟通。