基於Cloud Foundry平臺部署nodejs項目上線

   Cloud Foundry(如下簡稱CF),CFVmware公司的PaaS服務平臺,PaasPlatform as a Service,平臺即服務, 是爲開發者提供一個應用運行的平臺,有了這人平臺,開發者無需搭建線上應用運行環境和服務(Mysql/mongodb/Rabbitmq),包括硬件和軟件(os/應用軟件如tomcat/rails)環境。開發者可專一代碼開發,最終提供源碼(war包之類的)信息,上傳至PAAS,便可運行;同時pass平臺提供DNS服務,一些Webapp能夠直接完成上線。  css

  簡而言之,有了paas,開發者只須要提供源碼,便可瞬間啓動一個企業級的web service html

1. 註冊免費帳戶

        1) 登錄註冊網站http://my.cloudfoundry.com/signup進行註冊。node

        2) 輸入郵箱,註冊,而後出現以下提示git

        3)進入你的郵箱,打開驗證連接,根據提示輸入登陸密碼、用戶信息等github

        4)輸入正確的手機號,須要驗證碼驗證;web

        5)輸入組織名,後期可隨意修改sql

        6)申請成功mongodb

二、下載CF CLI(命令行終端)管理工具

    1上面最後一步已經提示很是清楚,根據你如今環境下載對應的管理工具;數據庫

    2)以windows環境爲例,下載安裝完成後,運行CMDexpress

        輸入cf命令,能夠查看全部相關命令操做選項

        若是出現一堆的使用信息,說明你已經安裝成功了……

三、關於CF CLI工具使用

      Getting Started with the cf CLI

1)登陸(cf login)

    cf login [-a API_URL] [-u USERNAME] [-p PASSWORD] [-o ORG] [-s SPACE]

       命令行:cf login -a https://api.run.pivotal.io 

                    email:user#example.com

                    Password:.....

    也可使用cf api, cf auth,cf target命令,來指定腳本文件來登陸;

    登陸成功後,默認狀況,CLI工具保存一個名爲config.json的配置文件到~/.cf目錄,其中包含你在pivotal上申請的組織名,空間大小,訪問令牌等;

2)cf push 發佈

    用法:

    cf push APP [-b URL] [-c COMMAND] [-d DOMAIN] [-i NUM_INSTANCES] [-m MEMORY] [-n HOST] [-p PATH] [-s STACK] [--no-hostname] [--no-route] [--no-start]

    cf push my-app(上傳併發布my-app應用)

    -b 自定義的buildpack地址,通常如github上打包的.tar.gz的文件包

    -c 指定啓動命令,如nodejs中,cf push -c node myappstart.js,指定使用node myappstart.js來啓動你的應用

    -d 指定域名,如example.com

    -f  指定manifest.yml文件路徑,無此參數時,cf push會將當前你所處文件目錄遍歷,並上傳到pivotal中你申請的空間中,並使用當前目錄中manifest.yml文件配置的選項啓動應用,若是沒有此文件,通常會報錯,關於manifest.yml的用法,請參考下面實例部分;

    -p 指定你要上傳發布的應用源碼路徑;默認是當前路徑

    -m 指定分配給該應用的內在大小:cf push -m 10mb

    -h 指定主機

3)用戶提供的服務實例(cf cups --help)  

TODO《這塊沒太仔細研究》   

  1. cf cups (create-user-provided-service的別名),建立服務實例,使這個由用戶提供的服務實例對應用生效,服務實例名爲必選
  2. cf create-user-provided-service 服務實例 [-p 參數] [-l SYSLOG-syslog轉發地址]
  3. 經過逗號分隔參數來使用交互模式:
  4. cf create-user-provided-service 服務實例 -p "逗號,分隔的,參數,名稱"
  5. 傳遞JSON格式的參數來使用非交互方式建立服務:
  6. cf create-user-provided-service 服務實例 -p '{"名稱":"","名稱":""}'
  7. 示例:
  8. cf create-user-provided-service oracle-db-mine -p "主機, 端口, 數據庫名, 用戶名, 密碼"
  9. cf create-user-provided-service oracle-db-mine -p '{"用戶名":"admin","密碼":"pa55woRD"}'
  10. cf create-user-provided-service my-drain-service -l syslog://example.com
  11. cf uups(update-user-provided-service的別名),更新用戶提供的服務實例
  12. 用法:
  13. cf update-user-provided-service 服務實例 [-p 參數] [-l SYSLOG-syslog轉發地址]'
  14. 示例:
  15. cf update-user-provided-service oracle-db-mine -p '{"用戶名":"admin","密碼":"pa55woRD"}'
  16. cf update-user-provided-service my-drain-service -l syslog://example.com
  17. 可選參數:
  18. -p 參數
  19. -l Syslog轉發地址

