设为首页 收藏本站
查看: 1180|回复: 0

[经验分享] 使用Node.js + Mongodb构建基于Cloud Foundry的项目

[复制链接]

尚未签到

发表于 2015-7-8 11:34:10 | 显示全部楼层 |阅读模式
  致谢原作者
  原作者: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? [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
    }
           注:hostnameportdb这三个属性。(应与你的开发环境相对应)


  •   生成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-cloudfoundryCollection的名字(Collection相当于SQLTable概念)


  •   保存数据到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方法相当于SQLInsert语句,同时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是刚刚建立的MongoDBks-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_SERVICESNode.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来说,增加了usernamepassword


  •   更新:


    •   定位到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 [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

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


  •   MongoVUE的连接:
      

          注:ServicePort按照如上填写;UsernamePasswordDatabase(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、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-84454-1-1.html 上篇帖子: mongoDB心得——(一)基础篇 下篇帖子: mongodb 修改数据结构的一个例子以及小梳理
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表