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)试用一下试试吧;