4)域,路由,組織和空間

    cf CLI v6版本將以上概念進行簡化

  • 全部域都映射到一個組織,該組織通常默認爲你外網訪問地址
  • 路由做用到空間和應用,也就是路由能夠控制指向空間或你的應用

    以前的路由是一個URL地址,相似HOSTNAME.DOMAIN,若是你不提供一個域名,那麼默認路由(子域)通常是APPNAME.DOMAIN

    在我實驗過程當中,關於DOMAIN,主域通常固定爲.cfapps.io,子域默認是應用名,如: gjflying-org.cfapp.io是我申請的一個應用路由

    固然,一個應用的路由能夠後期添加,你上傳的應用名'如上例中gjflying-org'後期都是添加和修改的;修改的方法有兩種:

    1)使用cf CLI命令行工具,

Commands for managing domains:

  • cf create-domain — Create a domain.
  • cf delete-domain — Delete a domain.
  • cf create-shared-domain — Share a domain with all organizations. Admin only.
  • cf delete-shared-domain — Delete a domain that was shared with all organizations. Admin only.

Commands for managing routes:

  • cf create-route — Create a route.
  • cf map-route — Map a route to an application. If the route does not exist, this command creates it and then maps it.
  • cf unmap-route — Remove a route from an application.
  • cf delete-route — Delete a route.

Mapping a Route

  1. Use cf create-domain to create a domain in the desired organization, unless the domain already exists in (or has been shared with) the organization.
  2. Use cf map-route to map the domain to an application. Use the -n HOSTNAMEoption to specify a unique hostname for each route that uses the same domain.

     2)登陸pivotal網站,在我的中心中進行管理

    

 

5)關於用戶及角色,

    這方面很少說了,pivotal網站我的中心提供用戶及角色相關管理操做,很是簡單,能夠進行添加、刪除操做;知足多用戶團隊開發,代碼提交等協同工做;

 

6)關於CLI中約定

  • 別名及縮寫,提供縮寫簡化操做、提升效率和正確率;如cf p cf push的別名,cf tj target別名
  • 命令行提示中,大寫是用戶填寫
  • 可選參數使用中括號括起
  • 命名 help h,可提供該命令的操做提示幫助(註冊命令及h之間的空格哦)

四、一個nodejs簡單應用編寫:

    準備工做:環境+數據庫

  • 肯定你安裝了nodejs
  • 肯定安裝了npm
  • 肯定安裝了mongodb

 

若是你準備好,那咱們開始吧:

一、建立package.json文件

找個空文件夾如gjflying-app,建立一個package.json文件,寫入應用的一些基本信息:    

  1. {
  2.     "name": "gjflying-app",
  3.     "version": "0.0.1",
  4.     "description": "使用express框架、hbs模板引擎、mongodb數據庫的簡單nodejs應用,依賴vmware的pass平臺cloudFoundary進行發佈上線;",
  5.     "main": "index.js",
  6.     "scripts": {
  7.         "test": "echo \"Error: no test specified\" && exit 1"
  8.     },
  9.     "author": "gaojun",
  10.     "private": true,
  11.     "dependencies": {
  12.         "express": "4.9"
  13.     },
  14.     "devDependencies": {
  15.         "hbs": "^2.7.0",
  16.         "body-parser": "^1.9.3"
  17.     }
  18. }

二、安裝依賴;

打開命令行工具,進入該文件夾中,運行npm install,安裝相關依賴包;

    完成後發現應用中須要鏈接mongodb的驅動及鏈接池包,安裝之:

    npm install mongodb --save //保存依賴到package.jsondevDependencies

    npm install mongodb --save 

三、應用目錄

以下:

    gjflying-org

        -node_modules

        -public    //靜態文件目錄

            -css

            -images

            -js

        -views     //模板目錄

            login.html(此處的後綴,是與配置的模板後綴一致)

        app.js      //啓動應用的主文件

        server_mongodb.js //處理數據庫鏈接

        package.json

        manifest.yml    //用於向CF提供運行配置的文件(後面講其用處)

 

四、啓動數據庫

    啓動mongodb數據庫,並建立數據庫實例windows平臺,安裝數據庫在D://program files中爲例,

    CMD命令行模式進入D://program files//mongodb//bin//文件夾

    mongod.exe運行服務,

    mongo.exe運行mongodb數據庫用戶交互命令

    show dbs查看數據庫(默認進入數據,是test數據庫)

    show collections 查看當前數據庫中的數據集

      

    建立咱們使用的數據:gjflying

    use gjflying

    db.login.insert({name:"admin",pwd:"123456"});

    db.login.find({});查看插入的數據,  

五、編寫代碼

server_mongodb.js    

  1. var http = require('http'),
  2.     mongodb = require('mongodb'),
  3.     poolModule = require('generic-pool');
  4.  
  5. //自動調整鏈接池數
  6. var pool = poolModule.Pool({
  7.     name: 'mongodb',
  8.     create: function (callback) {
  9.         mongodb.MongoClient.connect('mongodb://localhost/gjflying', {
  10.             server: {poolSize: 1}
  11.         }, function (err, db) {
  12.             callback(err, db);
  13.         });
  14.     },
  15.     destroy: function (db) {
  16.         db.close();
  17.     },
  18.     max: 10,//根據應用的可能最高併發數設置
  19.     idleTimeoutMillis: 3000,
  20.     log: false
  21. });
  22. exports.pool = pool;

