转载

Bluemix 基础:将一个示例 Node.js 应用程序部署到云中

 

概述

使用作为 Web 开发人员的您已经熟悉的语言和工具,开始在云中工作。在本教程中,将学习如何运行、修改、测试一个简单的 Node.js 应用程序并将其部署到云中。在将应用程序部署到 IBM 云开发平台 Bluemix™ 后,任何人都可以通过网络访问它。

本教程是 developerWorks 上的 “Bluemix 基础” 教程系列中的一篇文章。

您将在本教程中完成的任务

 

第 1 步. 下载代码

第 2 步. 将应用程序部署到 Bluemix

第 3 步. 检查代码结构

第 4 步. 在您的计算机上运行应用程序

第 5 步. 运行单元测试

第 6 步. 修改代码并重新运行应用程序

第 7 步. 重新运行单元测试

第 8 步. 将更改后的代码部署到 Bluemix

测验时间!

结束语

让我们开始吧。

 

IBM Bluemix 是企业开发人员构建、运行、扩展和管理应用程序的地方。准备好开始在 Bluemix 上创建自己的应用程序了吗?本教程将介绍托管一个 Node.js 应用程序的步骤。您首先要提供一个示例 Node.js 应用程序,在本地系统上运行它,修改它的代码,然后将该应用程序部署到 Bluemix,以便任何在线的人都可以使用它。

如果不确定您可能看到的 Bluemix 术语和状态消息的含义,请阅读本教程的 术语表和状态消息 部分。

这里简要概括了在本教程中将如何使用 Bluemix:

Bluemix 基础:将一个示例 Node.js 应用程序部署到云中

您使用在云中运行的 Express Web 框架(我将此组合称为 Express 服务器)运行您自己的 Node.js HTTP 服务实例。Express 服务器成功部署后,将继续运行,不会与任何人共享它。

您还将在计算机上的一个 Express 服务器实例中运行该应用程序。使用此设置,可以快速测试和调试您的应用程序,无需连接网络并在每次执行更改后上传代码。

当代码在本地服务器上正常运行,而且您觉得已准备好与大家分享它后,使用 Cloud Foundry CLI 将您的 Web 应用程序(包括 Express 服务器)上传到云中(图中的虚线箭头表示的流程)。然后,您的应用程序可以通过 Bluemix 提供,任何拥有浏览器的人都可以通过网络访问它。

完成本教程需要掌握的知识

 
  • Node.js 开发和 npm 包/依赖关系管理器的实用知识
  • 客户端/服务器系统基础和术语的一般知识

观看:npm 是什么?

完成本教程所需的软件

 
  • 一个 Bluemix 帐户(注册您的 免费试用版帐户,如果您已经有一个帐户,请 登录到 Bluemix)。
  • 在您的计算机上安装以下软件:
    • 一个文本编辑器 — 首选具有 JavaScript 语法突出显示的编辑器,比如 Sublime Text(可使用免费试用版本),还可以使用开源编辑器,比如 Atom
    • Node.js 0.12.6 或更高版本(Node.js 发行版通常会安装一个匹配的 npm 版本)
    • Cloud Foundry 命令行接口 (CLI)。

阅读:CloudFoundry CLI 文档

第 1 步. 下载代码

 
  1. 单击此按钮下载示例 Node.js Web 应用程序 nodejstutorial1.zip 的代码:

    下载示例 Node.js 应用程序

  2. 将 nodejstutorial1.zip 保存到您的计算机并解压缩其中的内容,其中包括以下文件和目录:
    • app.js,应用程序的主要可执行程序;它启动 Express 服务器来处理 Web 请求。
    • websitetitle.js 是一个简单的模块,它提供网站标题的文本。
    • package.json 描述您的 Node.js 项目并指定它的所有依赖关系。此文件由标准 npm 依赖关系管理器处理。
    • views 目录包含构成应用程序的页面的模板。每个模板文件都可以包含动态元素,这些元素动态地呈现传入的请求。
    • public 目录包含应用程序的所有静态资产,其中包括 CSS、图像和在浏览器上运行的客户端 JavaScript 代码。
    • test 目录包含 websiteTitle 模块的单元测试。

