使用Node.js + Mongodb構建基於Cloud Foundry的項目

隨着雲計算的興起,很多廠商都推出了自己的雲計算平臺,如VMware、Amazon、Google、Microsoft等。

本文將介紹VMware公司的雲計算平臺 - Cloud Foundry,本文將使用Node.js + MongoDB構建基於Cloud Foundry的項目。

必備知識:

Node.js和NPM命令行的使用。

Node.js的語法。

MongoDB的語法。

Mongoose的語法。

環境搭建:

Windows 7

Node.js + Ruby + vmc(Cloud Foundry CIL命令行工具)

用戶級別及難度:

全部用戶

適中

範例文件:


http://pan.baidu.com/share/link?shareid=30772&uk=2298510329

通過本文將學會:

掌握Node.js、Ruby、DevKit、vmc(Cloud Foundry CIL命令行工具)的環境配置。

使用tunnel連接Cloud Foundry遠程數據庫(MongoDB)的方式。

Node.js的配置:

下載:http://nodejs.org/download/ 

配置:


根據實際情況下載對應的node.js安裝包。(選擇的版本儘量與Cloud Foundry的Node.js環境保持一致)

由於使用了msi方案,所以直接雙擊下載後的安裝包即可。

重啓系統。

驗證:


在cmd中鍵入:node -v / npm -v 如果出現相應的版本號,則安裝成功。

Ruby的配置:

Cloud Foundry的操作基於vmc(CIL命令行工具),安裝vmc前需要Ruby環境。

由於需要使用Devkit,所以此處的Ruby版本爲:1.9.2。(1.9.3在DevKit下有問題)

下載:https://rubyforge.org/frs/?group_id=167(請下載1.9.2-p290版本)

配置:


解壓到任意文件夾,如:{盤符}:\DevTools\ruby-1.9.2-p290。

在Windows環境變量中增加:

RUBY_HOME = {盤符}:\DevTools\ruby-1.9.2-p290

Path += %RUBY_HOME%\bin(需配置在系統環境變量,而非用戶環境變量)

重啓系統。

驗證:


在cmd中鍵入:ruby -v / gem -v 如果出現版本號,則安裝成功。

vmc的安裝:


安裝:

使用gem安裝vmc,在cmd中鍵入gem install vmc。(無需重啓)

驗證:

在cmd中鍵入vmc -v,如果出現版本號,則安裝成功。

vmc的使用:


建立連接:

vmc target api.cloudfoundry.com (指定Cloud Foundry API地址)

建立賬戶:

通過網站建立:在http://www.cloudfoundry.com/建立賬戶。

通過vmc建立,在cmd中鍵入:vmc add-user [--email, --passwd]。

登陸:

在cmd中鍵入:vmc login(根據提示輸入註冊時的郵箱地址及密碼)

建立app(Node.js):

在本地建立文件夾,如:{盤符}:\nodejs\local\testcf

定位到testcf根目錄,在cmd中鍵入:npm install express

在testcf文件夾中新增index.js文件,並鍵入如下內容:

var express = require('express');

var app = express();

app.get('/', function(req, res) {

res.send('Hello from Cloud Foundry');

});

app.listen( process.env.VMC_APP_PORT || 3000 );

console.log( "Server start up!" );

本機測試:


定位到testcf根目錄,在cmd中鍵入:node index.js

控制檯出現:“Server start up!”後,在瀏覽器中鍵入:http://loaclhost:3000,如顯示“Hello from Cloud Foundry”,說明運行成功。

上傳App到Cloud Foundry:

定位到testcf根目錄,在cmd中鍵入:vmc push --runtime=node08,生成如下的內容:

Would you like to deploy from the current directory? [Yn]: y

Application Name: ks-test-cf

Detected a Node.js Application, is this correct? [Yn]: y

Application Deployed URL [ks-test-cf.cloudfoundry.com]:

Memory reservation (128M, 256M, 512M, 1G, 2G) [64M]: 128

How many instances? [1]: 1

Bind existing services to 'ks-test-cf'? [yN]: n

Create services to bind to 'ks-test-cf'? [yN]: n

Would you like to save this configuration? [yN]: y

Manifest written to manifest.yml.

Creating Application: OK

Uploading Application:

Checking for available resources: OK

Processing resources: OK

Packing application: OK

Uploading (22K): OK

Push Status: OK

Staging Application 'ks-test-cf': OK

Starting Application 'ks-test-cf': OK

