tars-node:RPC框架分析(stream(部分),registry订框,utils析苫,winston-tars,notify穿扳,logs衩侥,config,dyeing)

stream

TARS 框架的編解碼工具

結(jié)構(gòu)體的使用示例
我們演示結(jié)構(gòu)體在三個(gè)典型場(chǎng)景的使用方法:
第一種場(chǎng)景:當(dāng)結(jié)構(gòu)體用作RPC函數(shù)的參數(shù)時(shí)矛物。
由于rpc框架會(huì)自動(dòng)對(duì)參數(shù)進(jìn)行序列化茫死,所以我們無(wú)需關(guān)心編解碼,只需要按照普通的類一樣泽谨,先new后賦值璧榄,然后傳入?yún)?shù)直接調(diào)用RPC函數(shù)即可。
假如服務(wù)端有個(gè)RPC如下定義:

module TRom
{
  struct param {
    0 optional string sUserName;
    1 optional int iId;
  };
  interface process {
    int getUserLevel(Param userInfo, out int iLevel);
  };
};

安裝上述方法生成tars編解碼文件(生成文件名稱為:Protocol.js)之后吧雹,按照如下方法調(diào)用對(duì)端服務(wù)。

var Tars = require("@tars/rpc").client;
var TRom = require("./Protocol.js").TRom;

var prx = Tars.stringToProxy(TRom.NodeJsCommProxy, "TRom.NodeJsTestServer.NodeJsCommObj@tcp -h 10.12.22.13 -p 8080 -t 60000");

var usr = new TRom.Param();
usr.sUserName = "KevinTian";
usr.iId = 10000;

prx.getUserLevel(usr).then(function (result) {
  console.log("success:", result);
}, function (result) {
  console.log("error:", result);
}).done();

第二種場(chǎng)景:對(duì)端非標(biāo)準(zhǔn)rpc框架涂身,接受序列化的數(shù)據(jù)流作為參數(shù)雄卷。
在這種場(chǎng)景下需要我們隊(duì)結(jié)構(gòu)體進(jìn)行序列化。還是以上面的tars文件作為例子蛤售,一般的方法如下:

//  客戶端安裝如下方法進(jìn)行打包丁鹉,然后將打包后的二進(jìn)制數(shù)據(jù)發(fā)送到服務(wù)端
var Tars = require("@tars/stream");
var TRom = require("./Protocol.js").TRom;

var usr = new TRom.Param();
usr.sUserName = "KevinTian";
usr.iId = 10000;

var os = new Tars.OutputStream();
os.writeStruct(1, usr);

//  打包并得到發(fā)送的二進(jìn)制數(shù)據(jù)流
var toSendBuffer = os.getBinBuffer().toNodeBuffer();

客戶端將toSendBuffer發(fā)送給服務(wù)端,并且服務(wù)端接受完畢之后按如下方法進(jìn)行解碼:

var Tars = require("@tars/stream");
var TRom = require("./Protocol.js").TRom;

var is = new Tars.InputStream(new Tars.BinBuffer(toSendBuffer));
var usr = is.readStruct(1,true, TRom.Param);

console.log("TRom.Param.sUserName", usr.sUserName);
console.log("TRom.Param.iId", usr.iId);

第三種場(chǎng)景:對(duì)方服務(wù)要求數(shù)據(jù)流使用Tup協(xié)議悴能,并且已經(jīng)約定好了各個(gè)變量的名字揣钦。我們可以按如下的方法進(jìn)行編碼:

//  客戶端根據(jù)約定的名字,將結(jié)構(gòu)體放入Tup中
var Tars = require("@tars/stream");
var TRom = require("./Protocol.js").TRom;

var usr = new TRom.Param();
usr.sUserName = "KevinTian";
usr.iId = 10000;

var tup_encode = new Tars.Tup();
tup_encode.writeStruct("userInfo", usr);

//  打包并得到發(fā)送的二進(jìn)制數(shù)據(jù)流
var toSendBuffer = tup_encode.encode(true).toNodeBuffer();

客戶端將toSendBuffer發(fā)送給服務(wù)端漠酿,并且服務(wù)端接受完畢之后按如下方法進(jìn)行解碼:

var Tars = require("@tars/stream");
var TRom = require("./Protocol.js").TRom;

var tup_decode = new Tars.Tup();
tup_decode.decode(new Tars.BinBuffer(toSendBuffer));

var usr = tup_decode,readStruct("userInfo", TRom.Param);

console.log("TRom.Param.sUserName", usr.sUserName);
console.log("TRom.Param.iId", usr.iId);

06-復(fù)雜類型-vector(數(shù)組)的使用方法說(shuō)明

由于JavaScript原生的Array不支持tars中的一些特殊化操作冯凹,所以我們對(duì)它進(jìn)行了一次封裝。開(kāi)發(fā)者可以按下述的代碼理解:

[stream].List = function(proto) 
{
  this.proto = proto;
  this.value = new Array();
  this.push = function(value) { this.value.push(value) };
}
屬性 描述
value Js中的Array數(shù)據(jù)類型炒嘲。Tars.List實(shí)際是基于該Array進(jìn)行的上層封裝
length 返回?cái)?shù)組中元素的數(shù)目

[stream].List對(duì)象屬性

屬性 描述
value Js中的Array數(shù)據(jù)類型宇姚。Tars.List實(shí)際是基于該Array進(jìn)行的上層封裝
length 返回?cái)?shù)組中元素的數(shù)目
方法 描述
at 返回?cái)?shù)組中指定位置的元素。
push 向數(shù)組的末尾添加一個(gè)元素夫凸。
forEach 當(dāng)前數(shù)組的遍歷方法浑劳,具體使用方法請(qǐng)參考后面的示例。
toObject 將List實(shí)例轉(zhuǎn)化成基本的數(shù)據(jù)對(duì)象夭拌,具體使用方法請(qǐng)參考后面的實(shí)例魔熏。
readFromObject 將傳入的數(shù)組處理后push到List實(shí)例中衷咽,具體使用方法請(qǐng)參考后面的示例。

[stream].List對(duì)象方法

方法 描述
at 返回?cái)?shù)組中指定位置的元素蒜绽。
push 向數(shù)組的末尾添加一個(gè)元素镶骗。
forEach 當(dāng)前數(shù)組的遍歷方法,具體使用方法請(qǐng)參考后面的示例滓窍。
toObject 將List實(shí)例轉(zhuǎn)化成基本的數(shù)據(jù)對(duì)象卖词,具體使用方法請(qǐng)參考后面的實(shí)例。
readFromObject 將傳入的數(shù)組處理后push到List實(shí)例中吏夯,具體使用方法請(qǐng)參考后面的示例此蜈。

proto是Vector的類型原型(類型原型決定了在對(duì)Vector編解碼時(shí)采用的方法,所以聲明Vector的時(shí)候必須傳入正確的類型原型)噪生。
[stream].List的聲明示例

var Tars = require("@tars/stream");

//  例子1: 聲明vector<int32>
var va = new Tars.List(Tars.Int32);

//  例子2: 聲明vector<string>
var vb = new Tars.List(Tars.String);

//  例子2: 聲明vector<map<uint32, string>>
var vc = new Tars.List(Tars.Map(Tars.UInt32, Tars.String));

//  例子1: 聲明vector<struct>裆赵,假設(shè)結(jié)構(gòu)體名稱為T(mén)Rom.Param
var vd = new Tars.Vector(TRom.Param);

[stream].List的操作示例

var Tars = require("@tars/stream");
var ve = new Tars.List(Tars.String);

//  向數(shù)組添加元素
ve.push("TENCENT-MIG");
ve.push("TENCENT-SNG");
ve.push("TENCENT-IEG");
ve.push("TENCENT-TEG");

//  獲取數(shù)組的長(zhǎng)度
console.log("Length:", ve.length);

//  獲取指定位置的元素
console.log("Array[1]:", ve.at(1));

//  遍歷方法1:
ve.forEach(function (value, index, oArray) {
  console.log("Array[" + index + "]:", value);
});