第 2 步. 将该应用程序部署到 Bluemix

 

像大多数 Node.js Web 应用程序一样,此应用程序可立即部署到 Bluemix,无需额外的修改或配置。现在将它部署到 Bluemix:

  1. 如果尚未登录 Bluemix,请从您的命令行终端运行这些命令来进行登录:

    cf api https://api.ng.bluemix.net/
    cf login

  2. 运行下面这个命令,将应用程序上传到 Bluemix:

    cf push 您的应用程序名称

    您为应用程序选择的名称必须在 Bluemix 上是唯一的 — 未被其他任何 Bluemix 用户使用。如果该名称(称为一个路由)已被使用,您会获得一个错误。

    您刚才运行的命令:

    1. 将应用程序上传到 Bluemix
    2. 在 Bluemix 中运行 IBM SDK for Node.js buildpack
    3. 在 Bluemix 中启动您的 Express 服务器实例和已加载的应用程序
    4. 将一个路由映射到您正在运行的应用程序,该应用程序可以通过网络使用 URL https://your app name.mybluemix.net/ 进行访问
  3. 在浏览器中打开 https://您的应用程序名称.mybluemix.net/ 来试用该应用程序 — 一个名为 Lauren's Lovely Landscapes 的简单网络商店。该商店目前销售三种印刷品;每种印刷品的页面显示了关联的名称、图像和价格。
  4. 停下来想一想。您刚才已经将一个正在运行的 Web 应用程序部署到云中!您需要使用 cf 命令行工具和一个 Bluemix 帐户。

在本教程后面,将进一步了解该 buildpack 如何与 Bluemix 一起载入和部署您的应用程序。

从下一步开始,将检查和修改应用程序的代码。一个具有多选项卡支持的语法突出显示编辑器可以让您更轻松地处理多个 JavaScript 和模板源代码文件。

第 3 步. 检查代码结构

 

查看解压的 ZIP 文件中的 views 目录。您可以看到 4 个组成网站的 Jade 模板文件 — .jade 文件。

此图显示了该应用程序的工作原理:

Bluemix 基础:将一个示例 Node.js 应用程序部署到云中

每个针对 Lauren's Lovely Landscapes 商店的某个页面的 Web 请求都由您的代码路由到这些模板中的一个模板。路由到模板时,您的代码会附加一个包含网站标题信息的 JavaScript 对象。该模板使用此对象呈现它的标题 (Lauren's Lovely Landscapes)。

在 app.js 中,您可以看到将请求路由到某个模板所用的代码,以及一个包含来自 websiteTitle 对象的标题的变量:

app.get('/', function (req, res) {
  res.render('home', {title: websiteTitle.getTitle()});
});
app.get('/alaska', function (req, res) {
  res.render('alaska',  {title: websiteTitle.getTitle()});
});
app.get('/antarctica', function (req, res) {
  res.render('antarctica',  {title: websiteTitle.getTitle()});
});
app.get('/australia', function (req, res) {
  res.render('australia',  {title: websiteTitle.getTitle()});
});

