閱讀897 返回首頁    go 阿裏雲 go 技術社區[雲棲]


阿裏雲 OCS SDK for NodeJS介紹

作者:熊亮

 

阿裏雲 SDK for NodeJS 是為 NodeJS 開發者提供使用阿裏雲各項服務的統一入口,由阿裏雲UED團隊負責開發維護。目前集成了OCS(Memcached), OSS, RDS(MySQL) 三項阿裏雲服務。代碼地址:https://github.com/aliyun-UED/aliyun-sdk-js

 

使用阿裏雲 OCS SDK for NodeJS 接入阿裏雲 OCS 將會變得非常簡單。當你通過試用或者購買獲得阿裏雲 OCS 服務的實例,即對應的 ocsKey, ocsSecret 後。使用如下代碼:

// 獲取阿裏雲SDK實例

var ALY = require(‘aliyun-sdk’);

// 創建 OCS memcached 實例

// 其中,host 為實例的 ip 地址

var memcached = ALY.MEMCACHED.createClient(11211, host, {

  username: ocsKey,

  password: ocsSecret

});

// OCS 中寫入數據

memcached.add(‘hello’, ‘world’, function(err, data) {

  // 如果寫入數據錯誤

  if(err) {

    console.log(‘add error:’, err);

    return;

  }

  // 寫入數據成功,打印返回值

  console.log(‘add success:’, data);

});

 

通過以上幾行代碼,我們就能非常簡單的接入並使用 OCS 的服務了。寫入後讀取也同樣非常簡單,如下:

// OCS 中查詢數據

memcached.get(‘hello’, function(err, data) {

  // 如果查詢錯誤或者失敗

  if(err) {

    console.log(‘get error:’, err);

    memcached.end();

    return;

  }

  // 如果查詢成功,打印返回值

  console.log(‘get success:’, data.val.toString());

});

 

就像訪問本地運行時內存中的對象一樣簡單,這體現了 NodeJS 開發便捷性和 OCS 的易用性。但是不僅僅如此,本文將為大家介紹 NodeJS 以及如何使用 NodeJS 和 OCS SDK 構建高效,可靠,可擴展的web應用後台。

 

NodeJS 介紹

Node.js是一個可以快速構建網絡服務及應用的平台 。該平台的構建是基於Chrome’s JavaScript runtime,也就是說,實際上它是對Google V8引擎(應用於Google Chrome瀏覽器)進行了封裝。

Node 本身運行 V8 JavaScript。什麼是 V8?V8 JavaScript 引擎是 Google 用於其 Chrome 瀏覽器的底層 JavaScript 引擎。很少有人考慮 JavaScript 在客戶機上實際做了些什麼?實際上,JavaScript 引擎負責解釋並執行代碼。Google 使用 V8 創建了一個用 C++ 編寫的超快解釋器,該解釋器擁有另一個獨特特征;您可以下載該引擎並將其嵌入任何 應用程序。V8 JavaScript 引擎並不僅限於在一個瀏覽器中運行。因此,Node 實際上會使用 Google 編寫的 V8 JavaScript 引擎,並將其重建為可在服務器上使用。太完美了!既然已經有一個不錯的解決方案可用,為何還要創建一種新語言呢?

 

NodeJS 的特點

 

高性能

V8引擎本身使用了一些最新的編譯技術。這使得用 Javascript 這類腳本語言編寫出來的代碼運行速度獲得了極大提升,卻節省了開發成本。對性能的苛求是Node的一個關鍵因素。 Javascript是一個事件驅動語言,Node利用了這個優點,編寫出可擴展性高的服務器。NodeJS 采用了一個稱為“事件循環(event loop)”的架構,使得編寫可擴展性高的服務器變得既容易又安全。提高服務器性能的技巧有多種多樣。NodeJS 選擇了一種既能提高性能,又能減低開發複雜度的架構。這是一個非常重要的特性。並發編程通常很複雜且布滿地雷。NodeJS 繞過了這些,但仍提供很好的性能。

 

非阻塞

Node采用一係列“非阻塞”庫來支持事件循環的方式。本質上就是為文件係統、數據庫之類的資源提供接口。向文件係統發送一個請求時,無需等待硬盤(尋址並檢索文件),硬盤準備好的時候非阻塞接口會通知Node。該模型以可擴展的方式簡化了對慢資源的訪問, 直觀,易懂。尤其是對於熟悉 onmouseover、onclick 等 DOM 事件的用戶,更有一種似曾相識的感覺。

 

運行 Javascript

