使用Node.js + Mongodb構建基于Cloud Foundry的項目
隨著云計算的興起,很多廠商都推出了自己的云計算平臺,如VMware、Amazon、Google、Microsoft等。
本文將介紹VMware公司的云計算平臺 - Cloud Foundry,本文將使用Node.js + MongoDB構建基于Cloud Foundry的項目。
必備知識:
-
Node.js和NPM命令行的使用。
</li> -
Node.js的語法。
</li> -
MongoDB的語法。
</li> -
Mongoose的語法。
</li> </ul>環境搭建:
-
Windows 7
</li> -
Node.js + Ruby + vmc(Cloud Foundry CIL命令行工具)
</li> </ul>用戶級別及難度:
-
全部用戶
</li> -
適中
</li> </ul>范例文件:
-
http://pan.baidu.com/share/link?shareid=30772&uk=2298510329
</li> </ul>通過本文將學會:
-
掌握Node.js、Ruby、DevKit、vmc(Cloud Foundry CIL命令行工具)的環境配置。
</li> -
使用tunnel連接Cloud Foundry遠程數據庫(MongoDB)的方式。
</li> </ul>Node.js的配置:
-
下載:http://nodejs.org/download/
</li> -
配置:
-
根據實際情況下載對應的node.js安裝包。(選擇的版本盡量與Cloud Foundry的Node.js環境保持一致)
</li> -
由于使用了msi方案,所以直接雙擊下載后的安裝包即可。
</li> -
重啟系統。
</li> </ul> </li> -
驗證:
-
在cmd中鍵入:node -v / npm -v 如果出現相應的版本號,則安裝成功。
</li> </ul> </li> </ul>Ruby的配置:
-
Cloud Foundry的操作基于vmc(CIL命令行工具),安裝vmc前需要Ruby環境。
</li> -
由于需要使用Devkit,所以此處的Ruby版本為:1.9.2。(1.9.3在DevKit下有問題)
</li> -
下載:https://rubyforge.org/frs/?group_id=167(請下載1.9.2-p290版本)
</li> -
配置:
-
解壓到任意文件夾,如:{盤符}:\DevTools\ruby-1.9.2-p290。
</li> -
在Windows環境變量中增加:
-
RUBY_HOME = {盤符}:\DevTools\ruby-1.9.2-p290
</li> -
Path += %RUBY_HOME%\bin(需配置在系統環境變量,而非用戶環境變量)
</li> </ul> </li> -
重啟系統。
</li> </ul> </li> -
驗證:
-
在cmd中鍵入:ruby -v / gem -v 如果出現版本號,則安裝成功。
</li> </ul> </li> </ul>vmc的安裝:
-
安裝:
-
使用gem安裝vmc,在cmd中鍵入gem install vmc。(無需重啟)
</li> </ul> </li> -
驗證:
-
在cmd中鍵入vmc -v,如果出現版本號,則安裝成功。
</li> </ul> </li> </ul>vmc的使用:
-
建立連接:
-
vmc target api.cloudfoundry.com(指定Cloud Foundry API地址)
</li> </ul> </li> -
建立賬戶:
-
通過網站建立:在http://www.cloudfoundry.com/建立賬戶。
</li> -
通過vmc建立,在cmd中鍵入:vmc add-user [--email, --passwd]。
</li> </ul> </li> -
登陸:
-
在cmd中鍵入:vmc login(根據提示輸入注冊時的郵箱地址及密碼)
</li> </ul> </li> -
建立app(Node.js):
-
在本地建立文件夾,如:{盤符}:\nodejs\local\testcf
</li> -
定位到testcf根目錄,在cmd中鍵入:npm install express
</li> -
在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!" );
</li> </ul> </li> </ul>-
本機測試:
-
定位到testcf根目錄,在cmd中鍵入:node index.js
</li> -
控制臺出現:“Server start up!”后,在瀏覽器中鍵入:http://loaclhost:3000,如顯示“Hello from Cloud Foundry”,說明運行成功。
</li> </ul> </li> -
上傳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
</li> </ul> </li> </ul>注:上述英文比較簡單,翻譯略過。由于當前項目并沒有使用數據庫,所以
不需要綁定(Binding)和建立(Create)任何Service。-
在瀏覽器中鍵入:http://ks-test-cf.cloudfoundry.com/,如出現“Hello from Cloud Foundry”,說明運行成功。(與在本地運行效果一樣)
</li> </ul> </ul>MongoDB的配置:
-
下載:
-
http://www.mongodb.org/downloads
</li> </ul> </li> -
配置:
-
根據實際情況下載對應的MongoDB壓縮包。
</li>
注:由于Cloud Foundry對應MongoDB的版本是2.0,所以避免出現本地測試環境與Cloud Foundry不一致的情況,盡量選擇相應版本。 -
解壓到任意文件夾,如:{盤符}:\DevTools\mongodb-2.0.7。
</li> -
在Windows環境變量中增加:
-
MONGODB_HOME = {盤符}:\DevTools\mongodb-2.0.7
</li> -
Path += %MONGODB_HOME%\bin
</li> </ul> </li> -
重啟系統。
</li> </ul> </li> -
驗證:
-
在cmd中鍵入:mongo --version 如出現版本號,則安裝成功。
</li> </ul> </li> -
使用:
-
在本地建立一個文件夾,如:{盤符}:\mongodb\testdb。
</li> -
在cmd中鍵入:mongod --dbpath {盤符}:\mongodb\testdb,即可連接到本地數據庫。
</li> </ul> </li> </ul>注:可以使用MongoVUE等客戶端操作MongoDB。
Mongoose的配置:
-
Mongoose是第三方的Noe.js模塊,可以更方便的操作MongoDB。
</li> -
下載:
-
在cmd中鍵入:npm install mongoose
</li> </ul> </li> -
驗證:(如出現類似下圖的內容,說明安裝成功)
</li> </ul>-
注意:
-
mongoose在安裝的時候需要依賴于mongodb(Node.js模塊)
</li> -
如mongodb模塊未安裝的話,mongoose會自動安裝,如上圖所示。
</li> -
獨立安裝mongodb,在cmd中鍵入:npm install mongodb(注意npm的版本必須要大于1.1.19,否則會出現錯誤)
</li> </ul> </li> </ul>Node.js 連接MongoDB:(Localhost本地方式)
-
Mongoose的引入:
var db = require( 'mongoose' );
</li> </ul>-
定義一個Object結構:(為了與Cloud Foundry配合)
mongo = { 'hostname' : 'localhost', 'port' : 27017, 'username' : '', 'password' : '', 'db' : testdb }
</li> </ul>注:hostname、port和db這三個屬性。(應與你的開發環境相對應)
-
生成mongoose連接mongodb時的URL字符串:
var generate_mongo_url = function( mongo ) { return 'mongodb://' + mongo.hostname + ':' + mongo.port + '/' + mongo.db; }
</li> </ul>-
連接數據庫(MongoDB):
db.connect( mongourl );
</li> </ul>-
建立Schame及模型:
var Schema = db.Schema, ObjectId = Schema.ObjectId; var testSchema = new Schema({ host : String, dbs : String, time : Date });
</li> </ul>-
綁定模型:
var TestModule = db.model( 'test-cloudfoundry', testSchema );
</li> </ul>注: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 ) } });
</li> </ul>注:save方法相當于SQL的Insert語句,同時Mongoose還定義了回調函數
以供使用。-
運行:
-
使用mongod --dbpath的方式連接到本地的MongoDB。
</li> -
定位到test-cf根目錄,在cmd中鍵入:node index.js。
</li> -
在瀏覽器中訪問http://localhost:3000/,在cmd中出現如下內容,則說明調用MongoDB成功。
mongodb url : mongodb://localhost:2701 /testdbServer start at http://localhost:3000 save complete
</li> </ul> </li> </ul>-
注意:
-
變量mongo可以不用定義為Object類型,只是為了與Cloud Foundry配合才這么處理。
</li> -
Mongoose獨特的Schame機制對應了Table數據結構。
</li> </ul> </li> </ul>連接Cloud Foundry遠程數據庫:
-
安裝:
-
gem install eventmachine --pre
</li> -
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'
</li> </ul> </li> </ul>-
DevKit的安裝:
-
下載:http://rubyinstaller.org/downloads/
</li> -
配置:
-
解壓到任意文件夾,如{盤符}:\DevTools\devkit-4.5.2
</li> -
定位到devkit-4.5.2根目錄,在cmd中鍵入:ruby dk.rb init
</li> -
正確安裝后,會生成config.yml文件,編輯此文件并鍵入ruby所在的目錄,格式:- {盤符}:/DevTools/ruby-1.9.2-p290(注意橫崗、斜杠)
</li> -
ruby dk.rb review(檢查要添加DevKit支持的Ruby列表是否有誤,可以略過)
</li> -
ruby dk.rb install
</li> </ul> </li> -
驗證:
-
gem install caldecott
</li> -
如未出現任何錯誤信息,則安裝成功。
</li> </ul> </li> -
注意:
-
DevKit版本號:DevKit-tdm-32-4.5.2-20111229-1559-sfx.exe
</li> -
DevKit-tdm-32-4.5.2-20111229-1559-sfx.exe對應的Ruby版本:1.9.2-p290
</li> </ul> </li> </ul> </li> </ul>注:上述版本的匹配已驗證通過,其他版本未驗證。
Node.js 連接MongoDB:(Cloud Foundry遠程方式)
-
新建MongoDB Service:
-
vmc create-service mongodb testdb
</li> </ul> </li> -
綁定Service到App(ks-test-cf):
-
vmc bind-service testdb ks-test-cf
</li> </ul> </li>
注: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' } }
</li> </ul> </li> </ul>注:增加判斷當前環境的邏輯,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; } }
</li> </ul> </ul>注:加入了當前環境為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
</li> </ul> </li> </ul>-
運行:
-
在瀏覽器中鍵入:http://ks-test-cf.cloudfoundry.com/
</li> -
在cmd中鍵入:vmc logs ks-test-cf(查看ks-test-cf的后臺打印信息)
Server start up! mongodb url : mongodb:/XXXXXXXXXXX:XXXXXXXXXXX@172.30.48.68:25176/db Server start at http://172.30.50.21:12265 save complete
</li> </ul> </li> </ul>-
遠程連接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:XXXXXXXXXXX@172.30.48.68:25176/db
Starting tunnel to testdb on port 10000. 1: none 2: mongo 3: mongodump 4: mongorestore
Which client would you like to start</pre></li> </ul> </li> </ul>
注:其中username和password是Cloud Foundry系統生成,在這里已經隱
去。選擇1,可以使用本地客戶端進行連接,如之前提到的MongoVUE。-
MongoVUE的連接:
</li> </ul>注:Service、Port按照如上填寫;Username、Password、Database(s)
按照Cloud Foundry給出的內容填寫。-
注意:
-
注意env[ 'mongodb-2.0' ][ 0 ][ 'credentials' ]中的'mongodb-2.0'指:MongoDB的版本號。
</li> -
使用vmc tunnel testdb的時候,需要根據“連接Cloud Foundry遠程數據庫”節進行配置。
</li> -
上述修改只給出關鍵代碼,余下代碼請看附件。
</li> </ul> </li> </ul>總結:
-
vmc需要Ruby環境。
</li> -
連接Cloud Foundry遠程數據庫需要Ruby的eventmachine、caldecott這兩個包。
</li> -
安裝caldecott需要DevKit的支持。
</li> -
通過增加Cloud Foundry系統變量:process.env.VCAP_SERVICES來進行當前環境的判斷。
</li> </ul> 來自:http://blog.csdn.net/kenshin520/article/details/8073325
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-