//  遍歷方法2:
for (var index = 0, len = ve.length; index < len; index++) {
  console.log("Array[" + index + "]:", ve.at(index);
};

//  toObject方法和readFromObject方法的詳細(xì)例子可以參照sample/list路徑下的test-list-c3文件
var user1 = new TRom.User_t();
user1.id = 1;
user1.name = 'x1';
user1.score = 1;

var user2 = new TRom.User_t();
user2.id = 2;
user2.name = 'x2';
user2.score = 2;

var user3 = new TRom.User_t();
user3.id = 3;
user3.name = 'x3';
user3.score = 3;

var userList1 = new Tars.List(TRom.User_t);

console.log('user1: ', user1);
console.log('user2: ', user2);

userList1.push(user1);
userList1.push(user2);

//  toObject方法
console.log('userList1: ', userList1.toObject());

var userList2 = new Tars.List(TRom.User_t);
// readFromObject方法
userList2.readFromObject([user1, user2, user3]);
console.log('userList2: ', userList2.toObject());

07-復(fù)雜類型-map(字典)的使用方法說(shuō)明

由于JavaScript原生的Object不支持tars中的一些特殊化操作,所以我們對(duì)它進(jìn)行了一次封裝跺嗽。開(kāi)發(fā)者可按下述的代碼理解:

[stream].Map = function(kpoto, vpoto) {
  var Map = function() {
    this._kproto = kpoto;
    this._vproto = vpoto;
    this.value = new Object();
    this.put = function(key, value) { this.insert(key, value); }
    ......
  }
  return new Map();
}
屬性 描述
value Js中的Object數(shù)據(jù)類型战授。[stream],Map實(shí)際是基于該Object進(jìn)行的上層封裝。

[stream].Map對(duì)象屬性

屬性 描述
value Js中的Object數(shù)據(jù)類型桨嫁。[stream],Map實(shí)際是基于該Object進(jìn)行的上層封裝植兰。
方法 描述
insert 向字典中添加一個(gè)元素
set 同insert
put 同insert
remove 根據(jù)指定的key,從字典中刪除對(duì)應(yīng)的數(shù)值璃吧。
clear 清空當(dāng)前字典楣导。
has 根據(jù)指定的key,判斷字典中是否包含對(duì)應(yīng)的數(shù)值
size 返回當(dāng)前字典中元素的數(shù)目
forEach 當(dāng)前數(shù)組的遍歷方法畜挨,具體使用方法請(qǐng)參考后面的示例筒繁。
toObject 將Map實(shí)例轉(zhuǎn)化成基本的數(shù)據(jù)對(duì)象,具體方法請(qǐng)參考后面的示例巴元。
readFromObject 將傳入的對(duì)象處理后insert到Map實(shí)例中毡咏,具體使用方法參考后面的示例。

[stream].Map方法屬性

方法 描述
insert 向字典中添加一個(gè)元素
set 同insert
put 同insert
remove 根據(jù)指定的key逮刨,從字典中刪除對(duì)應(yīng)的數(shù)值呕缭。
clear 清空當(dāng)前字典。
has 根據(jù)指定的key禀忆,判斷字典中是否包含對(duì)應(yīng)的數(shù)值
size 返回當(dāng)前字典中元素的數(shù)目
forEach 當(dāng)前數(shù)組的遍歷方法臊旭,具體使用方法請(qǐng)參考后面的示例。
toObject 將Map實(shí)例轉(zhuǎn)化成基本的數(shù)據(jù)對(duì)象箩退,具體方法請(qǐng)參考后面的示例离熏。
readFromObject 將傳入的對(duì)象處理后insert到Map實(shí)例中,具體使用方法參考后面的示例戴涝。

[stream].Map的聲明示例

var Tars = require("@tars/stream");

//  例子1: 聲明map<int32, int32>
var ma = new Tars.Map(Tars.Int32, Tars.Int32);

//  例子2: 聲明map<int32, string>
var mb = new Tars.Map(Tars.Int32, Tars.String);

//  例子3: 聲明map<string, string>
var mc = new Tars.Map(Tars.String, Tars.String);

//  例子4: 聲明map<string, vector<int32>>
var md = new Tars.Map(Tars.String, Tars.List(Tars.Int32));

//  例子5: 聲明map<string, map<int32, vector<string>>>
var me = new Tars.Map(Tars.Int32, Tars.Map(Tars.Int32, Tars.List(Tars.String)));

//  例子6: 聲明map<string, struct>的方法滋戳,假設(shè)結(jié)構(gòu)體名稱為T(mén)Rom.Param
var mf = new Tars.Map(Tars.String, TRom.Param);

[stream].Map的操作示例

var Tars = require("@tars/stream");

var mc = new Tars.Map(Tars.String, Tars.String);

//  向字典中添加元素
mc.insert("KEY-00", "TENCENT-MIG");
mc.insert("KEY-01", "TENCENT-IEG");
mc.insert("KEY-02", "TENCENT-TEG");
mc.insert("KEY-03", "TENCENT-SNG");

//  獲取字典元素大小
console.log("SIZE:", mc.size());

//  判斷字典是否有指定的值
console.log("Has:", mc.has("KEY-04"));

//  字典遍歷
mc.forEach(function(key, value) {
  console.log("KEY:", key);
  console.log("VALUE:", value);
});

//  toObject方法和readFromObject方法的詳細(xì)例子可以參照sample/map路徑下的test-map-c5.js文件
var user1 = new TRom.User_t();
user1.id = 1;
user1.name = 'x1';
user1.score = 1;

var user2 = new TRom.User_t();
user2.id = 2;
user2.name = 'x2';
user2.score = 2;

var user3 = new TRom.User_t();
user3.id = 3;
user3.name = 'x3';
user3.score = 3;

var userMap1 = new Tars.Map(Tars.String, TRom.User_t);

userMap1.insert('user1', user1);
userMap1.insert('user2', user2);

//  toObject方法
console.log('userMap1: ', userMap1.toObject());

var userMap2 = new Tars.Map(Tars.String, TRom.User_t);
//  readFromObject方法
userMap2.readFromObject({
  'user1' : user1,
  'user2' : user2,
  'user3' : user3
});
console.log('userMap2: ', userMap2.toObject());

支持MultiMap類型
支持MultiMap類型钻蔑,此類型允許以一個(gè)結(jié)構(gòu)體作為Map的key。javascript原生對(duì)象沒(méi)有辦法表示此數(shù)據(jù)類型奸鸯,因此此類型沒(méi)有實(shí)現(xiàn)普通Map支持的toObject和readFromObject方法咪笑。
其操作實(shí)例如下:

//  構(gòu)造Map柯旭
var msg = new Tars.Map(Test.StatMicMsgHead, Test.StatMicMsgBody);
msg.put(StatMicMsgHead1, StatMicMsgBody1);
msg.put(StatMicMsgHead2, StatMicMsgBody2);

//  tars編碼
var os = new Tars.OutputStream();
os.writeMap(1, msg);

//  tars解碼
var data = os.getBinBuffer().toNodeBuffer();

var is = new Tars.InputStream(new Tars.BinBuffer(data));
var ta = is.readMap(1, true, Tars.Map(Test.StatMicMsgHead, Test.StatMicMsgBody));

//  遍歷Map結(jié)果集
ta.forEach(function (key, value) {
  console.log("KEY:", key.masterName, "VALUE.totalRspTime", value.totalRspTime);
});

//  根據(jù)值去獲取  
var tb = ta.get(StatMicMsgHead2);
if (tb == undefined) {
  console.log("not found by name: StatMicMsgHead2");
} else {
  console.log(tb.totalRspTime);
}

08-復(fù)雜類型-二進(jìn)制Buffer的使用方法說(shuō)明

在瀏覽器中我們可以使用DataView和ArrayBuffer來(lái)存儲(chǔ)和操作二進(jìn)制數(shù)據(jù)。NodeJS為了提升性能娄涩,自身提供了一個(gè)Buffer類窗怒。為了方便Tars編解碼,我們隊(duì)Buffer類進(jìn)行了一層封裝蓄拣。開(kāi)發(fā)者可以按下述的代碼來(lái)
理解扰肌。

[stream].BinBuffer = function (buffer) {
  this._buffer = (buffer != undefined && buffer instanceof Buffer) ? buffer : null;
  this._length = (buffer != undefined && buffer instanceof Buffer) ? buffer,length : 0; 
  this._capacity = this._length;
  this._position = 0;
}
屬性 描述
length 獲取該二進(jìn)制Buffer的數(shù)據(jù)長(zhǎng)度
capacity 獲取該二進(jìn)制Buffer在不重復(fù)分配內(nèi)存的情況下毕匀,可容納數(shù)據(jù)的最大長(zhǎng)度
position 獲取或者設(shè)置當(dāng)前二進(jìn)制Buffer的訪問(wèn)指針

[stream].BinBuffer對(duì)象屬性

屬性 描述
length 獲取該二進(jìn)制Buffer的數(shù)據(jù)長(zhǎng)度
capacity 獲取該二進(jìn)制Buffer在不重復(fù)分配內(nèi)存的情況下洁墙,可容納數(shù)據(jù)的最大長(zhǎng)度
position 獲取或者設(shè)置當(dāng)前二進(jìn)制Buffer的訪問(wèn)指針
參數(shù) 數(shù)據(jù)類型 描述
srcBuffer NodeJS.Buffer $1600
offset Unit32 表示拷貝srcBuffer的起始位置
byteLength Unit32 表示從offset開(kāi)始剿配,從srcBuffer中拷貝的數(shù)據(jù)量

length和capacity的區(qū)別:
加入我們向BinBuffer中寫(xiě)入一個(gè)int32類型的數(shù)據(jù)。寫(xiě)成功之后咽斧,length和capacity的區(qū)別:由于BinBuffer類在第一次分配時(shí)使用默認(rèn)的512長(zhǎng)度來(lái)申請(qǐng)內(nèi)存堪置,此時(shí)capacity的值為512。length表示當(dāng)前Buffer中存在真實(shí)數(shù)據(jù)的大小张惹,此時(shí)length的值為4
[stream].BinBuffer方法屬性
toNodeBuffer
函數(shù)定義:[stream].BinBuffer.toNodeBuffer()
函數(shù)作用:返回當(dāng)前二進(jìn)制Buffer的數(shù)據(jù)舀锨,該值為深拷貝的類型NodeJS.Buffer的數(shù)據(jù)
輸入?yún)?shù):無(wú)
返回?cái)?shù)據(jù):NodeJS.Buffer類型
print
函數(shù)定義:[stream].BinBuffer.print()
函數(shù)作用:以每行16個(gè)字節(jié),并16進(jìn)制的方式打印當(dāng)前的Buffer
writeNodeBuffer
函數(shù)定義:[stream],BinBuffer.writeNodeBuffer(srcBuffer, offset, byteLength)
函數(shù)作用:向二進(jìn)制Buffer中寫(xiě)入NodeJS.Buffer類數(shù)據(jù)
輸入?yún)?shù):

參數(shù) 數(shù)據(jù)類型 描述
srcBuffer NodeJS.Buffer $1600
offset Unit32 表示拷貝srcBuffer的起始位置
byteLength Unit32 表示從offset開(kāi)始宛逗,從srcBuffer中拷貝的數(shù)據(jù)量
參數(shù) 數(shù)據(jù)類型 描述
value [stream].BinBuffer 表示二進(jìn)制Buffer

函數(shù)說(shuō)明:
[1]當(dāng)前BinBuffer的length = length(原Buffer數(shù)據(jù)長(zhǎng)度) + byteLength
[2]當(dāng)前BinBuffer的position = position(原Buffer的位置指針) + byteLength
writeBinBuffer
函數(shù)定義:[stream].BinBuffer.writeBinBuffer(value)
函數(shù)作用:向二進(jìn)制Buffer中寫(xiě)入[stream].BinBuffer類數(shù)據(jù)
輸入?yún)?shù):

參數(shù) 數(shù)據(jù)類型 描述
value [stream].BinBuffer 表示二進(jìn)制Buffer
參數(shù) 數(shù)據(jù)類型 描述
value Int8 8位的整型數(shù)據(jù)

函數(shù)說(shuō)明:
[1]當(dāng)前BinBuffer的length = length(原Buffer數(shù)據(jù)長(zhǎng)度) + value.length
[2]當(dāng)前BinBuffer的position = position(原Buffer的位置指針) + value.length
writeInt8
函數(shù)定義:[stream],BinBuffer.writeInt8(value)
函數(shù)作用:向二進(jìn)制Buffer中寫(xiě)入Int8類數(shù)據(jù)
輸入?yún)?shù):

參數(shù) 數(shù)據(jù)類型 描述
value Int8 8位的整型數(shù)據(jù)
參數(shù) 數(shù)據(jù)類型 描述
value Int16 16位的整型數(shù)據(jù)

函數(shù)說(shuō)明:
[1]當(dāng)前BinBuffer的 length = length(原Buffer數(shù)據(jù)長(zhǎng)度) + 1
[2]當(dāng)前BinBuffer的 position = position(原Buffer的位置指針) + 1
writeInt16
函數(shù)定義:[stream],BinBuffer.writeInt16(value)
函數(shù)作用:向二進(jìn)制Buffer中寫(xiě)入Int16類數(shù)據(jù)
輸入?yún)?shù):

參數(shù) 數(shù)據(jù)類型 描述
value Int16 16位的整型數(shù)據(jù)
參數(shù) 數(shù)據(jù)類型 描述
value Int32 32位的整型數(shù)據(jù)

函數(shù)說(shuō)明:
[1]當(dāng)前BinBuffer的 length = length(原Buffer數(shù)據(jù)長(zhǎng)度) + 2
[2]當(dāng)前BinBuffer的 position = position(原Buffer的位置指針) + 2
[3]數(shù)據(jù)存儲(chǔ)采用網(wǎng)絡(luò)字節(jié)序
writeInt32
函數(shù)定義:[stream],BinBuffer.writeInt32(value)
函數(shù)作用:向二進(jìn)制Buffer中寫(xiě)入Int32類數(shù)據(jù)
輸入?yún)?shù):

參數(shù) 數(shù)據(jù)類型 描述
value Int32 32位的整型數(shù)據(jù)
參數(shù) 數(shù)據(jù)類型 描述
value Int64 64位的整型數(shù)據(jù)

函數(shù)說(shuō)明:
[1]當(dāng)前BinBuffer的 length = length(原Buffer數(shù)據(jù)長(zhǎng)度) + 4
[2]當(dāng)前BinBuffer的 position = position(原Buffer的位置指針) + 4
[3]數(shù)據(jù)存儲(chǔ)采用網(wǎng)絡(luò)字節(jié)序
writeInt64
函數(shù)定義:[stream],BinBuffer.writeInt64(value)
函數(shù)作用:向二進(jìn)制Buffer中寫(xiě)入Int64類數(shù)據(jù)
輸入?yún)?shù):

參數(shù) 數(shù)據(jù)類型 描述
value Int64 64位的整型數(shù)據(jù)
參數(shù) 數(shù)據(jù)類型 描述
value UInt8 8位的整型數(shù)據(jù)

函數(shù)說(shuō)明:
[1]當(dāng)前BinBuffer的 length = length(原Buffer數(shù)據(jù)長(zhǎng)度) + 8
[2]當(dāng)前BinBuffer的 position = position(原Buffer的位置指針) + 8
[3]數(shù)據(jù)存儲(chǔ)采用網(wǎng)絡(luò)字節(jié)序
writeUInt8
函數(shù)定義:[stream].BinBuffer.writeUInt8(value)
函數(shù)作用:向二進(jìn)制Buffer中寫(xiě)入U(xiǎn)Int8類數(shù)據(jù)
輸入?yún)?shù):

參數(shù) 數(shù)據(jù)類型 描述
value UInt8 8位的整型數(shù)據(jù)
參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示該變量的數(shù)字標(biāo)識(shí)雁竞,取值范圍[0, 255]
value UInt16(Number) 表示該變量的值,取值范圍[0, 65535]

函數(shù)說(shuō)明:
[1]當(dāng)前BinBuffer的 length = length(原Buffer數(shù)據(jù)長(zhǎng)度) + 1
[2]當(dāng)前BinBuffer的 position = position(原Buffer的位置指針) + 1
writeUInt16
函數(shù)定義:[stream].OutputStream.writeUInt16(tag, value)
函數(shù)作用:向數(shù)據(jù)流寫(xiě)入一個(gè)UInt16類型的變量
輸入?yún)?shù):

參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示該變量的數(shù)字標(biāo)識(shí)拧额,取值范圍[0, 255]
value UInt16(Number) 表示該變量的值,取值范圍[0, 65535]
參數(shù) 數(shù)據(jù)類型 描述
value UInt32 32位的整型數(shù)據(jù)

返回?cái)?shù)據(jù):void
writeUInt32
函數(shù)定義:[stream].BinBuffer.writeUInt32(value)
函數(shù)作用:向二進(jìn)制Buffer中寫(xiě)入一個(gè)UInt32類型的變量
輸入?yún)?shù):

參數(shù) 數(shù)據(jù)類型 描述
value UInt32 32位的整型數(shù)據(jù)
參數(shù) 數(shù)據(jù)類型 描述
value Float 32位的單精度浮點(diǎn)數(shù)

函數(shù)說(shuō)明:
[1]當(dāng)前BinBuffer的 length = length(原Buffer數(shù)據(jù)長(zhǎng)度) + 4
[2]當(dāng)前BinBuffer的 position = position(原Buffer的位置指針) + 4
[3]數(shù)據(jù)存儲(chǔ)采用網(wǎng)絡(luò)字節(jié)序
writeFloat
函數(shù)定義:[stream].BinBuffer.writeFloat(value)
函數(shù)作用:向二進(jìn)制Buffer中寫(xiě)入Float(32位彪腔,單精度浮點(diǎn)數(shù))類數(shù)據(jù)
輸入?yún)?shù):

參數(shù) 數(shù)據(jù)類型 描述
value Float 32位的單精度浮點(diǎn)數(shù)
參數(shù) 數(shù)據(jù)類型 描述
value Double 64位的雙精度浮點(diǎn)數(shù)