雖然讓 Javascript 運行於服務器端不是 NodeJS 的獨特之處,但卻是其一強大功能。不得不承認,瀏覽器環境限製了我們選擇編程語言的自由。任何服務器與日益複雜的瀏覽器客戶端應用程序間共享代碼的願望隻能通過 Javascript 來實現。雖然還存在其他一些支持 Javascript 在服務器端 運行的平台,但因為上述特性,Node發展迅勐,成為事實上的平台。

 

阿裏雲 OCS SDK for NodeJS

阿裏雲 OCS 服務采用的是基於 SASL 認證的 Memcached 二進製傳輸協議。實現該協議的 NodeJS 開源模塊很少,有一些模塊如 memjs 雖然實現了 SASL 認證和 Memcached 二進製傳輸協議,但是不支持命令隊列即在一個命令返回數據之前無法執行新的命令,這在實際項目開發中是無法接受的。因此,阿裏雲 OCS SDK for NodeJS 基於 memjs 增加了命令隊列,異常處理,自動重新連接等功能,使 NodejS 開發者快速接入阿裏雲 OCS 服務成為可能。

該開源項目代碼托管在 https://github.com/aliyun-UED/node_memcached ,歡迎有興趣的同學貢獻代碼。

另外,一定會有人問到 Redis 的問題。Redis 是一種常用的開源內存鍵值存儲係統,可支持有序集合和列表等數據結構。Redis 在 NodeJS 社區中比較常見,而且也有很多成熟的模塊支持。在阿裏雲 OCS 服務後續集成 Redis 後開發者可以自行選擇 Memcached 或者 Redis 作為存儲係統,我們屆時也會將 Redis SDK 集成到阿裏雲 SDK for NodeJS 中。不過對於開發者來說在代碼開發方式上,Memcached 與 Redis 非常相似,隻不過所需要調用的接口不同而已。

 

使用阿裏雲 OCS SDK 開發 web 應用

在文章開始我們介紹了 OCS SDK 的最基本用法,比如我們想記錄 web 應用的總訪問量,可以在 OCS 中使用一個 key 代表這個總訪問量,每當產生用戶訪問的時候,可以從 OCS 中讀取 key 的值 value,將 value + 1 後再保存到 key。在這個場景中使用 OCS 在合適不過了,因為我們可能有多個 ECS 實例作為 web server,它們可以向同一個 OCS 做讀寫操作;另外也不用擔心 ECS 實例掛掉後總訪問量這個數據消失的問題;最後, OCS 的高性能也保證了我們的業務需求。

除此之外,使用 OCS 最合適的地方就是 session 存儲了。在 web 服務器上的 session 可以存儲在

  • 內存
  • 磁盤文件係統
  • 數據庫
  • Memcached 等緩存係統

從性能,可用性角度考慮,存儲在 Memcached 是最好的選擇。那麼在 NodeJS 中該如何實現呢。

一般來說,開發 NodeJS web 應用需要選擇一個合適的 web 框架,我們以目前最流行的 web 框架 Express 舉例。

Express 框架內建了對 session 處理的支持,它默認的 session 存儲機製是內存存儲,而將其他 session 存儲機製作為可擴展選項。如下代碼所示:

// 創建一個 express 實例

var app = require(“express”);

// 內存存儲 session

var session = require(‘express-session’)

// 使用 express session 處理,並使用內存存儲機製

app.use(session({ secret: ‘keyboard cat’, cookie: { maxAge: 60000 }}))

// 處理 HTTP 請求,req 代表請求對象,res 代表返回對象

app.use(function(req, res) {

  // sess 即為該請求所對應的用戶的 session,不用擔心,express 已經幫你分析請求所帶的 cookie

  // 並將該 cookie 所對應的 session 從存儲中找到並提供給你

  var sess = req.session

  // 下麵是對 session 對象的處理

  if (sess.views) {

    sess.views++

    res.setHeader(‘Content-Type’, ‘text/html’)

    res.write(‘<p>views: ‘ + sess.views + ‘</p>’)

    res.write(‘<p>expires in: ‘ + (sess.cookie.maxAge / 1000) + ‘s</p>’)

    res.end()

  } else {

    // 更新後的 session 會在請求處理結束後自動寫回到 session 的存儲中

    sess.views = 1

    res.end(‘welcome to the session demo. refresh!’)

  }

})

 

從上麵的代碼中可見,我們隻需要實現 session 的存儲機製,便能夠和 express 完美的結合了。

最後更新:2017-04-03 05:39:50

  上一篇:go HDU1711-Number Sequence
  下一篇:go 線程同步之Semaphore