app.js

  1. var express = require('express'),
  2.     bodyParser = require('body-parser'),
  3.     hbs = require('hbs'); //hbs模板引擎
  4. var app = express();
  5.  
  6. //全局配置
  7. app.set("views", __dirname + "/views"); //模板目錄
  8. app.set('view engine', 'html'); //模板後綴爲'.html'
  9. app.engine('html', hbs.__express); //使用hbs來解析模板
  10.  
  11. //配置靜態資源目錄
  12. app.use(express.static(__dirname + '/public'));
  13.  
  14. //加載中間件
  15. app.use(bodyParser.json());
  16. app.use(bodyParser.urlencoded({extended: true}));
  17.  
  18. //添加路由處理(實際環境,路由每每單獨放到一個router文件中)
  19. app.get('/', function (req, res) {
  20.     res.render('login');
  21. });
  22.  
  23. app.get('/login', function (req, res) {
  24.     var pool = require('./server_mongodb').pool;
  25.     pool.acquire(function (err, db) {
  26.         if(err) {
  27.             res.statusCode = 500;
  28.             res.end(JSON.stringify(err, null, 2));
  29.         } else {
  30.             var uname = req.query.uname;
  31.             db.collection('user').find({uname: uname}).toArray(function (err, data) {
  32.                 //若是不存在,存儲
  33.                 if(data.length == 0) {
  34.                     db.collection('user').save(req.query, function (err, result) {
  35.                         if(err) {
  36.                             res.send(err);
  37.                             return;
  38.                         }
  39.                         res.send('<h2>註冊成功,你的用戶名:' + uname + '</h2>');
  40.                         pool.release(db);
  41.                     });
  42.                 } else {
  43.                     res.send('<h2>您註冊的用戶已經存在,請從新註冊!<a href="/">《返回》</a></h2>');
  44.                 }
  45.             });
  46.         }
  47.     });
  48. });
  49.  
  50. app.listen(process.env.VCAP_APP_PORT || 3000);

login.html          

  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4.     <meta charset="UTF-8">
  5.     <title>用戶註冊</title>
  6. </head>
  7. <body>
  8. <h2>用戶註冊:</h2>
  9.  
  10. <form action="/login" method="get">
  11.     用戶名:
  12.     <input type="text"/>
  13.     <br>
  14.     密碼:
  15.     <input type="password"/>
  16.     <br>
  17.     <input type="submit" value="提交註冊"/>
  18. </form>
  19. </body>
  20. </html>

六、應用運行

    命令行中運行 node app.js

    瀏覽器中輸入網址:http://localhost:3000/login

    

    填寫信息,提交註冊

    返回:

    

    到此,應用在本地已經正常運行,下面介紹如何發佈到線上;

五、應用發佈上線

一、添加數據庫   

上述示例使用mongodb,所以須要在CFcloud Foundary)平臺的我的中心添加數據庫服務,

    在彈出列表中選擇從Marketplace中添加,選擇

     添加完成後,可從我的中心的services已經綁定的服務列表查看該服務,

    其中,uri用於數據庫鏈接,這是mongodb1.2版本後支持新鏈接方式,固然傳統的-user -password的方式也是支持;你能夠點上圖右上角的manage進入數據庫管理,查看鏈接方式,添加數據庫用戶等管理操做;

    將上面uri複製到咱們app.js文件中的數據鏈接處,替換之;

二、編寫manifest.yml文件

    該文件用於提供cf push命令哪些源碼文件不須要上傳(默認cf push會將當前目錄下全部文件上傳,固然不會上傳svn版本文件),還有告訴雲平臺服務器如何運行你的應用,一個經常使用的配置內容以下:

     ---     //三個中線表示開始

    #註釋部分,使用#開始

    applications:    //應用開始

    - name: gjflying-app        //一個應用,指定名子並以一箇中線開始

      command: node app.js //啓動應用命令

      memory: 512M

    官網解釋以下:(值得注意的是: 紅框處是兩個空格)

    

      

建立 .cfignore 能夠指定哪些目錄被push上傳時排除,如:

   public/     排除public目錄上傳

關於manifest其它編寫,能夠參考官網上說明;本應用中,上述配置夠用;

三、發佈應用

命令行進入gjflying-org目錄運行:

cf login

輸入郵件、密碼驗證經過;

再運行:

cf push gjflying-org

提示你使用manifest.yml配置,經過驗證後開始上傳文件

    完成上傳後,告訴你運行一個應用實例,此時,說明你的應用已經跑起來,快在瀏覽器中打開它(http://yourappname.cfapps.io)試用一下試試吧;

  

相關文章
相關標籤/搜索