protobuf.js

當我們建立service oriented architecture服務時,經常會跟各種不同的backend service 交換資料。一般在跨團隊合作情況下,可能其中一方會提出所需要資既既協議,而交換既格式都有好多種,例如 json, xml 或者 thrift.

很多時候我們會使用json 或者xml 作為資料交換既格式,特別是習慣web開發的工程師。不過經常會遇到下面幾個問題:

  1. 相方協議好的資料不對稱做成程式錯誤
  2. 資料交換內容太大,導致傳輸速度慢
  3. 而且 xml/json 的解析速度慢

幸好Google 開源一個叫 Protocol Buffers (以下叫protobuf)。

先到Protocol Buffers 的 github 了解一下它到底是什麼?

Protocol Buffers (a.k.a., protobuf) are Google's language-neutral, platform-neutral, extensible mechanism for serializing structured data.

先介紹下 protobuf 在node.js環境下的使用方法。

  1. 首先安裝 protobufjs
> mkdir protobufjs.demo && cd protobufjs.demo
> npm install protobufjs --save
  1. 先定義 *.proto 文件,這次我使用的例子如下 (awesome.proto)
package awesomepackage;

message AwesomeMessage {  
    string awesome_field = 1; // becomes awesomeField
}
  1. 使用 protobufjs 將需要的資料 serialize
var protobuf = require("protobufjs");

protobuf.load ( "awesome.proto", function ( err, root) {  
        var AwesomeMessage = root.lookup("awesomepackage.AwesomeMessage");

    var message = AwesomeMessage.create({ awesomeField: "AwesomeString"});
    // console.log ( message) ;
    var buffer = AwesomeMessage.encode(message).finish();

    // var buffer = AwesomeMessage.encode({ awesomeField: "AwesomeString" }).finish();

    var message = AwesomeMessage.decode(buffer);
}) ;

除了 callback 之外,我們還可以使用promise 方式去使用protobuf.js

protobuf.load("awesome.proto")  
.then ( function (root) {
        // your code here ...
    // console.log ( root) ;
}) ;

其他資源 Protocol Buffers