lanying56123 发表于 2015-7-8 11:34:10

使用Node.js + Mongodb构建基于Cloud Foundry的项目

  致谢原作者
  原作者:Kenshin
  原文地址:http://t.k-zone.cn/post/2012-09-13/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? : y
Application Name: ks-test-cf
Detected a Node.js Application, is this correct? : y
Application Deployed URL :
Memory reservation (128M, 256M, 512M, 1G, 2G) : 128
How many instances? : 1
Bind existing services to 'ks-test-cf'? : n
Create services to bind to 'ks-test-cf'? : n
Would you like to save this configuration? : 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


[*]  验证:(如出现类似下图的内容,说明安装成功)
  http://m2.img.libdd.com/farm4/2012/0913/13/96FA62BA60A7973435B2FF9F84940B7A32E1B38D7D8E_500_109.jpg



[*]  注意:


[*]  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:XXXXXXXXXXX@172.30.48.68:25176/db
Server start at http://172.30.50.21:12265
save complete



[*]  远程连接Cloud Foundry数据库(testdb):


[*]  在cmd中键入:vmc tunnel testdb,会出现如下内容:

Binding Service : 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

  注:其中username和password是Cloud Foundry系统生成,在这里已经隐                  去。选择1,可以使用本地客户端进行连接,如之前提到的MongoVUE。


[*]  MongoVUE的连接:
  http://m1.img.libdd.com/farm4/2012/0913/13/0C05C346DAD3BEA15C55FBD23BFDE069697F1A5EF698_340_390.PNG

        注: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来进行当前环境的判断。

页: [1]
查看完整版本: 使用Node.js + Mongodb构建基于Cloud Foundry的项目