Bluemix是IBM开源云架构的一个实现,它借助Cloud Foundry,能够为开发者快速地创建,部署,和管理应用和服务。尽管Heroku平台,另一个受欢迎的Paas(platform as a service平台即服务)平台,与Cloud Foundry有极强的相似性,但在将Heroku应用迁移到IBM Bluemix平台时,仍有很多问题需要解决。
该教程从开发者的角度分析Heroku平台和IBM Bluemix平台的主要区别,并以Node.js为例,演示当将该应用从Heroku迁移到IBM Bluemix平台时,如何解决两平台间的差异。
将一个应用从Heroku平台迁移到IBM Bluemix时,主要需考虑以下三个主要的方面:
服务绑定涉及的环境变量。在Bluemix平台,所有绑定的服务证书都存储在一个叫VCAP_SERVICES的环境变量中。但是,在Heroku平台,服务绑定涉及的环境变量根据服务类型的不同而有所区别。为解决这一差异,环境变量必须重新配置,以便它们可以正确建立映射,在迁移至Bluemix平台前,原来的Heroku应用需要修改。
不同的服务集合。将应用迁移至IBM Bluemix平台前,你也需要考虑服务的迁移。理想状态下,IBM Bluemix平台可以提供Heroku应用对等的服务。在这种情况下,你可以在Bluemix平台创建新的服务,并选择性地迁移内容和数据。如果Bluemix平台不提供类似的服务,你必须再使用原来的Heroku添加件。
应用模型和进程类型。一个Bluemix应用仅包含一个进程。另一方面,一个Heroku应用可以有不同种类的多个进程,比如web,workers进程等。为解决这一差异,必须在Bluemix平台创建一个复合应用(仅意味着两个相关的应用)来支持Heroku应用包含的多个进程。
下面将通过详细的步骤来演示如何将样本应用从Heroku平台迁移到IBM Bluemix平台。Heroku样本应用,名称为sample-app-mongo-node-heroku,是一个Node.js应用。它作为一个后端数据存储消耗一项Mongo服务。应用sample-app-mongo-node-bluemix是样本应用迁移到Bluemix平台后的结果。该应用提供两个API:api/insertMessage和/api/render。当API /api/insertMessage被调用时,插入的信息就会显示在web界面上。
搬迁API所需
Heroku ID,用来在Heroku登录和运行应用
Bluemix ID,用来在Bluemix平台登录和运行应用
Cloud Foundry CLI工具带
The Heroku工具带
第一步:在 Heroku平台安装和运行应用
1. 使用Git clone[p1] 方式从IBM Jazz Hub下载sample-app-mongo-node-heroku应用:
git clone git@heroku.com:sample-app-mongo-node-heroku .git
将项目复制到你的本地驱动器后,使用适当的名称,如sample-app-mongo-node-heroku,将应用放置存储在一个目录下。
2. 如果样本应用以及停止运行,将其推入Heroku平台,获取更多详情,参考Heroku documentation。
a. .如果你还没有安装Heroku工具带,首先进行安装。安装后,你就可以访问Heroku命令行程序,git,和Foreman[p2] ,还有你将会在后面的步骤中用到的工具。
b. 打开命令窗口,进入存储sample-app-mongo-node-heroku应用的文件夹。做好准备,将应用推入Heroku平台。下面的步骤涉及在Heroku平台部署和运行程序。
c. 初始化本地git仓库:
git init; git add . ; git commit -m "my first commit"
d. 在Heroku平台,创建一个应用,使Heroku平台做好准备接收你的源代码。这一步也会创建一个远端仓库heroku,并为你的应用随机产生一个名称:
heroku create
e. 将你的代码部署到Heroku平台:
git push heroku master
f. 如果你愿意,你可以对应用重新命名:
heroku apps:rename app_name
g. 确保至少该应用的一个实例在运行:
heroku ps:scale web=1
h. Provision an add-on for your application: 为你的应用提供一个附加件:
heroku addons:add mongolab
环境变量MONGOLAB_URI被添加到了应用。如果你运行heroku config命令,你将会看到一个与下面的消息类似的消息(为安全起见,关键的证书信息已经被删除了):
a. 设置Heroku服务环境变量。在本例中,环境变量MONGODB(代表Mongolab URL,Mongo库URL)需要被设置。输入如下命令进行设置:
heroku config:set MONGODB=mongolab_url_value
b. 按照应用的需要设置其他环境变量。在本例中,不需设置其他环境变量。
c. 运行如下命令对应用进行测试:
heroku open
当API /api/insertMessage被调用时,将有消息写入数据库中。
When the /api/render API is called, the inserted message is read and rendered.
第二步:迁移应用至Bluemix平台
If you have not done so already, install the Cloud Foundry Command Line Tool (CLI). This tool provides the Bluemix command-line utilities. 如果你还未安装Cloud Foundry命令行工具,请先进行安装。该工具提供Bluemix命令行程序。
1. You should have already installed and started the application on Heroku. See "Step 1. Install and run the application on Heroku." 你应当已经在Heroku平台安装被开始运行了待迁移的程序。了解详情,请参考第一步:在Heroku平台安装和运行程序。
2. 登录到Bluemix平台。
cf api https://api.ng.bluemix.net
cf login -u -p
3. 打开命令窗口,进入存储sample-app-mongo-node-heroku应用的文件夹。sample-app-mongo-node-heroku应用已经在第一步中安装了。
4. 对代码做必要的修改(如果你决定再使用原来的Heroku附加件,则不需要进行代码修改)。在本例中,所需的唯一一处修改与环境变量MONGODB有关。
在原Heroku应用中的源代码中,参数var mongo的值为process.env.MONGODB。将MONGODB改为VCAP_SERVICES。然后做相应的解析获得正确的服务证书:
var mongo = process.env.VCAP_SERVICES;
var port = process.env.VCAP_APP_PORT;
if (mongo) {
var env = JSON.parse(mongo);
if (env['mongolab']) {
mongo = env['mongolab'][0]['credentials'];
}
}
5. 运行下面的命令将样本应用推入Bluemix平台:
cf push sample-app-mongo-node --no-start
6. 然后你可选择再使用原来的Heroku附加件或为应用创建新的对等Bluemix服务。如果使用原来的Heroku附加件,你不需要对原来的Heroku应用做任何代码修改。在Bluemix应用中,你需要使用Heroku's mongolab URL的值来设置Bluemix环境变量MONGODB,详情如下:
cf set-env sample-app-mongo-node MONGODB mongolab_url_heroku
要创建一项对等的Bluemix服务,首先确保以及对原Heroku应用的代码做了必要的修改,正如上面的第四步所述。然后完成如下步骤:
a. 因为在Bluemix平台,对等的服务是Mongolab,运行下面的命令创建一个Mongolab服务实例:
cf create-service mongolab sandbox sample-mongolab
b. 运行下面的命令将sample-app-mongo-node和服务实例sample-mongolab绑定:
cf bind-service sample-app-mongo-node sample-mongolab
7. 再次推入应用,以使环境变量插入信息生效:
cf start sample-app-mongo-node
现在应用sample-app-mongo-node已经在Bluemix平台运行了。从Heroku平台到Bluemix平台的应用迁移完成。
迁移的应用可以插入样本消息到Mongo数据库,说明迁移应用在Bluemix平台运行良好。
从数据库读取消息并显示内容:
局限
在该教程中,并未谈及Mongo数据库的数据迁移。如果需要,你可以选择在Bluemix平台创建一个对等的Mongo服务,你可以利用既有的数据库客户端工具来进行数据迁移。
同样地,我们在该教程中描述的样本应用并未涉及在Heroku平台上使用worker进程的应用迁移的场景。但是,在worker进程场景下的迁移方法与在web进程场景下的方法是相似的。
最后,该教程未覆盖多个相关应用进行迁移的场景。在多个相关应用进行迁移时,我们可以从环境变量推断相关Heroku应用间的关系。例如,如果A应用依赖于B应用,那么A应用必须有环境变量指向B应用的URL。在Bluemix平台,相关应用被推入Bluemix后,你需要为依赖其他应用的应用设置相应的环境变量。
总结
该教程从开发者的角度描述了Heroku平台和Bluemix平台的主要差异。提供了详细的步骤,以Node.js应用为样例,说明在将应用从Heroku平台迁移到Bluemix平台时,如何解决这些差异。这可能在帮你了解平台差异和提供应用迁移指导方面提供一个良好的开端。
BLuemix精彩培训