函數(shù)說(shuō)明:
[1]當(dāng)前BinBuffer的 length = length(原Buffer數(shù)據(jù)長(zhǎng)度) + 4
[2]當(dāng)前BinBuffer的 position = position(原Buffer的位置指針) + 4
[3]數(shù)據(jù)存儲(chǔ)采用網(wǎng)絡(luò)字節(jié)序
writeDouble
函數(shù)定義:[stream].BinBuffer.writeDouble( value)
函數(shù)作用:向二進(jìn)制Buffer中寫(xiě)入Double(64位侥锦,雙精度浮點(diǎn)數(shù))類數(shù)據(jù)
輸入?yún)?shù):

參數(shù) 數(shù)據(jù)類型 描述
value Double 64位的雙精度浮點(diǎn)數(shù)
參數(shù) 數(shù)據(jù)類型 描述
value String UTF8編碼的字符串

函數(shù)說(shuō)明:
[1]當(dāng)前BinBuffer的 length = length(原Buffer數(shù)據(jù)長(zhǎng)度) + 8
[2]當(dāng)前BinBuffer的 position = position(原Buffer的位置指針) + 8
[3]數(shù)據(jù)存儲(chǔ)采用網(wǎng)絡(luò)字節(jié)序
writeString
函數(shù)定義:[stream].BinBuffer.writeString(value)
函數(shù)作用:向二進(jìn)制Buffer中寫(xiě)入String(UTF8編碼)類數(shù)據(jù)
輸入?yún)?shù):

參數(shù) 數(shù)據(jù)類型 描述
value String UTF8編碼的字符串
參數(shù) 數(shù)據(jù)類型 描述
byteLength UInt32 字符串的字節(jié)長(zhǎng)度

函數(shù)說(shuō)明:
[1]當(dāng)前BinBuffer的 length = length(原Buffer數(shù)據(jù)長(zhǎng)度) + 字符串的字節(jié)長(zhǎng)度
[2]當(dāng)前BinBuffer的 position = position(原Buffer的位置指針) + 字符串的字節(jié)長(zhǎng)度
readInt8
函數(shù)定義:[stream].BinBuffer.readInt8()
函數(shù)作用:從二進(jìn)制Buffer中,根據(jù)當(dāng)前數(shù)據(jù)指針讀取一個(gè)Int8類型的變量
輸入?yún)?shù):無(wú)
函數(shù)說(shuō)明:
[1]當(dāng)前BinBuffer的 position = position(原Buffer的位置指針) + 1
readInt16
函數(shù)定義:[stream].BinBuffer.readInt16()
函數(shù)作用:從二進(jìn)制Buffer中德挣,根據(jù)當(dāng)前數(shù)據(jù)指針讀取一個(gè)Int16類型的變量
輸入?yún)?shù):無(wú)
函數(shù)說(shuō)明:
[1]當(dāng)前BinBuffer的 position = position(原Buffer的位置指針) + 2
readInt32
函數(shù)定義:[stream].BinBuffer.readInt32()
函數(shù)作用:從二進(jìn)制Buffer中恭垦,根據(jù)當(dāng)前數(shù)據(jù)指針讀取一個(gè)Int32類型的變量
輸入?yún)?shù):無(wú)
函數(shù)說(shuō)明:
[1]當(dāng)前BinBuffer的 position = position(原Buffer的位置指針) + 4
readInt64
函數(shù)定義:[stream].BinBuffer.readInt64()
函數(shù)作用:從二進(jìn)制Buffer中,根據(jù)當(dāng)前數(shù)據(jù)指針讀取一個(gè)Int64類型的變量
輸入?yún)?shù):無(wú)
函數(shù)說(shuō)明:
[1]當(dāng)前BinBuffer的 position = position(原Buffer的位置指針) + 8
readUInt8
函數(shù)定義:[stream].BinBuffer.readUInt8()
函數(shù)作用:從二進(jìn)制Buffer中格嗅,根據(jù)當(dāng)前數(shù)據(jù)指針讀取一個(gè)readUInt8類型的變量
輸入?yún)?shù):無(wú)
函數(shù)說(shuō)明:
[1]當(dāng)前BinBuffer的 position = position(原Buffer的位置指針) + 1
readUInt16
函數(shù)定義:[stream].BinBuffer.readUInt16()
函數(shù)作用:從二進(jìn)制Buffer中番挺,根據(jù)當(dāng)前數(shù)據(jù)指針讀取一個(gè)readUInt16類型的變量
輸入?yún)?shù):無(wú)
函數(shù)說(shuō)明:
[1]當(dāng)前BinBuffer的 position = position(原Buffer的位置指針) + 2
readUInt32
函數(shù)定義:[stream].BinBuffer.readUInt32()
函數(shù)作用:從二進(jìn)制Buffer中,根據(jù)當(dāng)前數(shù)據(jù)指針讀取一個(gè)readUInt32類型的變量
輸入?yún)?shù):無(wú)
函數(shù)說(shuō)明:
[1]當(dāng)前BinBuffer的 position = position(原Buffer的位置指針) + 4
readFloat
函數(shù)定義:[stream].BinBuffer.readFloat()
函數(shù)作用:從二進(jìn)制Buffer中屯掖,根據(jù)當(dāng)前數(shù)據(jù)指針讀取一個(gè)Float(32位的單精度浮點(diǎn)數(shù))類型的變量
輸入?yún)?shù):無(wú)
函數(shù)說(shuō)明:
[1]當(dāng)前BinBuffer的 position = position(原Buffer的位置指針) + 4
readDouble
函數(shù)定義:[stream].BinBuffer.readDouble()
函數(shù)作用:從二進(jìn)制Buffer中玄柏,根據(jù)當(dāng)前數(shù)據(jù)指針讀取一個(gè)Double(64位的雙精度浮點(diǎn)數(shù))類型的變量
輸入?yún)?shù):無(wú)
函數(shù)說(shuō)明:
[1]當(dāng)前BinBuffer的 position = position(原Buffer的位置指針) + 8
readString
函數(shù)定義:[stream].BinBuffer.readString(byteLength)
函數(shù)作用:從二進(jìn)制Buffer中,根據(jù)當(dāng)前數(shù)據(jù)指針讀取一個(gè)String(UTF8編碼)類型的變量
輸入?yún)?shù):

參數(shù) 數(shù)據(jù)類型 描述
byteLength UInt32 字符串的字節(jié)長(zhǎng)度
參數(shù) 數(shù)據(jù)類型 描述
byteLength UInt32 二進(jìn)制Buffer的字節(jié)長(zhǎng)度

函數(shù)說(shuō)明:
[1]當(dāng)前BinBuffer的 position = position(原Buffer的位置指針) + 字符串的字節(jié)長(zhǎng)度
[2]后臺(tái)對(duì)字符串的編碼需要使用UTF8字符集
readBinBuffer
函數(shù)定義:[stream].BinBuffer.readBinBuffer(byteLength)
函數(shù)作用:從二進(jìn)制Buffer中贴铜,根據(jù)當(dāng)前數(shù)據(jù)指針讀取一個(gè)[stream].BinBuffer類型的變量
輸入?yún)?shù):

參數(shù) 數(shù)據(jù)類型 描述
byteLength UInt32 二進(jìn)制Buffer的字節(jié)長(zhǎng)度
參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示該變量的數(shù)字標(biāo)識(shí)粪摘,取值范圍[0, 255]
value Boolean 表示該變量的值瀑晒,取值范圍[false, true]

函數(shù)說(shuō)明:
[1]當(dāng)前BinBuffer的 position = position(原Buffer的位置指針) + 二進(jìn)制Buffer的字節(jié)長(zhǎng)度
09 - 編碼工具 - OutputStream的使用方法說(shuō)明
構(gòu)造函數(shù)
函數(shù)定義:[stream].OutputStream()
函數(shù)作用:聲明一個(gè)輸出流對(duì)象
輸入?yún)?shù):無(wú)
使用示例:var os = new [stream].OutputStream()
getBinBuffer
函數(shù)定義:var buffer = [stream].OutputStream.getBinBuffer()
函數(shù)作用:調(diào)用該函數(shù)獲得打包后的二進(jìn)制數(shù)據(jù)
輸入?yún)?shù):無(wú)
返回?cái)?shù)據(jù):返回打包后的二進(jìn)制數(shù)據(jù)流,該返回值類型為[stream].BinBuffer
writeBoolean
函數(shù)定義:[stream].OutputStream.writeBoolean(tag, value)
函數(shù)作用:向數(shù)據(jù)流中寫(xiě)一個(gè)Boolean類型的變量
輸入?yún)?shù):

參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示該變量的數(shù)字標(biāo)識(shí)徘意,取值范圍[0, 255]
value Boolean 表示該變量的值苔悦,取值范圍[false, true]
參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示該變量的數(shù)字標(biāo)識(shí),取值范圍[0, 255]
value Int8(Number) 表示該變量的值椎咧,取值范圍[-128, 127]

返回?cái)?shù)據(jù):void
writeInt8
函數(shù)定義:[stream].OutputStream.writeInt8(value)
函數(shù)作用:向數(shù)據(jù)流中寫(xiě)入Int8類型的數(shù)據(jù)
輸入?yún)?shù):

參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示該變量的數(shù)字標(biāo)識(shí)玖详,取值范圍[0, 255]
value Int8(Number) 表示該變量的值,取值范圍[-128, 127]
參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示該變量的數(shù)字標(biāo)識(shí)勤讽,取值范圍[0, 255]
value Int16(Number) 表示該變量的值蟋座,取值范圍[-32768, 32767]

返回?cái)?shù)據(jù):void
writeInt16
函數(shù)定義:[stream].OutputStream.writeInt16(tag, value)
函數(shù)作用:向數(shù)據(jù)流中寫(xiě)入Int16類型的變量
輸入?yún)?shù):

參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示該變量的數(shù)字標(biāo)識(shí),取值范圍[0, 255]
value Int16(Number) 表示該變量的值地技,取值范圍[-32768, 32767]
參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示該變量的數(shù)字標(biāo)識(shí)蜈七,取值范圍[0, 255]
value Int32(Number) 表示該變量的值,取值范圍[-2147483648, 2147483647]

返回?cái)?shù)據(jù):void
writeInt32
函數(shù)定義:[stream].OutputStream.writeInt32(tag, value)
函數(shù)作用:向數(shù)據(jù)流中寫(xiě)一個(gè)Int32類型的變量
輸入?yún)?shù):

參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示該變量的數(shù)字標(biāo)識(shí)莫矗,取值范圍[0, 255]
value Int32(Number) 表示該變量的值飒硅,取值范圍[-2147483648, 2147483647]
參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示該變量的數(shù)字標(biāo)識(shí),取值范圍[0, 255]
value int64(Number) 表示該變量的值作谚,取值范圍[-9223372036854775808, 9223372036854775807]

writeInt64
函數(shù)定義:[stream].OutputStream.writeInt64(tag, value)
函數(shù)作用:向數(shù)據(jù)流中寫(xiě)一個(gè)Int64類型的變量
輸入?yún)?shù):

參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示該變量的數(shù)字標(biāo)識(shí)三娩,取值范圍[0, 255]
value int64(Number) 表示該變量的值,取值范圍[-9223372036854775808, 9223372036854775807]
參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示該變量的數(shù)字標(biāo)識(shí)妹懒,取值范圍[0, 255]
value UInt8(Number) 表示該變量的值雀监,取值范圍[0, 255]

返回?cái)?shù)據(jù):void
writeUInt8
函數(shù)定義:[stream].OutputStream.writeUInt8(tag, value)
函數(shù)作用:向數(shù)據(jù)流寫(xiě)入一個(gè)UInt8類型的變量
輸入?yún)?shù):

參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示該變量的數(shù)字標(biāo)識(shí),取值范圍[0, 255]
value UInt8(Number) 表示該變量的值眨唬,取值范圍[0, 255]
參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示該變量的數(shù)字標(biāo)識(shí)会前,取值范圍[0, 255]
value UInt16(Number) 表示該變量的值,取值范圍[0, 65535]

返回?cái)?shù)據(jù):void
writeUInt16
函數(shù)定義:[stream].OutputStream.writeUInt16(tag, value)
函數(shù)作用:向數(shù)據(jù)流寫(xiě)入一個(gè)UInt16類型的變量
輸入?yún)?shù):

參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示該變量的數(shù)字標(biāo)識(shí)匾竿,取值范圍[0, 255]
value UInt16(Number) 表示該變量的值瓦宜,取值范圍[0, 65535]
參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示該變量的數(shù)字標(biāo)識(shí),取值范圍[0, 255]
value UInt32(Number) 表示該變量的值岭妖,取值范圍[0, 4294967295]

返回?cái)?shù)據(jù):void
writeUInt32
函數(shù)定義:[stream].OutputStream.writeUInt32(tag, value)
函數(shù)作用:向數(shù)據(jù)流寫(xiě)入一個(gè)UInt32類型的變量
輸入?yún)?shù):

參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示該變量的數(shù)字標(biāo)識(shí)临庇,取值范圍[0, 255]
value UInt32(Number) 表示該變量的值,取值范圍[0, 4294967295]
參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示該變量的數(shù)字標(biāo)識(shí)昵慌,取值范圍[0, 255]
value Float(Number) 單精度浮點(diǎn)數(shù)假夺,因?yàn)榫热笔?wèn)題,不推薦使用該類型