注:上述英文比較簡單,翻譯略過。由於當前項目並沒有使用數據庫,所以

不需要綁定(Binding)和建立(Create)任何Service。

在瀏覽器中鍵入:http://ks-test-cf.cloudfoundry.com/ ,如出現“Hello from Cloud Foundry”,說明運行成功。(與在本地運行效果一樣)

MongoDB的配置:


下載:

http://www.mongodb.org/downloads 

配置:

根據實際情況下載對應的MongoDB壓縮包。

注:由於Cloud Foundry對應MongoDB的版本是2.0,所以避免出現本地測試環境與Cloud Foundry不一致的情況,儘量選擇相應版本。

解壓到任意文件夾,如:{盤符}:\DevTools\mongodb-2.0.7。

在Windows環境變量中增加:

MONGODB_HOME = {盤符}:\DevTools\mongodb-2.0.7

Path += %MONGODB_HOME%\bin

重啓系統。

驗證:

在cmd中鍵入:mongo --version 如出現版本號,則安裝成功。

使用:

在本地建立一個文件夾,如:{盤符}:\mongodb\testdb。

在cmd中鍵入:mongod --dbpath {盤符}:\mongodb\testdb,即可連接到本地數據庫。

注:可以使用MongoVUE等客戶端操作MongoDB。

Mongoose的配置:


Mongoose是第三方的Noe.js模塊,可以更方便的操作MongoDB。

下載:

在cmd中鍵入:npm install mongoose

驗證:(如出現類似下圖的內容,說明安裝成功)




注意:

mongoose在安裝的時候需要依賴於mongodb(Node.js模塊)

如mongodb模塊未安裝的話,mongoose會自動安裝,如上圖所示。

獨立安裝mongodb,在cmd中鍵入:npm install mongodb(注意npm的版本必須要大於1.1.19,否則會出現錯誤)

Node.js 連接MongoDB:(Localhost本地方式)

Mongoose的引入:


var db = require( 'mongoose' );

定義一個Object結構:(爲了與Cloud Foundry配合)

mongo = {

'hostname' : 'localhost',

'port' : 27017,

'username' : '',

'password' : '',

'db' : testdb

}

注:hostname、port和db這三個屬性。(應與你的開發環境相對應)

生成mongoose連接mongodb時的URL字符串:

var generate_mongo_url = function( mongo ) {

return 'mongodb://' + mongo.hostname + ':' + mongo.port + '/' + mongo.db;

}

連接數據庫(MongoDB):

db.connect( mongourl );

建立Schame及模型:

var Schema = db.Schema,

ObjectId = Schema.ObjectId;

var testSchema = new Schema({

host : String,

dbs : String,

time : Date

});

綁定模型:

var TestModule = db.model( 'test-cloudfoundry', testSchema );

注:test-cloudfoundry是Collection的名字(Collection相當於SQL的Table概念)

保存數據到Collection:

var test = new TestModule();

test.host = mongo.hostname;

test.dbs = mongo.db;

test.time = new Date();

test.save( function( err ) {

if (!err) {

console.log( 'save complete' )

}

else {

console.log( 'save error = ' + err )

}

});

注:save方法相當於SQL的Insert語句,同時Mongoose還定義了回調函數

以供使用。

運行:

使用mongod --dbpath的方式連接到本地的MongoDB。

定位到test-cf根目錄,在cmd中鍵入:node index.js。

在瀏覽器中訪問http://localhost:3000/,在cmd中出現如下內容,則說明調用MongoDB成功。

mongodb url : mongodb://localhost:2701

/testdbServer start at http://localhost:3000

save complete

注意:

變量mongo可以不用定義爲Object類型,只是爲了與Cloud Foundry配合才這麼處理。

Mongoose獨特的Schame機制對應了Table數據結構。

連接Cloud Foundry遠程數據庫:

安裝:


gem install eventmachine --pre

gem install caldecott(如出現異常或如下錯誤,則需要安裝DevKit,否則跳過本節)

Please update your PATH to include build tools or download the DevKit

from 'http://rubyinstaller.org/downloads' and follow the instruction

at 'http://github.com/oneclick/rubyinstaller/wiki/Development-Kit'

DevKit的安裝:


下載:http://rubyinstaller.org/downloads/

配置:

解壓到任意文件夾,如{盤符}:\DevTools\devkit-4.5.2

定位到devkit-4.5.2根目錄,在cmd中鍵入:ruby dk.rb init

