天天看點

阿裡雲 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執行個體

<b>var</b> aly <b>=</b> require(‘aliyun-sdk’);

// 建立 ocs 的 memcached 執行個體

// 其中,host 為執行個體的 ip 位址

<b>var</b> memcached <b>=</b> aly.memcached.createclient(11211, host, {

  username<b>:</b> ocskey,

  password<b>:</b> ocssecret

});

// 向 ocs 中寫入資料

memcached.add(‘hello’, ‘world’, <b>function</b>(err, data) {

  // 如果寫入資料錯誤

  <b>if</b>(err) {

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

    <b>return</b>;

  }

  // 寫入資料成功,列印傳回值

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

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

// 向 ocs 中查詢資料

memcached.get(‘hello’, <b>function</b>(err, data) {

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

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

    memcached.end();

  // 如果查詢成功,列印傳回值

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

就像通路本地運作時記憶體中的對象一樣簡單,這展現了 nodejs 開發便捷性和 ocs 的易用性。但是不僅僅如此,本文将為大家介紹 nodejs 以及如何使用 nodejs 和 ocs sdk 建構高效,可靠,可擴充的web應用背景。

<b>nodejs </b><b>介紹</b><b></b>

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 引擎,并将其重建為可在伺服器上使用。太完美了!既然已經有一個不錯的解決方案可用,為何還要建立一種新語言呢?

<b>nodejs </b><b>的特點</b><b></b>

<b>高性能</b><b></b>

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

<b>非阻塞</b><b></b>

node采用一系列“非阻塞”庫來支援事件循環的方式。本質上就是為檔案系統、資料庫之類的資源提供接口。向檔案系統發送一個請求時,無需等待硬碟(尋址并檢索檔案),硬碟準備好的時候非阻塞接口會通知node。該模型以可擴充的方式簡化了對慢資源的通路, 直覺,易懂。尤其是對于熟悉 onmouseover、onclick 等 dom 事件的使用者,更有一種似曾相識的感覺。

<b>運作</b><b> javascript</b>

雖然讓 javascript 運作于伺服器端不是 nodejs 的獨特之處,但卻是其一強大功能。不得不承認,浏覽器環境限制了我們選擇程式設計語言的自由。任何伺服器與日益複雜的浏覽器用戶端應用程式間共享代碼的願望隻能通過 javascript 來實作。雖然還存在其他一些支援 javascript 在伺服器端 運作的平台,但因為上述特性,node發展迅猛,成為事實上的平台。

<b>阿裡雲</b><b> ocs sdk for nodejs</b>

阿裡雲 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 非常相似,隻不過所需要調用的接口不同而已。

<b>使用阿裡雲</b><b> ocs sdk </b><b>開發</b><b> web </b><b>應用</b><b></b>

在文章開始我們介紹了 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 執行個體

<b>var</b> app <b>=</b> require(“express”);

// 記憶體存儲 session

<b>var</b> session <b>=</b> require(‘express-session’)

// 使用 express 的 session 處理,并使用記憶體存儲機制

app.use(session({ secret<b>:</b> ‘keyboard cat’, cookie<b>:</b> { maxage<b>:</b> 60000 }}))

// 處理 http 請求,req 代表請求對象,res 代表傳回對象

app.use(<b>function</b>(req, res) {

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

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

  <b>var</b> sess <b>=</b> req.session

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

  <b>if</b> (sess.views) {

    sess.views<b>++</b>

    res.setheader(‘content-type’, ‘text/html’)

    res.write(‘&lt;p&gt;views: ‘ <b>+</b> sess.views <b>+</b> ‘&lt;/p&gt;’)

    res.write(‘&lt;p&gt;expires in: ‘ <b>+</b> (sess.cookie.maxage <b>/</b> 1000) <b>+</b> ‘s&lt;/p&gt;’)

    res.end()

  } <b>else</b> {

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

    sess.views <b>=</b> 1

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

})

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

繼續閱讀