返回?cái)?shù)據(jù):void
writeFloat
函數(shù)定義:[stream].OutputStream.writeFloat(tag, value)
函數(shù)作用:向數(shù)據(jù)流中寫(xiě)入一個(gè)float(32位)類型的變量
輸入?yún)?shù):

參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示該變量的數(shù)字標(biāo)識(shí)斋攀,取值范圍[0, 255]
value Float(Number) 單精度浮點(diǎn)數(shù)已卷,因?yàn)榫热笔?wèn)題,不推薦使用該類型
參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示該變量的數(shù)字標(biāo)識(shí)蜻韭,取值范圍[0, 255]
value Double(Number) 雙精度浮點(diǎn)數(shù)悼尾,因?yàn)榫葥p失問(wèn)題柿扣,不推薦使用該類型

返回?cái)?shù)據(jù):void
writeDouble
函數(shù)定義:[stream].OutputStream.writeDouble(tag, value)
函數(shù)作用:向數(shù)據(jù)流中寫(xiě)一個(gè)double(64位)類型的變量
輸入?yún)?shù):

參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示該變量的數(shù)字標(biāo)識(shí),取值范圍[0, 255]
value Double(Number) 雙精度浮點(diǎn)數(shù)闺魏,因?yàn)榫葥p失問(wèn)題未状,不推薦使用該類型
參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示該變量的數(shù)字標(biāo)識(shí),取值范圍[0, 255]
value String 表示該變量的值析桥,字符串編碼字符集為UTF8

返回?cái)?shù)據(jù):void
writeString
函數(shù)定義:[stream].OutputStream.writeString(tag, value)
函數(shù)作用:向數(shù)據(jù)流中寫(xiě)入一個(gè)String類型的變量
輸入?yún)?shù):

參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示該變量的數(shù)字標(biāo)識(shí)司草,取值范圍[0, 255]
value String 表示該變量的值,字符串編碼字符集為UTF8
參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示該變量的數(shù)字標(biāo)識(shí)泡仗,取值范圍[0, 255]
value 自定義結(jié)構(gòu)體 結(jié)構(gòu)體必須是使用tars2node轉(zhuǎn)換而成的埋虹,否則可能會(huì)因缺少輔助函數(shù)而導(dǎo)致編解碼失敗

返回?cái)?shù)據(jù):void
writeStruct
函數(shù)定義:writeStruct(tag, value)
函數(shù)作用:向數(shù)據(jù)流中寫(xiě)一個(gè)自定義結(jié)構(gòu)體的變量
輸入?yún)?shù):

參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示該變量的數(shù)字標(biāo)識(shí),取值范圍[0, 255]
value 自定義結(jié)構(gòu)體 結(jié)構(gòu)體必須是使用tars2node轉(zhuǎn)換而成的娩怎,否則可能會(huì)因缺少輔助函數(shù)而導(dǎo)致編解碼失敗
參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示該變量的數(shù)字標(biāo)識(shí)搔课,取值范圍[0, 255]
value [stream]. BinBuffer BinBuffer是對(duì)NodeJs中的Buffer類的封裝,同時(shí)集成了編碼解碼需要用到的輔助函數(shù)

返回?cái)?shù)據(jù):void
writeBytes
函數(shù)定義:[stream].OutputStream.writeBytes(tag, value)
函數(shù)作用:向數(shù)據(jù)流中寫(xiě)入一個(gè)char*或者vector<char>的變量
輸入?yún)?shù):

參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示該變量的數(shù)字標(biāo)識(shí)截亦,取值范圍[0, 255]
value [stream]. BinBuffer BinBuffer是對(duì)NodeJs中的Buffer類的封裝爬泥,同時(shí)集成了編碼解碼需要用到的輔助函數(shù)
參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示該變量的數(shù)字標(biāo)識(shí),取值范圍[0, 255]
value [stream].List(T) 該變量的類型原型

返回?cái)?shù)據(jù):void
writeList
函數(shù)定義:[stream].OutputStream.writeList(tag, value)
函數(shù)作用:向數(shù)據(jù)流中寫(xiě)一個(gè)類型為vector<T>(T不可為byte)的變量
函數(shù)參數(shù):

參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示該變量的數(shù)字標(biāo)識(shí)崩瓤,取值范圍[0, 255]
value [stream].List(T) 該變量的類型原型
參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示該變量的數(shù)字標(biāo)識(shí)袍啡,取值范圍[0, 255]
value [stream].Map(T, V) 該變量的類型原型

返回?cái)?shù)據(jù):void
writeMap
函數(shù)定義:[stream].OutputStream.writeMap(tag, value)
函數(shù)作用:向數(shù)據(jù)流中寫(xiě)一個(gè)類型為map<T, V>類型的字段。
函數(shù)參數(shù):

參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示該變量的數(shù)字標(biāo)識(shí)却桶,取值范圍[0, 255]
value [stream].Map(T, V) 該變量的類型原型

返回?cái)?shù)據(jù):void

10-解碼工具-InputStream的使用方法說(shuō)明

參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示欲取變量的數(shù)字標(biāo)識(shí)境输,取值范圍[0, 255]
require Boolean 表示當(dāng)前變量是否為必須值,取值范圍{false, true}
default Boolean 表示讀取變量不成功時(shí)的返回值颖系,取值范圍{false, true}

構(gòu)造函數(shù)
函數(shù)定義:[stream].InputStream(binBuffer)
函數(shù)作用:聲明一個(gè)輸入流對(duì)象
輸入?yún)?shù):binBuffer欲解碼的二進(jìn)制數(shù)據(jù)流嗅剖,該值類型必須為[stream].BinBuffer,而不能是NodeJs中實(shí)現(xiàn)的Buffer類嘁扼。
使用示例: var is = new [stream].InputStream(new [stream].BinBuffer(Node.Buffer))
readBoolean
函數(shù)定義:var value = [stream].InputStream.readBoolean(tag, require, default)
函數(shù)作用:從數(shù)據(jù)流讀取一個(gè)Boolean類型的數(shù)值
輸入?yún)?shù):

參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示欲取變量的數(shù)字標(biāo)識(shí)窗悯,取值范圍[0, 255]
require Boolean 表示當(dāng)前變量是否為必須值,取值范圍{false, true}
default Boolean 表示讀取變量不成功時(shí)的返回值偷拔,取值范圍{false, true}
參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示欲取變量的數(shù)字標(biāo)識(shí),取值范圍[0, 255]
require Boolean 表示當(dāng)前變量是否為必須值亏钩,取值范圍{false, true}
default Int8 表示讀取變量不成功時(shí)的返回值莲绰,取值范圍[-128, 127]

對(duì)require的說(shuō)明:
當(dāng) require === true 時(shí),如果當(dāng)前變量不在數(shù)據(jù)流中姑丑,系統(tǒng)將拋出一個(gè)讀取數(shù)據(jù)不存在的異常蛤签;
當(dāng) require === false 時(shí),如果當(dāng)前變量不在數(shù)據(jù)流中栅哀,系統(tǒng)將返回變量的默認(rèn)值default震肮;
返回?cái)?shù)據(jù):Boolean称龙,取值范圍{false, true}
readInt8
函數(shù)定義:[stream].InputStream.readInt8(tag, require, default)
函數(shù)作用:從數(shù)據(jù)流讀取一個(gè)Int8類型的數(shù)值
輸入?yún)?shù):

參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示欲取變量的數(shù)字標(biāo)識(shí),取值范圍[0, 255]
require Boolean 表示當(dāng)前變量是否為必須值戳晌,取值范圍{false, true}
default Int8 表示讀取變量不成功時(shí)的返回值鲫尊,取值范圍[-128, 127]
參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示欲取變量的數(shù)字標(biāo)識(shí),取值范圍[0, 255]
require Boolean 表示當(dāng)前變量是否為必須值沦偎,取值范圍{false, true}
default Int16 表示讀取變量不成功時(shí)的返回值疫向,取值范圍[-32768, 32767]

對(duì)require的說(shuō)明:
當(dāng) require === true 時(shí),如果當(dāng)前變量不在數(shù)據(jù)流中豪嚎,系統(tǒng)將拋出一個(gè)讀取數(shù)據(jù)不存在的異常搔驼;
當(dāng) require === false 時(shí),如果當(dāng)前變量不在數(shù)據(jù)流中侈询,系統(tǒng)將返回變量的默認(rèn)值default舌涨;
返回?cái)?shù)據(jù):Int8,取值范圍[-128, 127]
readInt16
函數(shù)定義:[stream].InputStream.readInt16(tag, require, default)
函數(shù)作用:從數(shù)據(jù)流讀取一個(gè)Int16類型的數(shù)值
輸入?yún)?shù):

參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示欲取變量的數(shù)字標(biāo)識(shí)扔字,取值范圍[0, 255]
require Boolean 表示當(dāng)前變量是否為必須值囊嘉,取值范圍{false, true}
default Int16 表示讀取變量不成功時(shí)的返回值,取值范圍[-32768, 32767]
參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示欲取變量的數(shù)字標(biāo)識(shí)啦租,取值范圍[0, 255]
require Boolean 表示當(dāng)前變量是否為必須值哗伯,取值范圍{false, true}
default Int32 表示讀取變量不成功時(shí)的返回值,取值范圍[-2147483648, 2147483647]

對(duì)require的說(shuō)明:
當(dāng) require === true 時(shí)篷角,如果當(dāng)前變量不在數(shù)據(jù)流中焊刹,系統(tǒng)將拋出一個(gè)讀取數(shù)據(jù)不存在的異常;
當(dāng) require === false 時(shí)恳蹲,如果當(dāng)前變量不在數(shù)據(jù)流中虐块,系統(tǒng)將返回變量的默認(rèn)值default;
返回?cái)?shù)據(jù):Int16嘉蕾,取值范圍[-32768, 32767]
readInt32
函數(shù)定義:[stream].InputStream.readInt32(tag, require, default)
函數(shù)作用:從數(shù)據(jù)流讀取一個(gè)Int32類型的數(shù)值
輸入?yún)?shù):

參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示欲取變量的數(shù)字標(biāo)識(shí)贺奠,取值范圍[0, 255]
require Boolean 表示當(dāng)前變量是否為必須值,取值范圍{false, true}
default Int32 表示讀取變量不成功時(shí)的返回值错忱,取值范圍[-2147483648, 2147483647]
參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示欲取變量的數(shù)字標(biāo)識(shí)儡率,取值范圍[0, 255]
require Boolean 表示當(dāng)前變量是否為必須值,取值范圍{false, true}
default Int64 表示讀取變量不成功時(shí)的返回值以清,取值范圍[-9223372036854775808, 9223372036854775807]

對(duì)require的說(shuō)明:
當(dāng) require === true 時(shí)儿普,如果當(dāng)前變量不在數(shù)據(jù)流中,系統(tǒng)將拋出一個(gè)讀取數(shù)據(jù)不存在的異常掷倔;
當(dāng) require === false 時(shí)眉孩,如果當(dāng)前變量不在數(shù)據(jù)流中,系統(tǒng)將返回變量的默認(rèn)值default;
返回?cái)?shù)據(jù):Int32浪汪,取值范圍[-2147483648, 2147483647]
readInt64
函數(shù)定義:[stream].InputStream.readInt64(tag, require, default)
函數(shù)作用:從數(shù)據(jù)流讀取一個(gè)Int64類型的數(shù)值
輸入?yún)?shù):

參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示欲取變量的數(shù)字標(biāo)識(shí)巴柿,取值范圍[0, 255]
require Boolean 表示當(dāng)前變量是否為必須值,取值范圍{false, true}
default Int64 表示讀取變量不成功時(shí)的返回值死遭,取值范圍[-9223372036854775808, 9223372036854775807]
參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示欲取變量的數(shù)字標(biāo)識(shí)广恢,取值范圍[0, 255]
require Boolean 表示當(dāng)前變量是否為必須值,取值范圍{false, true}
default UInt8 表示讀取變量不成功時(shí)的返回值殃姓,取值范圍[0, 255]

對(duì)require的說(shuō)明:
當(dāng) require === true 時(shí)袁波,如果當(dāng)前變量不在數(shù)據(jù)流中,系統(tǒng)將拋出一個(gè)讀取數(shù)據(jù)不存在的異常蜗侈;
當(dāng) require === false 時(shí)篷牌,如果當(dāng)前變量不在數(shù)據(jù)流中,系統(tǒng)將返回變量的默認(rèn)值default踏幻;
返回?cái)?shù)據(jù):Int64(Number)枷颊,取值范圍[-9223372036854775808, 9223372036854775807]
readUInt8
函數(shù)定義:[stream].InputStream.readUInt8(tag, require, default)
函數(shù)作用:從數(shù)據(jù)流讀取一個(gè)UInt8類型的數(shù)值
輸入?yún)?shù):

參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示欲取變量的數(shù)字標(biāo)識(shí),取值范圍[0, 255]
require Boolean 表示當(dāng)前變量是否為必須值该面,取值范圍{false, true}
default UInt8 表示讀取變量不成功時(shí)的返回值夭苗,取值范圍[0, 255]
參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示欲取變量的數(shù)字標(biāo)識(shí),取值范圍[0, 255]
require Boolean 表示當(dāng)前變量是否為必須值隔缀,取值范圍{false, true}
default UInt16 表示讀取變量不成功時(shí)的返回值题造,取值范圍[0, 65535]

