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

jopen 12年前

随着云计算的兴起,很多厂商都推出了自己的云计算平台,如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命令行工具)

用户级别及难度:

  • 全部用户

  • 适中

范例文件:

通过本文将学会:

  • 掌握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方案,所以直接双击下载后的安装包即可。

    • 重启系统。

    </li>
  • 验证:

    • 在cmd中键入:node -v / npm -v 如果出现相应的版本号,则安装成功。

    • </ul> </li> </ul>

      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(需配置在系统环境变量,而非用户环境变量)

          </li>
        • 重启系统。

        • </ul> </li>
        • 验证:

          • 在cmd中键入:ruby -v / gem -v 如果出现版本号,则安装成功。

          • </ul> </li> </ul>

            vmc的安装:

            • 安装:

              • 使用gem安装vmc,在cmd中键入gem install vmc。(无需重启)

              </li>
            • 验证:

              • 在cmd中键入vmc -v,如果出现版本号,则安装成功。

              • </ul> </li> </ul>

                vmc的使用:

                • 建立连接:

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

                  </li>
                • 建立账户:

                  • 通过网站建立:在http://www.cloudfoundry.com/建立账户。

                  • 通过vmc建立,在cmd中键入:vmc add-user [--email, --passwd]。

                  • </ul> </li>
                  • 登陆:

                    • 在cmd中键入:vmc login(根据提示输入注册时的邮箱地址及密码)

                    • </ul> </li>
                    • 建立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!" );
                      • </ul> </li> </ul>
                        • 本机测试:

                          • 定位到testcf根目录,在cmd中键入:node index.js

                          • 控制台出现:“Server start up!”后,在浏览器中键入:http://loaclhost:3000,如显示“Hello from Cloud Foundry”,说明运行成功。

                          </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
                          • </ul> </li> </ul>

                                            注:上述英文比较简单,翻译略过。由于当前项目并没有使用数据库,所以
                                            不需要绑定(Binding)和建立(Create)任何Service。

                              • 在浏览器中键入:http://ks-test-cf.cloudfoundry.com/,如出现“Hello from Cloud Foundry”,说明运行成功。(与在本地运行效果一样)

                              </ul>

                              MongoDB的配置:

                              • 下载:

                                • http://www.mongodb.org/downloads

                                </li>
                              • 配置:

                                • 根据实际情况下载对应的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

                                  • </ul> </li>
                                  • 重启系统。

                                  • </ul> </li>
                                  • 验证:

                                    • 在cmd中键入:mongo --version 如出现版本号,则安装成功。

                                    • </ul> </li>
                                    • 使用:

                                      • 在本地建立一个文件夹,如:{盘符}:\mongodb\testdb。

                                      • 在cmd中键入:mongod --dbpath {盘符}:\mongodb\testdb,即可连接到本地数据库。

                                      • </ul> </li> </ul>

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

                                        Mongoose的配置:

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

                                        • 下载:

                                          • 在cmd中键入:npm install mongoose

                                          </li>
                                        • 验证:(如出现类似下图的内容,说明安装成功)

                                        • </ul>
                                          • 注意:

                                            • mongoose在安装的时候需要依赖于mongodb(Node.js模块)

                                            • 如mongodb模块未安装的话,mongoose会自动安装,如上图所示。

                                            • 独立安装mongodb,在cmd中键入:npm install mongodb(注意npm的版本必须要大于1.1.19,否则会出现错误)

                                            </li> </ul>

                                            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
                                              </li> </ul>
                                              • 注意:

                                                • 变量mongo可以不用定义为Object类型,只是为了与Cloud Foundry配合才这么处理。

                                                • Mongoose独特的Schame机制对应了Table数据结构。

                                                </li> </ul>

                                                连接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'
                                                  </li> </ul>
                                                  • 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

                                                      </li>
                                                    • 验证:

                                                      • gem install caldecott

                                                      • 如未出现任何错误信息,则安装成功。

                                                      • </ul> </li>
                                                      • 注意:

                                                        • 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

                                                        • </ul> </li> </ul> </li> </ul>

                                                                                注:上述版本的匹配已验证通过,其他版本未验证。

                                                          Node.js 连接MongoDB:(Cloud Foundry远程方式)

                                                          • 新建MongoDB Service:

                                                            • vmc create-service mongodb testdb

                                                            </li>
                                                          • 绑定Service到App(ks-test-cf):

                                                            • vmc bind-service testdb ks-test-cf
                                                              注:testdb是刚刚建立的MongoDB;ks-test-cf是之前上传(push)的App Name。

                                                            • </ul> </li>
                                                            • 对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'    }  }
                                                              • </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;    }  }
                                                                  </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>
                                                                    • 运行:

                                                                      • 在浏览器中键入: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
                                                                      </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
                                                                        </li> </ul>

                                                                                        注:其中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远程数据库”节进行配置。

                                                                          • 上述修改只给出关键代码,余下代码请看附件。

                                                                          </li> </ul>

                                                                          总结:

                                                                          • vmc需要Ruby环境。

                                                                          • 连接Cloud Foundry远程数据库需要Ruby的eventmachine、caldecott这两个包。

                                                                          • 安装caldecott需要DevKit的支持。

                                                                          • 通过增加Cloud Foundry系统变量:process.env.VCAP_SERVICES来进行当前环境的判断。

                                                                          来自:http://blog.csdn.net/kenshin520/article/details/8073325