在本例中,所有 4 个路径(//antarctica/alaska/australia)都被路由到相应的模板,以及附加的网站标题。

如果检查其中一个模板(比如 alaska.jade),您会看到这里使用了一个 Jade 模板变量来呈现该标题:

<head>
	<title> ${title} </title>
...

在启动 Express 服务器时,它会在一个端口上侦听传入的请求。每次部署应用程序时,Bluemix 用来将应用程序连接到网络的端口都有可能发生改变。但是,Bluemix 提供了一个 PORT 环境变量,它会告诉应用程序要侦听哪个端口。在 app.js 中,可以看到用来获取环境变量并在指定的端口上执行侦听的代码:

var appEnv = cfenv.getAppEnv();
app.listen(appEnv.port, appEnv.bind, function() {
...
}

第 4 步. 在您的计算机上运行应用程序

 

您现在已经准备好在计算机上本地运行该应用程序。

  1. 在应用程序的根目录下,运行:

    npm install

    这是告诉 npm 在 package.json 文件中进行查看,然后下载并安装此应用程序的所有依赖项的标准方式。npm 会创建一个 node_modules 目录,并将所有下载的依赖项放入其中: Bluemix 基础:将一个示例 Node.js 应用程序部署到云中

    点击查看大图

  2. 在 Express 服务器中启动该应用程序:

    node app.js

    在命令控制台中,记下 Express 服务器运行时使用的端口(在本例中为 http://localhost:6002/): Bluemix 基础:将一个示例 Node.js 应用程序部署到云中

    点击查看大图

  3. 在浏览器中访问 Express 服务器:http://localhost:port_number
  4. 试用应用程序的这个实例,看看是否会发现与 Bluemix 托管的应用程序不同的地方。因为您查看的是用相同代码生成的同一个应用程序,所以二者之间应该没有明显的区别。

第 5 步. 运行单元测试

 

为模块编写单元测试是一种不错的 Node.js 编码实践。

  1. 如果尚未在您系统上安装 mocha 单元测试框架,可以运行此命令来安装它:

    npm install mocha -g

  2. 该应用程序包含两个针对 websitetitle.js 模块的单元测试。使用此命令启动 mocha 来运行它们:

    mocha

您可以看到两个测试都在运行。在打印到屏幕的结果中,每个通过的测试旁边会出现一个绿色的勾号,mocha 会报告获得通过的测试总数。所有单元测试都已通过:

Bluemix 基础:将一个示例 Node.js 应用程序部署到云中

点击查看大图

第 6 步. 修改代码并重新运行应用程序

 

在这一步中,将会修改印刷品的价格,查看它是否会立即在本地运行的网站上获得更新。

  1. 在文本编辑器中打开 antarctica.jade 文件,在源代码中查找价格。
  2. 将价格从 100.00 更改为 99.99 并保存该文件。更改的行应类似于:
    <div id="price">99.99</div>
  3. 再次在本地运行该应用程序:

    node app.js

  4. 在浏览器中访问 Express 服务器
  5. 选择 Antarctica 印刷品,可以注意到印刷品的价格已发生更改。

第 7 步. 重新运行单元测试

 

要确保您的代码更改没有造成任何破坏,请养成每次修改应用程序后运行单元测试的习惯。

使用 mocha 命令重新运行这些单元测试。您会再一次在屏幕输出中看到所有绿色的勾号,如果没有红色文本,则表明所有单元测试已成功通过。

当在团队环境中开发 Node.js 代码时,您可能希望每次将代码提交(修改并贡献)到团队的存储库时都会运行所有单元测试。Bluemix 提供了 DevOps Services,可以通过配置它们在构建项目的工作流中自动运行单元测试。本系列的 下一篇教程 将会更详细地介绍 DevOps Services。

第 8 步. 将更改后的代码部署到 Bluemix

 

要让网络上的每个人都知道 Antarctica 印刷品的新价格,需要将更改后的应用程序部署到 Bluemix。

提示:您还可以指定 Bluemix 应向您的应用程序分配多少内存。例如,要设置 128 MB 内存,使用:cf push -m 128M 您的应用程序名称

在第 2 步中,您了解了将 Node.js 应用程序部署到 Bluemix 是多么简单。再次从您代码的根目录中运行此命令:

cf push 您的应用程序名称

成功部署后,在任何 Web 浏览器中访问以下链接来试用该应用程序:

https://您的应用程序名称.mybluemix.net/

术语表和状态消息

 

让我们来看看在使用 Bluemix 时可能遇到的一些术语和状态消息。

术语表

 

请熟悉以下重要术语,在使用 Bluemix 时,常常会在文档和状态消息中看到它们。

  • Droplet:已准备好在云中部署的程序包,包含除操作系统外的一切资源(例如一个包含 JVM、Liberty 概要文件服务器和您的应用程序的程序包)。
  • Buildpack:一个可执行程序,它获取您推送的代码或打包的服务器,并将其捆绑到 droplet 中。
  • 清单:一个可以添加到您项目中的可选文件,名为 manifest.yml。清单文件配置会影响部署的服务器的各种参数 — 包括内存大小、在部署期间使用的 buildpack、所需的服务、使用的磁盘空间,等等。对于简单的 Node.js Web 应用程序,不需要清单文件;系统会自动检测和使用 IBM SDK for Node.js buildpack 并应用默认配置。

    阅读:使用应用程序清单文件进行部署

  • 载入(staging):由 buildpack 处理的过程,将您上传的内容与系统组件和依赖项一起捆绑到一个有效的 droplet 中
  • Droplet 执行代理 (DEA):负责重构 droplet 并在云中运行您的应用程序的系统部分
  • Warden:一种确保您的应用程序已与其他运行的应用程序隔离并受到保护的机制

理解状态消息

 

在发出 cf push CLI 命令时,您会看到一系列状态消息。如果仔细查看,就会看到以下相继短语:

  1. Your push successfully uploaded the app source code to the staging area.(您的推送已成功将应用程序源代码上传到载入区域。)
  2. If an existing instance of your app is already running, it's stopped before staging begins.(如果您应用程序的一个现有实例已在运行,它会在载入开始之前停止。)
  3. The buildpack starts the staging process, which can include:(buildpack 启动载入过程,这可能包括:)
    1. Downloading and installing various system components(下载并安装各种系统组件)
    2. Downloading and installing runtime tools (Node.js and npm, for example)(下载并安装运行时工具(例如 Node.js 和 npm))
    3. Putting your app into place(将您的应用程序放入适当位置)
    4. Setting up the environment(设置环境)
    5. Bundling everything up to create the droplet(捆绑所有资源来创建 droplet)
    为了加速这些步骤,载入过程会使用大量缓存,所以您可能还会在消息组合中看到一些有关从缓存重用的消息。
  4. The DEA tries to start your app from the droplet, running under supervision of a warden (container).(DEA 尝试从 droplet 启动您的应用程序,并在一位管理人的监督下运行(容器)。)

测验

 

测试您在本教程中学到的知识。答案 在下方。

 

  1. 在将 Node.js 应用程序部署到 Bluemix 之前,必须将 Node.js 和 npm 安装到计算机上。
    1. 错;只需安装 Node.js
    2. 错;只需安装 npm
    3. 错;只需要源代码和 Cloud Foundry CLI
  2. Bluemix 用来查找您正在运行的应用程序的端口是:
    1. 8080
    2. 80
    3. PORT 环境变量表示
    4. 取决于路由
  3. 您为 Lauren's Lovely Landscape Bluemix 部署选择的应用程序名称必须:
    1. 较长且听起来很重要
    2. 简明扼要
    3. 在您的所有其他应用程序中是唯一的
    4. 在同一个数据中心中的所有应用程序中是唯一的
    5. 未被全世界的其他任何 Bluemix 用户使用
  4. 您如何确定您的 mocha 单元测试已获得通过?
    1. 测试结果消息为绿色
    2. 控制台消息标明所有已通过的单元测试
    3. 您会看到已通过的测试的数量
    4. a 到 c

测验的答案

1. d,2. c,3. e,4. d

结束语

 

在本教程中,您:

  • 使用了 Cloud Foundry CLI 将一个 Node.js 应用程序(包括一个 Express Web 服务器实例)部署到 Bluemix
  • 使用了一个编辑器来检查和修改应用程序的代码
  • 使用 npm 安装了应用程序的依赖项
  • 在本地计算机上运行并测试了修改后的应用程序
  • 通过 Cloud Foundry CLI 更新了部署到 Bluemix 上的应用程序
  • 了解了重要 Bluemix 术语和如何解读状态消息

现在,通过下一篇教程在 developerWorks 上继续学习 “Bluemix 基础”。您将学习如何为 Node.js 应用程序设置团队协作和自动化部署:

为 Node.js 应用程序设置 DevOps

更多 Bluemix 资源

 

要获得源源不断的教程和技术资源流来帮助您使用 Bluemix 进行学习、开发和连接,请参阅 developerWorks 上的 Bluemix 页面


    
正文到此结束
Loading...