對(duì)require的說(shuō)明:
當(dāng) require === true 時(shí),如果當(dāng)前變量不在數(shù)據(jù)流中猾瘸,系統(tǒng)將拋出一個(gè)讀取數(shù)據(jù)不存在的異常界赔;
當(dāng) require === false 時(shí),如果當(dāng)前變量不在數(shù)據(jù)流中牵触,系統(tǒng)將返回變量的默認(rèn)值default淮悼;
返回?cái)?shù)據(jù):UInt8(Number),取值范圍[0, 255]
readUInt16
函數(shù)定義:[stream].InputStream.readUInt16(tag, require, default)
函數(shù)作用:從數(shù)據(jù)流讀取一個(gè)UInt16類型的數(shù)值
輸入?yún)?shù):

參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示欲取變量的數(shù)字標(biāo)識(shí)揽思,取值范圍[0, 255]
require Boolean 表示當(dāng)前變量是否為必須值袜腥,取值范圍{false, true}
default UInt16 表示讀取變量不成功時(shí)的返回值,取值范圍[0, 65535]
參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示欲取變量的數(shù)字標(biāo)識(shí)钉汗,取值范圍[0, 255]
require Boolean 表示當(dāng)前變量是否為必須值羹令,取值范圍{false, true}
default UInt16 表示讀取變量不成功時(shí)的返回值,取值范圍[0, 4294967295]

對(duì)require的說(shuō)明:
當(dāng) require === true 時(shí)损痰,如果當(dāng)前變量不在數(shù)據(jù)流中特恬,系統(tǒng)將拋出一個(gè)讀取數(shù)據(jù)不存在的異常;
當(dāng) require === false 時(shí)徐钠,如果當(dāng)前變量不在數(shù)據(jù)流中,系統(tǒng)將返回變量的默認(rèn)值default役首;
返回?cái)?shù)據(jù):UInt16(Number)尝丐,取值范圍[0, 65535]
readUInt32
函數(shù)定義:[stream].InputStream.readUInt32(tag, require, default)
函數(shù)作用:從數(shù)據(jù)流讀取一個(gè)UInt32類型的數(shù)值
輸入?yún)?shù):

參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示欲取變量的數(shù)字標(biāo)識(shí)显拜,取值范圍[0, 255]
require Boolean 表示當(dāng)前變量是否為必須值,取值范圍{false, true}
default UInt16 表示讀取變量不成功時(shí)的返回值爹袁,取值范圍[0, 4294967295]
參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示欲取變量的數(shù)字標(biāo)識(shí)远荠,取值范圍[0, 255]
require Boolean 表示當(dāng)前變量是否為必須值,取值范圍{false, true}
default Float 表示讀取變量不成功時(shí)的返回值

對(duì)require的說(shuō)明:
當(dāng) require === true 時(shí)失息,如果當(dāng)前變量不在數(shù)據(jù)流中譬淳,系統(tǒng)將拋出一個(gè)讀取數(shù)據(jù)不存在的異常;
當(dāng) require === false 時(shí)盹兢,如果當(dāng)前變量不在數(shù)據(jù)流中邻梆,系統(tǒng)將返回變量的默認(rèn)值default;
返回?cái)?shù)據(jù):UInt32(Number)绎秒,取值范圍[0, 4294967295]
readFloat
函數(shù)定義:[stream].InputStream.readFloat(tag, require, default)
函數(shù)作用:從數(shù)據(jù)流讀取一個(gè)Float(32位浦妄,單精度浮點(diǎn)數(shù))類型的數(shù)值
輸入?yún)?shù):

參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示欲取變量的數(shù)字標(biāo)識(shí),取值范圍[0, 255]
require Boolean 表示當(dāng)前變量是否為必須值见芹,取值范圍{false, true}
default Float 表示讀取變量不成功時(shí)的返回值
參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示欲取變量的數(shù)字標(biāo)識(shí)剂娄,取值范圍[0, 255]
require Boolean 表示當(dāng)前變量是否為必須值,取值范圍{false, true}
default Double 表示讀取變量不成功時(shí)的返回值

對(duì)require的說(shuō)明:
當(dāng) require === true 時(shí)玄呛,如果當(dāng)前變量不在數(shù)據(jù)流中阅懦,系統(tǒng)將拋出一個(gè)讀取數(shù)據(jù)不存在的異常;
當(dāng) require === false 時(shí)徘铝,如果當(dāng)前變量不在數(shù)據(jù)流中耳胎,系統(tǒng)將返回變量的默認(rèn)值default;
返回?cái)?shù)據(jù):Float(Number)
readDouble
函數(shù)定義:[stream].InputStream.readDouble(tag, require, default)
函數(shù)作用:從數(shù)據(jù)流讀取一個(gè)Double(64位庭砍,雙精度浮點(diǎn)數(shù))類型的數(shù)值
輸入?yún)?shù):

參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示欲取變量的數(shù)字標(biāo)識(shí)场晶,取值范圍[0, 255]
require Boolean 表示當(dāng)前變量是否為必須值巾陕,取值范圍{false, true}
default Double 表示讀取變量不成功時(shí)的返回值
參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示欲取變量的數(shù)字標(biāo)識(shí)怕敬,取值范圍[0, 255]
require Boolean 表示當(dāng)前變量是否為必須值,取值范圍{false, true}
default String 表示讀取變量不成功時(shí)的返回值

對(duì)require的說(shuō)明:
當(dāng) require === true 時(shí)屏歹,如果當(dāng)前變量不在數(shù)據(jù)流中揭北,系統(tǒng)將拋出一個(gè)讀取數(shù)據(jù)不存在的異常扳炬;
當(dāng) require === false 時(shí),如果當(dāng)前變量不在數(shù)據(jù)流中搔体,系統(tǒng)將返回變量的默認(rèn)值default恨樟;
返回?cái)?shù)據(jù):Double(Number)
readString
函數(shù)定義:[stream].InputStream.readString(tag, require, default)
函數(shù)作用:從數(shù)據(jù)流讀取一個(gè)String(UTF8編碼)類型的數(shù)值
輸入?yún)?shù):

參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示欲取變量的數(shù)字標(biāo)識(shí),取值范圍[0, 255]
require Boolean 表示當(dāng)前變量是否為必須值疚俱,取值范圍{false, true}
default String 表示讀取變量不成功時(shí)的返回值
參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示欲讀取變量的數(shù)字標(biāo)識(shí)劝术,取值范圍[0, 255]
require Boolean 表示當(dāng)前變量是否為必須值,取值范圍{false, true}
TYPE_T 自定義結(jié)構(gòu)體的類型原型 表示該變量的類型原型

對(duì)require的說(shuō)明:
當(dāng) require === true 時(shí),如果當(dāng)前變量不在數(shù)據(jù)流中养晋,系統(tǒng)將拋出一個(gè)讀取數(shù)據(jù)不存在的異常衬吆;
當(dāng) require === false 時(shí),如果當(dāng)前變量不在數(shù)據(jù)流中绳泉,系統(tǒng)將返回變量的默認(rèn)值default逊抡;
返回?cái)?shù)據(jù):String (UTF8編碼)
readStruct
函數(shù)定義:[stream].InputStream.readStruct(tag, require, TYPE_T)
函數(shù)作用:從數(shù)據(jù)流讀取一個(gè)自定義結(jié)構(gòu)體類型的數(shù)值
輸入?yún)?shù):

參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示欲讀取變量的數(shù)字標(biāo)識(shí),取值范圍[0, 255]
require Boolean 表示當(dāng)前變量是否為必須值零酪,取值范圍{false, true}
TYPE_T 自定義結(jié)構(gòu)體的類型原型 表示該變量的類型原型
參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示欲讀取變量的數(shù)字標(biāo)識(shí)冒嫡,取值范圍[0, 255]
require Boolean 表示當(dāng)前變量是否為必須值,取值范圍{false, true}
TYPE_T [stream].BinBuffer 表示該變量的類型原型

當(dāng) require === true 時(shí)四苇,如果當(dāng)前變量不在數(shù)據(jù)流中孝凌,系統(tǒng)將拋出一個(gè)讀取數(shù)據(jù)不存在的異常;
當(dāng) require === false 時(shí)蛔琅,如果當(dāng)前變量不在數(shù)據(jù)流中胎许,系統(tǒng)將返回空的結(jié)構(gòu)體實(shí)例;
返回?cái)?shù)據(jù):自定義結(jié)構(gòu)體的實(shí)例
readBytes
函數(shù)定義:[stream].InputStream.readBytes(tag, require, TYPE_T)
函數(shù)作用:從數(shù)據(jù)流讀取一個(gè)[stream].BinBuffer類型的數(shù)值
輸入?yún)?shù):

參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示欲讀取變量的數(shù)字標(biāo)識(shí)罗售,取值范圍[0, 255]
require Boolean 表示當(dāng)前變量是否為必須值辜窑,取值范圍{false, true}
TYPE_T [stream].BinBuffer 表示該變量的類型原型
參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示欲讀取變量的數(shù)字標(biāo)識(shí),取值范圍[0, 255]
require Boolean 表示當(dāng)前變量是否為必須值寨躁,取值范圍{false, true}
TYPE_T [stream].List 表示該變量的類型原型

返回?cái)?shù)據(jù):[stream].BinBuffer
readList
函數(shù)定義:[stream].InputStream.readList(tag, require, TYPE_T)
函數(shù)作用:從數(shù)據(jù)流讀取一個(gè)[stream],List<T>類型的數(shù)值
輸入?yún)?shù):

參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示欲讀取變量的數(shù)字標(biāo)識(shí)穆碎,取值范圍[0, 255]
require Boolean 表示當(dāng)前變量是否為必須值,取值范圍{false, true}
TYPE_T [stream].List 表示該變量的類型原型
參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示欲讀取變量的數(shù)字標(biāo)識(shí)职恳,取值范圍[0, 255]
require Boolean 表示當(dāng)前變量是否為必須值所禀,取值范圍{false, true}
TYPE_T [stream].List 表示該變量的類型原型

對(duì)require的說(shuō)明:
當(dāng) require === true時(shí),如果當(dāng)前變量不在數(shù)據(jù)流中放钦,系統(tǒng)將拋出一個(gè)讀取數(shù)據(jù)不存在的異常色徘;
當(dāng) require === false時(shí),如果當(dāng)前變量不在數(shù)據(jù)流中操禀,系統(tǒng)將返回一個(gè)空的[stream].List(T)的實(shí)例褂策;
返回?cái)?shù)據(jù):[stream].List(T)
readList
函數(shù)定義:[stream].InputStream.readList(tag, require, TYPE_T)
函數(shù)作用:從數(shù)據(jù)流讀取一個(gè)[stream],List<T>類型的數(shù)值
輸入?yún)?shù):

參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示欲讀取變量的數(shù)字標(biāo)識(shí),取值范圍[0, 255]
require Boolean 表示當(dāng)前變量是否為必須值颓屑,取值范圍{false, true}
TYPE_T [stream].List 表示該變量的類型原型
參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示欲讀取變量的數(shù)字標(biāo)識(shí)斤寂,取值范圍[0, 255]
require Boolean 表示當(dāng)前變量是否為必須值,取值范圍{false, true}
TYPE_T [stream].Map(T, V) 表示該變量的類型原型

對(duì)require的說(shuō)明:
當(dāng) require === true時(shí)揪惦,如果當(dāng)前變量不在數(shù)據(jù)流中遍搞,系統(tǒng)將拋出一個(gè)讀取數(shù)據(jù)不存在的異常;
當(dāng) require === false時(shí)器腋,如果當(dāng)前變量不在數(shù)據(jù)流中溪猿,系統(tǒng)將返回一個(gè)空的[stream].List(T)的實(shí)例钩杰;
返回?cái)?shù)據(jù):[stream].List(T)
readMap
函數(shù)定義:[stream].InputStream.readMap(tag, require, TYPE_T)
函數(shù)作用:從數(shù)據(jù)流讀取一個(gè)[stream],Map<T, V>類型的數(shù)值
輸入?yún)?shù):

參數(shù) 數(shù)據(jù)類型 描述
tag UInt8 表示欲讀取變量的數(shù)字標(biāo)識(shí),取值范圍[0, 255]
require Boolean 表示當(dāng)前變量是否為必須值诊县,取值范圍{false, true}
TYPE_T [stream].Map(T, V) 表示該變量的類型原型

對(duì)require的說(shuō)明:
當(dāng) require === true時(shí)榜苫,如果當(dāng)前變量不在數(shù)據(jù)流中,系統(tǒng)將拋出一個(gè)讀取數(shù)據(jù)不存在的異常翎冲;
當(dāng) require === false時(shí),如果當(dāng)前變量不在數(shù)據(jù)流中媳荒,系統(tǒng)將返回一個(gè)空的[stream].Map(T, V)的實(shí)例抗悍;
返回?cái)?shù)據(jù):[stream].Map(T, V)

registry

TARS 框架中的主控請(qǐng)求模塊

