Cloud Foundry(以下簡稱CF),CF是Vmware公司的PaaS服務平台,Paas(Platform as a Service,平台即服務), 是為開發者提供一個應用運行的平台,有了這人平台,開發者無需搭建線上應用運行環境和服務(Mysql/mongodb/Rabbitmq等),包括硬件和軟件(os/應用軟件如tomcat/rails等)環境。開發者可專注代碼開發,最終提供源碼(或war包之類的)信息,上傳至PAAS,即可運行;同時pass平台提供DNS服務,一些Webapp可以直接完成上線。
簡而言之,有了paas,開發者只需要提供源碼,即可瞬間啟動一個企業級的web service
1. 注冊免費賬戶
1) 登陸注冊網站http://my.cloudfoundry.com/signup進行注冊。
2) 輸入郵箱,注冊,然后出現如下提示
3)進入你的郵箱,打開驗證鏈接,根據提示輸入登錄密碼、用戶信息等
4)輸入正確的手機號,需要驗證碼驗證;
5)輸入組織名,后期可隨意修改
6)申請成功
2、下載CF CLI(命令行終端)管理工具
1)上面最后一步已經提示非常清楚,根據你現在環境下載對應的管理工具;
2)以windows環境為例,下載安裝完成后,運行CMD;
輸入cf命令,可以查看所有相關命令操作選項
如果出現一堆的使用信息,說明你已經安裝成功了……
3、關於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:
Commands for managing routes:
Mapping a Route
|
(2)登錄pivotal網站,在個人中心中進行管理
5)關於用戶及角色,
這方面不多說了,pivotal網站個人中心提供用戶及角色相關管理操作,非常簡單,可以進行添加、刪除操作;滿足多用戶團隊開發,代碼提交等協同工作;
6)關於CLI中約定
- 別名及縮寫,提供縮寫簡化操作、提高效率和正確率;如cf p 是cf push的別名,cf tj 對target別名
- 命令行提示中,大寫是用戶填寫
- 可選參數使用中括號括起
- 命名 help或 h,可提供該命令的操作提示幫助(注冊命令及h之間的空格哦)
4、一個nodejs簡單應用編寫:
准備工作:環境+數據庫
- 確定你安裝了nodejs
- 確定安裝了npm
- 確定安裝了mongodb
如果你准備好,那我們開始吧:
1、創建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"
-
}
-
}
2、安裝依賴;
打開命令行工具,進入該文件夾中,運行npm install,安裝相關依賴包;
完成后發現應用中需要連接mongodb的驅動及連接池包,安裝之:
npm install mongodb --save //保存依賴到package.json中devDependencies
npm install mongodb --save
3、應用目錄
如下:
gjflying-org
-node_modules
-public //靜態文件目錄
-css
-images
-js
-views //模板目錄
login.html(此處的后綴,是與配置的模板后綴一致)
app.js //啟動應用的主文件
server_mongodb.js //處理數據庫連接
package.json
manifest.yml //用於向CF提供運行配置的文件(后面講其用處)
4、啟動數據庫
啟動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({});查看插入的數據,
5、編寫代碼
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>
6、應用運行
命令行中運行 node app.js
瀏覽器中輸入網址:http://localhost:3000/login
填寫信息,提交注冊
返回:
到此,應用在本地已經正常運行,下面介紹如何發布到線上;
5、應用發布上線
1、添加數據庫
上述示例使用mongodb,因此需要在CF(cloud Foundary)平台的個人中心添加數據庫服務,
在彈出列表中選擇從Marketplace中添加,選擇
添加完成后,可從個人中心的services已經綁定的服務列表查看該服務,
其中,uri用於數據庫連接,這是mongodb1.2版本后支持新連接方式,當然傳統的-user -password的方式也是支持;你可以點上圖右上角的manage進入數據庫管理,查看連接方式,添加數據庫用戶等管理操作;
將上面uri復制到我們app.js文件中的數據連接處,替換之;
2、編寫manifest.yml文件
該文件用於提供cf push命令哪些源碼文件不需要上傳(默認cf push會將當前目錄下所有文件上傳,當然不會上傳svn版本文件),還有告訴雲平台服務器如何運行你的應用,一個常用的配置內容如下:
--- //三個中線表示開始 #注釋部分,使用#開始 applications: //應用開始 - name: gjflying-app //一個應用,指定名子並以一個中線開始 command: node app.js //啟動應用命令 memory: 512M |
官網解釋如下:(值得注意的是: 紅框處是兩個空格)
創建 .cfignore 可以指定哪些目錄被push上傳時排除,如:
public/ 排除public目錄上傳
關於manifest其它編寫,可以參考官網上說明;本應用中,上述配置夠用;
3、發布應用
命令行進入gjflying-org目錄運行:
cf login
輸入郵件、密碼驗證通過;
再運行:
cf push gjflying-org
提示你使用manifest.yml配置,通過驗證后開始上傳文件
完成上傳后,告訴你運行一個應用實例,此時,說明你的應用已經跑起來,快在瀏覽器中打開它(http://yourappname.cfapps.io)試用一下試試吧;