正確安裝後,會生成config.yml文件,編輯此文件並鍵入ruby所在的目錄,格式:- {盤符}:/DevTools/ruby-1.9.2-p290(注意橫崗、斜槓)

ruby dk.rb review(檢查要添加DevKit支持的Ruby列表是否有誤,可以略過)

ruby dk.rb install

驗證:

gem install caldecott

如未出現任何錯誤信息,則安裝成功。

注意:

DevKit版本號:DevKit-tdm-32-4.5.2-20111229-1559-sfx.exe

DevKit-tdm-32-4.5.2-20111229-1559-sfx.exe對應的Ruby版本:1.9.2-p290

注:上述版本的匹配已驗證通過,其他版本未驗證。

Node.js 連接MongoDB:(Cloud Foundry遠程方式)

新建MongoDB Service:

vmc create-service mongodb testdb

綁定Service到App(ks-test-cf):

vmc bind-service testdb ks-test-cf

注:testdb是剛剛建立的MongoDB;ks-test-cf是之前上傳(push)的App Name。

對Node.js連接本地MongoDB進行改造:

修改mongo變量:

if( process.env.VCAP_SERVICES ) {

var env = JSON.parse( process.env.VCAP_SERVICES );

mongo = env[ 'mongodb-2.0' ][ 0 ][ 'credentials' ];

}

else {

mongo = {

'hostname' : 'localhost',

'port' : 27017,

'username' : '',

'password' : '',

'db' : 'testdb'

}

}

注:增加判斷當前環境的邏輯,process.env.VCAP_SERVICES是Node.js

提供的系統變量(JSON),保存了當前登陸Cloud Foundry App

(ks-test-cf)的必要信息。

修改generate_mongo_url方法:

var generate_mongo_url = function( obj ) {

if( process.env.VCAP_SERVICES ) {

return 'mongodb://' + obj.username + ':' + obj.password + '@' + obj.hostname + ':' + obj.port + '/' + obj.db;

}

else {

return 'mongodb://' + obj.hostname + ':' + obj.port + '/' + obj.db;

}

}

注:加入了當前環境爲Cloud Foundry時,生成mongodb字符串的邏輯,

相對本地連接url來說,增加了username、password。

更新:

定位到testcf根目錄,在cmd中鍵入:vmc update ks-test-cf,如出現下面的內容,則說明更新成功:

Uploading Application:

Checking for available resources: OK

Processing resources: OK

Packing application: OK

Uploading (26K): OK

Push Status: OK

Stopping Application 'ks-test-cf': OK

Staging Application 'ks-test-cf': OK

Starting Application 'ks-test-cf': OK

運行:

在瀏覽器中鍵入:http://ks-test-cf.cloudfoundry.com/

在cmd中鍵入:vmc logs ks-test-cf(查看ks-test-cf的後臺打印信息)

Server start up!

mongodb url : mongodb:/XXXXXXXXXXX:[email protected]:25176/db

Server start at http://172.30.50.21:12265

save complete

遠程連接Cloud Foundry數據庫(testdb):

在cmd中鍵入:vmc tunnel testdb,會出現如下內容:

Binding Service [testdb]: OK

Stopping Application 'caldecott': OK

Staging Application 'caldecott': OK

Starting Application 'caldecott': OK

Getting tunnel connection info: OK

Service connection info:

username : XXXXXXXXXXX

password : XXXXXXXXXXX

name : db

url : mongodb://XXXXXXXXXXX:[email protected]:25176/db

Starting tunnel to testdb on port 10000.

1: none

2: mongo

3: mongodump

4: mongorestore

Which client would you like to start

注:其中username和password是Cloud Foundry系統生成,在這裏已經隱

去。選擇1,可以使用本地客戶端進行連接,如之前提到的MongoVUE。

MongoVUE的連接:




注:Service、Port按照如上填寫;Username、Password、Database(s)

按照Cloud Foundry給出的內容填寫。

注意:

注意env[ 'mongodb-2.0' ][ 0 ][ 'credentials' ]中的'mongodb-2.0'指:MongoDB的版本號。

使用vmc tunnel testdb的時候,需要根據“連接Cloud Foundry遠程數據庫”節進行配置。

上述修改只給出關鍵代碼,餘下代碼請看附件。

總結:

vmc需要Ruby環境。

連接Cloud Foundry遠程數據庫需要Ruby的eventmachine、caldecott這兩個包。

安裝caldecott需要DevKit的支持。

通過增加Cloud Foundry系統變量:process.env.VCAP_SERVICES來進行當前環境的判斷。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章