包括:
EndpointF.tars
EndpointFTars.js
QueryF.tars
QueryFProxy.js
index.js
package.json

utils

TARS框架輔助工具集合

@tars/utils

TARS框架輔助工具集合

Installation
$ npm install @tars/utils

01.配置文件解析器

var Config = require('@tars/utils').Config;
API

parseFile(sFilePath, [encoding, callback])
解析指定文件

  • sFilePath:文件名
  • encoding:文件編碼類型。(默認(rèn)值: utf8)
  • callback:回調(diào)函數(shù)钳枕,回調(diào)函數(shù)的格式為function callback(ret, config){}缴渊,其中ret為對(duì)象{code:返回碼,成功為0鱼炒,失敗為-1衔沼,message:描述,exception:如果成功為undefined昔瞧,如果失敗為事件對(duì)象}指蚁,config為解析器本身
parseText(sText)

解析字符串,并將解析的結(jié)果存于內(nèi)部_data屬性中自晰,可以通過(guò)get方法獲取相應(yīng)的值凝化。

  • sText:字符串
  • return:true:解析成功,false:解析失敗
get(key, defaultValue)

文件被解析之后酬荞,會(huì)將結(jié)果存儲(chǔ)在一個(gè)對(duì)象中搓劫,通過(guò)get方法可以獲取指定的值。注:如果配置文件/字符串中有相同的key混巧,則get獲取key對(duì)應(yīng)的值時(shí)枪向,不會(huì)獲取所有的值,而是獲取該key最后對(duì)應(yīng)的那個(gè)值咧党,可以理解為對(duì)應(yīng)相同的key后面的值覆蓋前面的值秘蛔。

  • key: 需要取值的key值,格式為x1.x2.x3凿傅,其中x1缠犀、x2、x3依次為深層次的key聪舒,注:如果key值本身為x1.x2格式辨液,取該key對(duì)應(yīng)的值時(shí)需要寫(xiě)成<x1.x2>,具體使用參見(jiàn)例子箱残。
  • defaultValue: 取不到結(jié)果的默認(rèn)值
    getDomain(key, defaultValue)
    獲取key對(duì)應(yīng)的值中類型為Object的屬性數(shù)組
  • key: key值
  • defaultValue: 取不到結(jié)果的默認(rèn)值
    **getDomainValue(key, defaultValue)
    獲取key對(duì)應(yīng)的值中類型為Object的屬性值數(shù)組
  • key: key值滔迈。
  • defaultValue: 取不到結(jié)果的默認(rèn)值
    **getDomainLine(key, defaultValue)
    獲取key對(duì)于路徑下的所有非空行
  • key: key值
  • defaultValue: 取不到結(jié)果的默認(rèn)值
  • return: 數(shù)組
    data
    通過(guò)該屬性止吁,可以獲取文件解析的結(jié)果
example
var Config = require('@tars/utils').Config;

var config = new Config();
config.parseFile('./config.conf', 'utf8');

var data = config.data;
console.log('data: ', data);
console.log('get: tars.application.server.local: ', config.get('tars.application.server.local'));
console.log('getDomain: tars.application.server: ', config.getDomain('tars.application.server'));
console.log('getDomainValue: tars.application.server: ', config.getDomainValue('tars.application.server'));

具體例子參加examples目錄下的test-config.js文件

02.Endpoint工具

var Endpoint = require('@tars/utils').Endpoint;
API

Class方法:parse(desc)
從字符串中解析出Endpoint信息

  • desc:字符串,例如:'tcp -h 127.0.0.1 -p 10000 -t 60000'
  • return:返回Endpoint實(shí)例燎悍。
    toString()
    Endpoint信息轉(zhuǎn)化成字符串
    copy()
    拷貝Endpoint實(shí)例
example
var Endpoint = require('@tars.utils').Endpoint;

var endpoint = Endpoint.parse('tcp -h 127.0.0.1 -p 10000 -t 60000');
console.log('endpoint: ' + endpoint.toString());
console.log('endpoint.copy: ' + endpoint.copy().toString());

具體例子參見(jiàn)examples目錄下的test-endpoint.js文件

03.timeProvider工具

var timeProvider = require('@tars/utils').timeProvider;
API

nowTimestamp()
采用Date.now()的方式獲取時(shí)間敬惦,此種方式效率最高,Date.now()方式的效率大概是new Date.getTime()的2倍谈山,是process.hrtime()方式的4倍俄删。

  • return:返回對(duì)象
{
  hrtime: //  數(shù)據(jù)類型。[秒奏路,納秒]畴椰,
  timestamp:  //  單位ms
}

diff(oTime)
當(dāng)前時(shí)間相對(duì)于oTime的時(shí)間間隔

  • oTime:相對(duì)時(shí)間,nowTimestamp函數(shù)返回的對(duì)象類型
  • return:浮點(diǎn)類型鸽粉,時(shí)間間隔斜脂,單位毫秒
  • 注:nowTimestamp和diff配對(duì)使用
    dateTimestamp()
    獲取當(dāng)前的時(shí)間戳,即機(jī)器從啟動(dòng)到當(dāng)前的時(shí)間(process.hrtime)
  • return:返回對(duì)象
{
    hrtime: // 數(shù)組類型触机,[秒, 納秒],
    timestamp: // 單位ms
}

dateTimestampDiff(oTime)
當(dāng)前時(shí)間相對(duì)于oTime的時(shí)間間隔

  • oTime:相對(duì)時(shí)間帚戳,dateTimestamp函數(shù)返回的對(duì)象類型
  • return:浮點(diǎn)類型,時(shí)間間隔儡首,單位毫秒
  • 注:dateTimestamp和dateTimestampDiff配對(duì)使用
example
var timeProvider = require('@tars/utils').timeProvider;

var i = 0, count = 10000000;
var tt1, tt2, interval = 0;
var t1 = new Date().getTime();
var t2 = t1;

tt1 = timeProvider.nowTimestamp();
for(i = 0; i < count; i++) {
  tt2 = timeProvider.dff(tt1);
}
t2 = new Date().getTime();
console.log('【hrTime】interval: ' + (t2 - t1));

t1 = new Date().getTime();
tt1 = timeProvider.dateTimestamp();
for(i = 0; i < count; i++) {
  tt2 = timeProvider.dateTimestampDiff(tt1);
}
t2 = new Date().getTime();
console.log('【hrTime】interval: ' + (t2 - t1));

具體例子參見(jiàn)examples目錄下的test-timer.js文件

03.Promise庫(kù)
var Promise = require('@tars/utils').promise;

為T(mén)ARS應(yīng)用提供一個(gè)方便統(tǒng)一的Promise庫(kù)片任。開(kāi)發(fā)TARS應(yīng)用時(shí)推薦大家使用此庫(kù)而不是自己選擇Promise庫(kù),當(dāng)出現(xiàn)更好的promise方案時(shí)椒舵,我們可以直接替換此模塊中的實(shí)現(xiàn)蚂踊,直接對(duì)所有應(yīng)用生效。

var Promise = require('@tars/utils').Promise;
var promise = new Promise(function(resolve, reject) {
  setTimeout(function() {
    resolve(666)
  }, 3000);
});
promise.then(function(data) {
  console.log(data);
});

目前TARS中的Promise是基于bluebird庫(kù)實(shí)現(xiàn)的笔宿,在q犁钟、bluebird、原生Promise中bluebird性能最好泼橘。

winston-tars

基于 winston 的擴(kuò)展涝动,以提供符合 TARS 框架的日志格式與輸出

@tars/winston-tars

@tars/winston-tars提供基于winston的TARS擴(kuò)展,以提供符合TARS框架的日志格式與輸出炬灭,在@tars/winston-tars中提供3種transport對(duì)象:

  • TarsBase: 提供符合TARS日志的基礎(chǔ)類
  • TarsRotate: 提供按大小輸出的滾動(dòng)日志
  • TarsDate: 提供按日期輸出的日志
    并提供一種自定義日志級(jí)別:
  • TarsConfig: 提供符合TARS框架標(biāo)準(zhǔn)的日志級(jí)別和顏色值
    以及相關(guān)的輔助方法:
  • Formatter: 提供了符合TARS日志格式標(biāo)準(zhǔn)的內(nèi)容格式化方法
  • Date-Format: 定義了與時(shí)間相關(guān)日志滾動(dòng)的處理方法
    請(qǐng)注意:如果您的服務(wù)在TARS平臺(tái)上運(yùn)行醋粟,應(yīng)直接使用@tars/logs模塊,更為便捷
安裝
npm install @tars/winston-tars
使用
var winston = require('winston');

//  Require `@tars/winston-tars` will expose

//  transports
//  `winston.transport.TarsRotate`  
//  `winston.transport.TatsDate`  

//  config
//  `winston.config.tars.levels`
//  `winston.config.tars.colors`
require('@tars/winston-tars');
日志格式

對(duì)于支持formatter的transport對(duì)象重归,@tars/winston-tars提供2種方法格式化日志內(nèi)容:

  • 詳細(xì)日志:Formatter.Detail([options])
  • 精簡(jiǎn)日志:Formatter.Simple([options])
    options
  • separ: 日志內(nèi)容項(xiàng)與項(xiàng)之間的分隔符米愿,默認(rèn)為|
詳細(xì)日志:
var winston = require('winston');
var winstonTars = require('@tars/winston-tars');

var logger = new (winston.Logger) ({
  transports: [
    new (winston.transports.Console)({
      formatter: winstonTars.Formatter.Detail();
    })
  ]
});

輸出日志的格式為:日期 時(shí)間|PID|日志級(jí)別|文件名與行號(hào)|內(nèi)容
其中:文件名與行號(hào) 部分可選(詳見(jiàn)Metadata節(jié))

精簡(jiǎn)日志
var winston = require('winston');
var winstonTars = require('@tars/winston-tars');

var logger = new (winston.Logger) ({
  transports: [
    new (winston.transports.Console)({
      formatter: winstonTars.Formatter.Simple();
    })
  ]
});

輸出日志的格式為:日期 時(shí)間|內(nèi)容

TarsConfig

winston.config.tars提供了符合TARS框架標(biāo)準(zhǔn)的日志級(jí)別(levels)與顏色(colors)
TARS框架的日志級(jí)別從低到高(及其對(duì)應(yīng)的顏色)為:

  • info: white
  • debug: cyan
  • warn: yellow
  • error: red
  • none: grey
    在使用時(shí)需要主動(dòng)引入:
logger.setLevels(winston.config.tars.levels);
winston.addColors(winston.config.tars.colors);
TarsBase

此模塊可單獨(dú)使用,也可作為其他日志模塊的基類鼻吮。
模塊實(shí)現(xiàn)了與現(xiàn)有TARS日志類似的管理方式:

  • 定時(shí)重新打開(kāi)日志文件育苟,以便獲取fd的變更。(當(dāng)用戶刪除/移動(dòng)當(dāng)前文件后椎木,模塊會(huì)自動(dòng)創(chuàng)建文件)
  • 在文件打開(kāi)的過(guò)程中违柏,產(chǎn)生的日志將會(huì)寫(xiě)入臨時(shí)內(nèi)存隊(duì)列博烂,等待文件打開(kāi)完成后一次性寫(xiě)入。(只要不超過(guò)隊(duì)列最大長(zhǎng)度漱竖,所有日志均會(huì)寫(xiě)入文件)
  • 此模塊使用文件名options.filename作緩存禽篱,所以使用相同的options.filename多次實(shí)例化此模塊僅會(huì)產(chǎn)生一個(gè)單例(共享一個(gè)實(shí)例)
獨(dú)立使用
winston.add(winston.transports.TarBase, options)

options:

  • filename: 輸出的文件名
  • interval: 重新打開(kāi)日志文件的間隔,默認(rèn)值為5000ms
  • bufferSize: 臨時(shí)隊(duì)列的最大長(zhǎng)度(單位為 條)馍惹,默認(rèn)值為10000條
  • prefix: 每條日志內(nèi)容前綴躺率,默認(rèn)值為空
  • formatter:定義日志內(nèi)容格式化方法,默認(rèn)值為Formatter.Detail()
作為其他類的基類

需要重寫(xiě)如下2個(gè)對(duì)象:

  • TarsBase.prototype.name: Transport 模塊名
  • TarsBase.prototype._checkfile(callback):當(dāng)重新打開(kāi)日志文件時(shí)會(huì)調(diào)用此函數(shù)万矾,函數(shù)處理完成之后肥照,應(yīng)顯式調(diào)用callback([err])
    例如:
var TarsFile = function (options) {
  var instance = TarsBase.call(this, options);

  //  由于父類存在緩存,所以這里需判斷父類是否有返回值勤众,如果存在(命中緩存)則則直接返回?zé)o需繼續(xù)初始化

  if (instance) {
    return instance;
  }

  //  業(yè)務(wù)代碼
};
util.inherits(TarsFile, TarsBase);

TarsFile.prototype.name = 'TarsFile';

TarsFile.prototype._checkfile = function(cb) {
  //  業(yè)務(wù)代碼
  cb();
};

winston.transports.TarsFile = TarsFile;
TarsRotate

