Cloud Foundry(如下簡稱CF),CF是Vmware公司的PaaS服務平臺,Paas(Platform 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環境爲例,下載安裝完成後,運行CMD;express
輸入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《這塊沒太仔細研究》
-
cf cups (create-user-provided-service的別名),建立服務實例,使這個由用戶提供的服務實例對應用生效,服務實例名爲必選
-
cf create-user-provided-service 服務實例 [-p 參數] [-l SYSLOG-syslog轉發地址]
-
經過逗號分隔參數來使用交互模式:
-
cf create-user-provided-service 服務實例 -p "逗號,分隔的,參數,名稱"
-
傳遞JSON格式的參數來使用非交互方式建立服務:
-
cf create-user-provided-service 服務實例 -p '{"名稱":"值","名稱":"值"}'
-
示例:
-
cf create-user-provided-service oracle-db-mine -p "主機, 端口, 數據庫名, 用戶名, 密碼"
-
cf create-user-provided-service oracle-db-mine -p '{"用戶名":"admin","密碼":"pa55woRD"}'
-
cf create-user-provided-service my-drain-service -l syslog://example.com
-
cf uups(update-user-provided-service的別名),更新用戶提供的服務實例
-
用法:
-
cf update-user-provided-service 服務實例 [-p 參數] [-l SYSLOG-syslog轉發地址]'
-
示例:
-
cf update-user-provided-service oracle-db-mine -p '{"用戶名":"admin","密碼":"pa55woRD"}'
-
cf update-user-provided-service my-drain-service -l syslog://example.com
-
可選參數:
-
-p 參數
-
-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
-
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.
-
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文件,寫入應用的一些基本信息:
-
{
-
"name": "gjflying-app",
-
"version": "0.0.1",
-
"description": "使用express框架、hbs模板引擎、mongodb數據庫的簡單nodejs應用,依賴vmware的pass平臺cloudFoundary進行發佈上線;",
-
"main": "index.js",
-
"scripts": {
-
"test": "echo \"Error: no test specified\" && exit 1"
-
},
-
"author": "gaojun",
-
"private": true,
-
"dependencies": {
-
"express": "4.9"
-
},
-
"devDependencies": {
-
"hbs": "^2.7.0",
-
"body-parser": "^1.9.3"
-
}
-
}
二、安裝依賴;
打開命令行工具,進入該文件夾中,運行npm install,安裝相關依賴包;
完成後發現應用中須要鏈接mongodb的驅動及鏈接池包,安裝之:
npm install mongodb --save //保存依賴到package.json中devDependencies
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
-
var http = require('http'),
-
mongodb = require('mongodb'),
-
poolModule = require('generic-pool');
-
-
//自動調整鏈接池數
-
var pool = poolModule.Pool({
-
name: 'mongodb',
-
create: function (callback) {
-
mongodb.MongoClient.connect('mongodb://localhost/gjflying', {
-
server: {poolSize: 1}
-
}, function (err, db) {
-
callback(err, db);
-
});
-
},
-
destroy: function (db) {
-
db.close();
-
},
-
max: 10,//根據應用的可能最高併發數設置
-
idleTimeoutMillis: 3000,
-
log: false
-
});
-
exports.pool = pool;
app.js
-
var express = require('express'),
-
bodyParser = require('body-parser'),
-
hbs = require('hbs'); //hbs模板引擎
-
var app = express();
-
-
//全局配置
-
app.set("views", __dirname + "/views"); //模板目錄
-
app.set('view engine', 'html'); //模板後綴爲'.html'
-
app.engine('html', hbs.__express); //使用hbs來解析模板
-
-
//配置靜態資源目錄
-
app.use(express.static(__dirname + '/public'));
-
-
//加載中間件
-
app.use(bodyParser.json());
-
app.use(bodyParser.urlencoded({extended: true}));
-
-
//添加路由處理(實際環境,路由每每單獨放到一個router文件中)
-
app.get('/', function (req, res) {
-
res.render('login');
-
});
-
-
app.get('/login', function (req, res) {
-
var pool = require('./server_mongodb').pool;
-
pool.acquire(function (err, db) {
-
if(err) {
-
res.statusCode = 500;
-
res.end(JSON.stringify(err, null, 2));
-
} else {
-
var uname = req.query.uname;
-
db.collection('user').find({uname: uname}).toArray(function (err, data) {
-
//若是不存在,存儲
-
if(data.length == 0) {
-
db.collection('user').save(req.query, function (err, result) {
-
if(err) {
-
res.send(err);
-
return;
-
}
-
res.send('<h2>註冊成功,你的用戶名:' + uname + '</h2>');
-
pool.release(db);
-
});
-
} else {
-
res.send('<h2>您註冊的用戶已經存在,請從新註冊!<a href="/">《返回》</a></h2>');
-
}
-
});
-
}
-
});
-
});
-
-
app.listen(process.env.VCAP_APP_PORT || 3000);
login.html
-
<!DOCTYPE html>
-
<html>
-
<head lang="en">
-
<meta charset="UTF-8">
-
<title>用戶註冊</title>
-
</head>
-
<body>
-
<h2>用戶註冊:</h2>
-
-
<form action="/login" method="get">
-
用戶名:
-
<input type="text"/>
-
<br>
-
密碼:
-
<input type="password"/>
-
<br>
-
<input type="submit" value="提交註冊"/>
-
</form>
-
</body>
-
</html>
六、應用運行
命令行中運行 node app.js
瀏覽器中輸入網址:http://localhost:3000/login
填寫信息,提交註冊
返回:
到此,應用在本地已經正常運行,下面介紹如何發佈到線上;
五、應用發佈上線
一、添加數據庫
上述示例使用mongodb,所以須要在CF(cloud 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)試用一下試試吧;