此模塊繼承于TarsBase
提供按文件大小輸出的滾動(dòng)日志
當(dāng)?shù)竭_(dá)設(shè)定的最大大小時(shí),會(huì)自動(dòng)向下滾動(dòng)鲤脏,并創(chuàng)建一個(gè)新的日志文件们颜。
例如:app.log文件寫(xiě)到最大大小,則將會(huì)執(zhí)行如下過(guò)程:

delete app_n.log
app_n-1.log ===> app_n.log
... ...
app_1.log ===> app_2.log
app.log ===> app_1.log
create app.log
 winston.add(winston.transports.TarsRotate, options)

options:

  • filename: 輸出的文件名
  • maxFiles: 最大的文件總數(shù)(也就是例子中的n)猎醇,默認(rèn)值為10
  • maxSize: 單文件最大大锌弧(單位為bytes),默認(rèn)值為10M
  • concatStr: 日志文件名中字符間的連接符硫嘶,默認(rèn)值為_(kāi)
  • formatter: 定義日志內(nèi)容格式化方法阻问,默認(rèn)值為Formatter.Detai()
    TarsRotate.Master
    如果業(yè)務(wù)腳本通過(guò)Cluster(多進(jìn)程方式啟動(dòng)的):Worker則只負(fù)責(zé)寫(xiě)入文件,而移動(dòng)文件由Master完成沦疾,以剞劂多進(jìn)程資源競(jìng)爭(zhēng)問(wèn)題称近。
    當(dāng)服務(wù)進(jìn)程(Worker)打開(kāi)日志文件準(zhǔn)備寫(xiě)入時(shí),會(huì)向主進(jìn)程發(fā)送消息哮塞,如下:
{
  cmd : 'log:rotate',
  msg : {
    filename : String,  // 文件名
    interval : Number,  // 多久打開(kāi)一回文件
    maxFiles : Number,  // 最大文件數(shù)
    maxSize : Number, // 最大單個(gè)文件大小
    concatStr : string  // 日志文件名中間字符的連接符
  }
}

主進(jìn)程(Master)收到消息后刨秆,需透?jìng)鹘oTarsRotate。Master.start方法忆畅,完整的例子如下:

worker.on('message', function(msg) {
  if (msg && typeof msg == 'object' && msg.cmd == 'log:rotate') {
    var data = msg.msg;
    TarsRotate.Master.start(data.filename, data.interval, data.maxFiles, data.maxSize, data.concatStr);
  }
});

process.on('exit', function() {
  TarsRotate.Master.close();
});
···
**如果服務(wù)通過(guò)node-agent(或在TARS平臺(tái))運(yùn)行衡未,則無(wú)需配置平臺(tái)運(yùn)行,無(wú)需顯式調(diào)用此模塊家凯。只需按照平時(shí)的寫(xiě)法console.[log|info|warn|error]即可正確的輸出滾動(dòng)日志**
######DateFormat
定義了與時(shí)間相關(guān)的日志(TarsDate)滾動(dòng)的處理方法:
+ 按1天日志:LogByDay([interval, pattern])
  + **interval**: 1 每隔一天滾動(dòng)一份日志
  + **pattern**: %Y%m%d 年月日(如:20150101)
+ 按1小時(shí)日志:LogByHour([interval, pattern])
  + **interval**: 1 每隔一小時(shí)滾動(dòng)一份日志
  + **pattern**: %Y%m%d 年月日(如:2015010110)
+ 按10分鐘日志:LogByHour([interval, pattern])
  + **interval**:每隔十分鐘滾動(dòng)一份日志
  + **pattern**:%Y%m%d%H%M 年月日小時(shí)分鐘(如:201501011020)
+ 自定義格式日志:LogByCustom(pattern)
  + **pattern**:需要用戶自定義
其中pattern為日志文件名中的時(shí)間格式缓醋,可參見(jiàn) linux strftime
######例子
每隔1天滾動(dòng)一份日志
```javascript
DateFormat.LogByDay
或者
new DateFormat.LogByDay()

每隔20分鐘滾動(dòng)一份日志

new DateFormat.LogByMinute(20)

每隔20分鐘滾動(dòng)一份日志,文件名中時(shí)間格式為%Y-%m-%d_%H:%M
···javascript
new DateFormat.LogByMinute(20, %Y-%m-%d_%H:%M)

######TarsDate
此模塊繼承于TarsBase
提供按日期(年绊诲、月送粱、日、小時(shí)驯镊、分)輸出的日志
當(dāng)?shù)竭_(dá)設(shè)定的時(shí)間間隔時(shí)葫督,會(huì)自動(dòng)創(chuàng)建一個(gè)新的日志文件
輸出的文件名的格式為:filename_[%Y|%m|%d|%H|%M].log竭鞍,
如:app_20141015.log
```javascript
winston.add(winston.transports.TarsDate, options)

options:

  • filename:輸出的文件名
  • concatStr:日志文件名中字符間的連接符,默認(rèn)值為_(kāi)
  • format:創(chuàng)建新文件的間隔橄镜,為DateFormat對(duì)象偎快,默認(rèn)值為FORMAT.LogByDay
  • formatter:定義日志內(nèi)容格式化方法,默認(rèn)值為Formatter.Simple()
    為了方便使用TarsDate.FORMAT = DateFormat
Metadata

通過(guò)指定Metadata可輸出2種附加數(shù)據(jù)洽胶。
pid
通過(guò)pid屬性晒夹,可以指定日志輸出條目中進(jìn)程id部分,默認(rèn)情況下為process.pid
如:

logger.info('data', {
  pid : 123456
});

則輸出:
2015-01-01 00:00:01|123456|INFO|data
lineno
通過(guò)lineno屬性姊氓,可以指定日志輸出條目中文件名與行號(hào)部分丐怯,默認(rèn)值為空(也就是不輸出這一節(jié))。
如:

logger.info('data', {
  lineno : 'app.js:6'
});

則輸出:
2015-01-01 00:00:01|123456|INFO|app.js:6|data

notify

TARS 框架中用于業(yè)務(wù)的(告警)消息上報(bào)

@tars/notify

上報(bào)業(yè)務(wù)(框架)消息(告警)至TARS平臺(tái)翔横。

report(message[, id])

將消息上報(bào)到平臺(tái)上读跷,并可以在WEB管理頁(yè)面上查看到。

  • message: 消息內(nèi)容(必填)
  • id: 服務(wù)線程(進(jìn)程)ID禾唁,默認(rèn)值為process.id
notify(message[, level, id])

上報(bào)通知信息到平臺(tái)效览。

  • message: 通知內(nèi)容(必填)
  • level: 通知內(nèi)容的級(jí)別,為L(zhǎng)EVEL枚舉荡短,默認(rèn)值為L(zhǎng)EVEL.NOTIFYNORMAL
  • id: 服務(wù)線程(進(jìn)程)ID丐枉,默認(rèn)值為process.pid
    LEVEL 枚舉中有3項(xiàng)可選:
  • LEVEL.NOTIFYNORMAL:正常(默認(rèn))
  • LEVEL.NOTIFYWARN:警告
  • LEVEL.NOTIFYERROR:錯(cuò)誤
    如果level的級(jí)別為L(zhǎng)EVEL.NOTIFYERROR,則會(huì)進(jìn)行短信告警掘托,平臺(tái)每10分鐘對(duì)上報(bào)的異常進(jìn)行收斂告警瘦锹。

logs

TARS 框架規(guī)范的日志組件,包含滾動(dòng)(大小闪盔、時(shí)間)與染色日志

@tars/logs

基于winston與winston-tars開(kāi)發(fā)弯院,符合TARS框架規(guī)范的日志組件,其中包含染色日志泪掀、滾動(dòng)(大小抽兆、時(shí)間)日志。

安裝
npm install @tars/logs
例子

輸出滾動(dòng)日志

var logger = new tarsLogs('TarsRotate');

輸出名為access的按天日志

var logger = new tarsLogs('TarsDate', 'access');

輸出名為access的按小時(shí)日志

var logger = new tarsLogs('TarsDate', 'access', {
  format : tarsLogs.DateFormat.LogByHour
});

輸出名為access的按20分鐘滾動(dòng)的日志族淮,文件名為2015-01-01_10:00這樣的格式

var logger = new tarsLogs('TarsDate', 'access', {
  format: new (tarsLogs.Dateformat.LogByMinute)(20, '%Y-%m-%d_%H:%M')
});

指定輸出INFO級(jí)別的日志信息

logger.info('data');
logger.info('data1', 'data2', 'data3');

指定當(dāng)前INFO級(jí)別的日志輸出需要染色

logger.info('data', logger.getDyeingObj(true));

初始化

如果服務(wù)在TARS平臺(tái)上運(yùn)行辫红,則無(wú)需配置此項(xiàng)
如果服務(wù)在本地環(huán)境中調(diào)試,所有日志類型都講輸出至Console

可以通過(guò)調(diào)用tarsLogs.setConfig(data)靜態(tài)方法進(jìn)行初始化
data(String|Object)可作為tars配置文件路徑或已配置的(@tars/utils).Config實(shí)例祝辣。

使用

實(shí)例化
var tarsLogs = require('@tars/logs');
var logger = new tarsLogs(type, [name, options]);

type(String)日志類型:

  • TarsRotate: 按大小滾動(dòng)日志
  • TarsDate: 按時(shí)間滾動(dòng)日志
    name(String)用戶自定義的文件名(可不填)
    options(Object)根據(jù)不同的日志類型贴妻,存在不同的參數(shù),但下面的參數(shù)是各類型共享的:
  • hasSufix: 日志文件名是否帶.log后綴蝙斜,默認(rèn)值為true
  • hasAppNamePrefix: 是否允許框架在日志文件名上增加業(yè)務(wù)相關(guān)的標(biāo)識(shí)名惩,默認(rèn)值為true
  • concatStr: 日志文件名中字符間的連接符,默認(rèn)值為_(kāi)
  • separ: 日子內(nèi)容項(xiàng)之間的分隔符孕荠,默認(rèn)值為|
    options中的其它參數(shù)娩鹉,請(qǐng)?jiān)敽?jiǎn)不同日志類型的說(shuō)明項(xiàng)攻谁。
    在正常情況下,相同一個(gè)日志文件應(yīng)該共享相同的一個(gè)logger弯予,而不是多次進(jìn)行實(shí)例化

日志輸出

在TARS中存在4種日志級(jí)別INFO戚宦、DEBUG、WARN锈嫩、ERROR可用對(duì)應(yīng)的方法進(jìn)行輸出

logger.info([data], [...]);
logger.debug([data], [...]);
logger.warn([data], [...]);
logger.error([data], [...]);

方法支持多重參數(shù)受楼,詳情可見(jiàn)util.format()
如需要染色,詳見(jiàn)染色節(jié)

文件名與行號(hào)

默認(rèn)情況下呼寸,輸出的日志中包含調(diào)用輸出方法的代碼所在的 文件名:行號(hào)艳汽。
可通過(guò)如下示例進(jìn)行自定義(用于封裝模塊)或者關(guān)閉(以提高性能)。
關(guān)閉文件名與行號(hào)輸出:

logger.info('data', {
  lineno : false
});

自定義文件名與行號(hào)輸出:

logger.info('data', {
  lineno : 'app.js:123'
});

更多詳細(xì)信息对雪,請(qǐng)參考@tars/winston-tars.Metadata

日志級(jí)別

日志級(jí)別的優(yōu)先級(jí)為:INFO < DEBUG < WARN < ERROR < NONE
其中河狐,除了按大小滾動(dòng)日志(TarsRotate)默認(rèn)級(jí)別為DEBUG,其他均為INFO瑟捣。
如需變更日志級(jí)別甚牲,可調(diào)用logger.setLevel(level)方法,傳入需要的日志級(jí)別即可:

logger.setLevel('info');
logger.setLevel('none');  // none為一種特殊的日志級(jí)別蝶柿,所有日志均不輸出

如果服務(wù)在TARS平臺(tái)上運(yùn)行:

  • 模塊會(huì)接收日志級(jí)別變更的管理命令,自動(dòng)變更當(dāng)前日志級(jí)別非驮。
  • 模塊會(huì)讀取TARS配置文件中tars.application.server.logLevel節(jié)交汤,以配置日志級(jí)別。
  • 以上兩項(xiàng)日志級(jí)別的配置僅針對(duì)按大小滾動(dòng)日志(TarsRotate)生效劫笙。
日志內(nèi)容格式(Formatter)

模塊提供精簡(jiǎn)Formatter.Simple()與復(fù)雜Formatter.Detail()兩種日志處理方法:

  • 復(fù)雜:日期 時(shí)間|PID|日志級(jí)別|文件名與行號(hào)|內(nèi)容
  • 精簡(jiǎn):日期 時(shí)間|內(nèi)容
    默認(rèn)情況下芙扎,不同類型的日志會(huì)使用不同的處理方法。
    關(guān)于Formatter的詳情填大,請(qǐng)?jiān)L問(wèn)@tars/winston-tars.Formatter
    #######按大小滾動(dòng)日志(TarsRotate)
    在初始化類型為T(mén)arsRotate的logger時(shí)戒洼,options還接受如下參數(shù):
  • maxFiles: 最大的文件總數(shù)(也就是例子中的n),默認(rèn)值為10
  • maxSize: 單文件最大大性驶(單位為bytes)圈浇,默認(rèn)值為10M
  • formatter: 定義日志內(nèi)容格式化方法,默認(rèn)值為Formatter.Detail()
    關(guān)于TarsRotate的詳情靴寂,請(qǐng)?jiān)L問(wèn)@tars/winston-tars.TarsRotate
時(shí)間相關(guān)(DateFormat)

定義了與時(shí)間相關(guān)的日志(TarsDate)滾動(dòng)的處理方法:

  • 按1天日志:LogByDay([interval, pattern])
  • 按1小時(shí)日志:LogByHour([interval, pattern])
  • 按10分鐘日志:LogByMinute([interval, pattern])
  • 自定義格式日志:LogByCustom(pattern)
    其中磷蜀,interval為日志滾動(dòng)間隔,pattern為日志文件名中時(shí)間的格式
    一般情況下百炬,可直接使用字面量:
var logger = new tarsLogs('TarsDate', 'access', {
  format : tarsLogs.DateFormat.LogByDay 
});

但如果需要自定義間隔或日志文件名褐隆,則需要實(shí)例化:

var logger = new tarsLogs('TarsDate', 'access', {
  format : new tarsLogs.DateFormat.LogByDay(3, '%Y-%m-%d');
});

關(guān)于DateFormat的詳情,請(qǐng)?jiān)L問(wèn)@tars/winston-tars.DateFormat

按時(shí)間滾動(dòng)日志(TarsDate)

在初始化類型為T(mén)arsDate的logger時(shí)剖踊,options還接受如下參數(shù):

  • format:創(chuàng)建新文件的間隔庶弃,為DateFormat對(duì)象衫贬,默認(rèn)值為FORMAT.LogByDay
  • formatter:定義日志格式化方法,默認(rèn)值為Formatter.Simple()
    關(guān)于TarsDate的詳情歇攻,請(qǐng)?jiān)L問(wèn):@tars/winston-tars.TarsDate

染色

在每一條日志寫(xiě)入時(shí)可以制定是否需要對(duì)此日志進(jìn)行染色(也就是說(shuō)固惯,染色的開(kāi)關(guān)并不在初始化時(shí)而在日志寫(xiě)入時(shí))。
僅有按大小滾動(dòng)(TarsRotate)與按時(shí)間滾動(dòng)(TarsDate)輸出的日志可以進(jìn)行染色掉伏。
染色的日志不僅按照之前邏輯進(jìn)行輸出缝呕,也會(huì)按照相同的邏輯會(huì)多輸出一份放在$LOG_PATH$/tars_dyeing/目錄下。
染色日志總是全量輸出(忽略當(dāng)前日志級(jí)別進(jìn)行輸出)斧散。

染色對(duì)象

染色對(duì)象標(biāo)識(shí)了當(dāng)前染色的狀態(tài)(是否需要染色及附加信息)恋日。
染色對(duì)象需要通過(guò)@tars/dyeing提供的方法生成村象。
為了便于使用,本模塊封裝了染色對(duì)象的生成方式“亲睿可通過(guò)logger.getDyeingObj()來(lái)獲取染色對(duì)象。
打開(kāi)染色:

logger.getDyeingObj(true);

打開(kāi)染色并設(shè)置染色的val為guid贤姆,ket為guid|sn

logger.getDyeingObj(true, 'guid', 'guid|sn');

實(shí)際應(yīng)用中渔欢,不應(yīng)調(diào)用此方法生成染色對(duì)象,而應(yīng)直接使用其他模塊提供的染色對(duì)象
符合染色標(biāo)準(zhǔn)的其它模塊色迂,均會(huì)提供Object.getDyeingObj()方法香缺,可通過(guò)調(diào)用它獲取染色對(duì)象,而不是使用此模塊的方法歇僧。
關(guān)于染色的詳細(xì)信息图张,請(qǐng)?jiān)L問(wèn)@tars/dyeing獲取。

使用

需要對(duì)某條日志進(jìn)行染色時(shí)诈悍,需在調(diào)用logger特定方法(日志級(jí)別)的最后一個(gè)參數(shù)傳入染色對(duì)象祸轮。
輸出日志內(nèi)容為data1 data2并強(qiáng)制染色的日志

logger.info('data1', 'data2', logger.getDyeingObj(true));

輸出日志內(nèi)容為data并根據(jù)rpc.server調(diào)用鏈上的染色信息進(jìn)行染色的日志

tars.TestImp.prototype.echo = function (current, i) {
  logger.info('data', current.getDyeingObj());
}

rpc具體獲取染色對(duì)象的方式,請(qǐng)?jiān)斠?jiàn)@tars/rpc

config

TARS 框架中用于獲取服務(wù)配置文件

@tars/config

安裝
npm install @tars/config
使用
var tarsConfigHelper = require("@tars/config");
var tarsConfig = new tarsConfigHelper(options);
options

如果服務(wù)通過(guò)node-agent(或在TARS平臺(tái))運(yùn)行侥钳,則無(wú)需填寫(xiě)适袜。

  • app:tars.app名稱
  • server:服務(wù)名稱

方法調(diào)用

事先說(shuō)明,以下幾個(gè)方法調(diào)用舷夺,configOptions可以是一個(gè)object苦酱,包含以下參數(shù)。

struct ConfigInfo {
  //  業(yè)務(wù)名稱 0
  require string appname;
  //  服務(wù)名稱 1
  require string servername;
  //  配置文件名稱 2
  require string filename;
  //  是否只獲取應(yīng)用配置给猾,默認(rèn)為false躏啰,如果為true則servername可以為空 3
  require bool bAppOnly = false;
  //  服務(wù)所在節(jié)點(diǎn)(ip) 4
  optional string host;
  //  set分組名稱 5
  optional string setdivision;
};

所有的放大調(diào)用均返回[Promise]對(duì)象。

loadConfig(configOptions[, configFormat])

獲取配置文件內(nèi)容
configOptions:{string/object} tars配置文件名或一個(gè)Object(見(jiàn)上面configOptions說(shuō)明)configFormat:轉(zhuǎn)換格式耙册,如果不轉(zhuǎn)给僵,每個(gè)配置項(xiàng)直接返回字符串。"json:"自動(dòng)轉(zhuǎn)為json格式,"c":c++格式的配置項(xiàng)

tarsConfig.loadConfig("Server.conf").then(function (data) {
  console.log("loadConfig back", data);
}, function (err) {
  console.log("loadConfig err", err);
});
getConfigList(configOptions)

獲取配置文件列表
configOptions:{string/object} tars配置文件名或者一個(gè)Object(見(jiàn)上面configOptions說(shuō)明)帝际,也可以不傳蔓同,那么就直接使用默認(rèn)的app和server。

tarsConfig.getConfigList().then(function(configList) {
  console.log("examples:getConfigList back", configList);
},
function(err) {
  console.error("getConfigList error", err);
});
getAllConfigData([configOptions, configFormat])

獲取配置文件列表以及配置項(xiàng)的內(nèi)容
configOptions:{string/object} tars配置文件名或者一個(gè)Object(見(jiàn)上面configOptions說(shuō)明)蹲诀,可缺省斑粱。configFormat:{string}轉(zhuǎn)換格式,默認(rèn)配置項(xiàng)直接返回字符串脯爪。"json:"自動(dòng)轉(zhuǎn)為json格式则北,"c":c++格式的配置項(xiàng)
返回的對(duì)象內(nèi),key:文件名痕慢,value:文件內(nèi)容

tarsConfig.getAllConfigData().then(function(configDatas) {
  console.log("examples:getAllConfigData back", configDatas);
}, 
function(err) {
  console.error("getAllConfigData error", err);
});

setTimeout(iTimeout)
設(shè)置調(diào)用超時(shí)時(shí)間尚揣,默認(rèn)是30s,參數(shù)單位為ms
loadServerObject(configFormat)
加載服務(wù)默認(rèn)的配置項(xiàng)掖举,并且轉(zhuǎn)換為json
configFormat: {string} "c": c++ 格式的配置項(xiàng)(默認(rèn)值)快骗,"json": json格式配置項(xiàng)返回的對(duì)象內(nèi),key:文件名塔次,value:文件內(nèi)容

tarsConfig.loadServerObject().then(function() {
  console.log("serverObject", serverObject);
});

事件支持

configPushed

從TARS配置平臺(tái)push配置文件的時(shí)候方篮,觸發(fā)此事件

tarsConfig.on("configPushed", function(filename, content) {
  console.log("config pushed", filename, content);
});

dyeing

TARS 染色基礎(chǔ)模塊

@tars/dyeing

TARS染色基礎(chǔ)模塊,提供獲取與判斷染色對(duì)象的方法励负。
使用者:不應(yīng)該直接使用此模塊藕溅,而應(yīng)使用其他符合染色標(biāo)準(zhǔn)的模塊獲取染色對(duì)象
模塊開(kāi)發(fā)者:獲取TARS染色對(duì)象,應(yīng)使用此模塊的gen()方法獲取染色對(duì)象

染色(簡(jiǎn)介)

染色是在接口的調(diào)用鏈(服務(wù)端<==>客戶端)上傳遞的一種狀態(tài)继榆,用于標(biāo)識(shí)一次特定的請(qǐng)求處理過(guò)程巾表。
這種狀態(tài)由一個(gè)標(biāo)志位與附加信息KEY(可選)構(gòu)成。
調(diào)用鏈上的服務(wù)可以設(shè)置(發(fā)起)與讀取(接收)這種狀態(tài)裕照,并作對(duì)應(yīng)的處理(如輸出對(duì)應(yīng)的日志、特性)调塌。
在系統(tǒng)中晋南,染色由此模塊與其對(duì)應(yīng)的約定構(gòu)成。

標(biāo)準(zhǔn)(約定)

如模塊使用染色體系羔砾,則需遵守如下約定(與此同時(shí)负间,我們將符合約定的模塊稱之為符合染色標(biāo)準(zhǔn)的模塊)

  1. 提供getDyeingObj()方法,返回染色對(duì)象姜凄。
  2. 通過(guò)@tars/dyeing.gen()方法政溃,生成染色對(duì)象。
  3. 通過(guò)@tars/dyeing.is()方法态秧,判斷染色對(duì)象是否有效董虱。
模塊方法

TarsDyeing.gen(dyeing[, key, args])
通過(guò)調(diào)用此方法,可獲得染色對(duì)象:
dyeing:是否需要染色
key:染色添加附加信息KEY(可選)
args:程序的附加參數(shù)(可選)
key會(huì)通過(guò)調(diào)用鏈傳遞給下一個(gè)服務(wù),而args僅只會(huì)在當(dāng)前的染色對(duì)象中有效(并不會(huì)進(jìn)行傳遞)
請(qǐng)注意:染色對(duì)象與染色發(fā)起原因愤诱,這是不同的(東西)云头。此模塊僅關(guān)心染色對(duì)象,而不關(guān)心染色發(fā)起原因淫半。
TarsDyeing.is(obj)
調(diào)用此方法溃槐,可以判斷一個(gè)傳入的對(duì)象是否是染色對(duì)象。
如傳入空對(duì)象科吭,方法同樣返回false

染色對(duì)象 屬性

dyeingObj.dyeing
是否需要染色昏滴,此為Boolean
dyeingObj.key
染色傳遞的附加信息,此為String且可選值对人,不一定存在
dyeingObj.args
染色對(duì)象本身的附加信息谣殊,業(yè)務(wù)代碼不應(yīng)將其在服務(wù)間進(jìn)行傳遞(僅作為本地參數(shù)使用)。此對(duì)象類型不限规伐,同時(shí)也為可選值

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蟹倾,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子猖闪,更是在濱河造成了極大的恐慌鲜棠,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件培慌,死亡現(xiàn)場(chǎng)離奇詭異豁陆,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)吵护,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)盒音,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人馅而,你說(shuō)我怎么就攤上這事祥诽。” “怎么了瓮恭?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵雄坪,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我屯蹦,道長(zhǎng)维哈,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任登澜,我火速辦了婚禮阔挠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘脑蠕。我一直安慰自己购撼,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著份招,像睡著了一般切揭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上锁摔,一...
    開(kāi)封第一講書(shū)人閱讀 51,624評(píng)論 1 305
  • 那天廓旬,我揣著相機(jī)與錄音,去河邊找鬼谐腰。 笑死孕豹,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的十气。 我是一名探鬼主播励背,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼砸西!你這毒婦竟也來(lái)了叶眉?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤芹枷,失蹤者是張志新(化名)和其女友劉穎衅疙,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體鸳慈,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡饱溢,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了走芋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绩郎。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖翁逞,靈堂內(nèi)的尸體忽然破棺而出肋杖,到底是詐尸還是另有隱情,我是刑警寧澤挖函,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布状植,位于F島的核電站,受9級(jí)特大地震影響挪圾,放射性物質(zhì)發(fā)生泄漏浅萧。R本人自食惡果不足惜逐沙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一哲思、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧吩案,春花似錦棚赔、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)丧肴。三九已至,卻和暖如春胧后,著一層夾襖步出監(jiān)牢的瞬間芋浮,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工壳快, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留纸巷,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓眶痰,卻偏偏與公主長(zhǎng)得像瘤旨,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子竖伯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容