正是基于这样的趋势,IBM 发布了自己的公有云产品,产品名称是 IBM Bluemix,目前正处在公开测试阶段。Bluemix 建立在 Apache 开源项目 Cloud Foundry 之上,并提供了 IBM 及其合作伙伴开发的高质量的服务(Services)供 IT 从业人员使用。本文以 Bluemix 平台的核心组件 - Bluemix Java 运行时为主线,来向读者介绍 IBM 公有云产品 Bluemix,和读者一起去领略平台云给 IT 带来的变化。
这是一个耳熟能详的传说:传说中,凤凰是人世间幸福的使者,每五百年,它就要背负着积累于人世间的所有不快和仇恨恩怨,投身于熊熊烈火中自焚,以生命和美丽的终结换取人世的祥和和幸福。在肉体经受了巨大的痛苦和轮回后它们才能获得更美好的躯体得以重生。佛教徒把这个故事称为“涅槃”。
的确,一切苦难和磨砺的尽头也是新的希望开始的地方。作为 IT 从业人员,特别是程序员的你,是否也想过或者期望经历这样的涅槃呢?如果你曾经或者现在正在经历如下的痛苦,那么 Bluemix 就是为你而准备的。
不停的安装各种运行时,容器以及繁杂的第三方依赖包 安装并配置一切必须的服务(数据库,移动服务等) 将所需的服务与应用进行关联,配置端口/IP/防火墙等 建立动态路由以及负载均衡机制 保证从底层到应用层各个层次的高可用性 确保日志的完整收集和高效分析 日常要做好应用的性能监控 保证应用可以根据负载的大小进行灵活的伸缩 最后,不断的重复着 开发》测试》上线 的轮回
Bluemix 带来了什么
Bluemix 致力于解决上述在软件开发过程中遇到的问题,旨在帮助程序员更快速的开发,测试,部署和运维云平台应用。
什么是 Bluemix?
简单的讲,Bluemix 就是一个开放的公有云平台,允许程序员在上面运行几乎所有类型的应用,而不用为硬件,软件,网络等其他因素分心。如上文提到,Bluemix 处于云世界的中间层,也就是 PaaS 层。如下图所示:
图 1. Bluemix 扮演的角色
通常来讲,所谓 PaaS 指的是运行在 Iaas 层上的一系列软件服务,并把服务器平台或开发环境作为一种服务提供给用户,也就是“平台即服务”。Bluemix 运行在 IBM 的 IaaS 层产品 Softlayer 之上。Softlayer 在 2013 年被 IBM 收购,其主要为用户提供企业级的 IT 基础设施的建设和解决方案,无论是在性能还是在安全性上都有很高的质量保证,有兴趣的读者可以参考文章最后的资源链接进一步学习。用户的应用程序通过很简单的操作(大部分场景只需要一条简单的命令即可)就能部署应用到 Bluemix 环境里,程序员不需要去关心底层的操作系统,运行时,网络等等一切和 code 本身无关的东西,而可以把全部的精力放到程序的设计和优化上。
选择 Bluemix 的理由
Bluemix 作为 PaaS 层产品给程序员带来了很多的优势:第一,节省时间和精力,程序员可以把所有的心思都放在应用程序的编写和调优上,而不用去担心繁杂的平台基础架构和设施,更有利于发掘程序员的创造力,开发出更高质量,高性能的应用;第二,加速应用程序上线,在实际的操作中,只需要简单的几条命令或者 UI 界面的几次点击操作就能轻松的完成各种应用程序的部署,而完全不用去担心硬件采购,软件安装等等这些先期准备工作;第三,很容易的满足应用程序对各种新功能和新服务的需求,IBM 及其合作伙伴负责提供优质的服务,程序员只需要简单的“绑定”操作就能将服务加入到应用程序中;第四,Bluemix 支持的语言,运行时,框架等都是程序员已经熟知的,采用 Bluemix 平台几乎不需要增加新的学习成本;最后一点是,Bluemix 底层采用 IaaS 是可以提供企业级需求的 Softlayer,可以有效的保证平台的高性能和高安全性。
目前,Bluemix 正处于公开测试阶段,程序员只需要简单的注册就能轻松的使用 Bluemix 提供的平台云服务。在测试阶段,每个注册账号可以获得 8G 的内存空间用来部署和运行足够多的应用,其中还包括多达 20 个云服务的使用权,注册网址是:www.bluemix.net
Bluemix 运行时和 Buildpacks
在 Bluemix 中程序运行时是以 Buildpacks 的形式提供给用户的,通过下面这张图,可以了解运行时和 Buildpack 的关系。
图 2. 图解 Buildpack
在 Bluemix 中自带四种 Bludpacks,分别是 Liberty for Java,Node.js,Ruby on Rails,Ruby Sinatra。如果部署的应用是上面四种语言之一,那么在部署应用的时候就不需要指定相应的 Buildpack,平台自身会根据部署的应用类型选择对应的 Buildpack。在本文开始的部分,我们提到 Bluemix 支持几乎所有类型的应用,那么除了上面四种应用,其他类型的应用又是通过什么方法进行部署呢?答案就是在部署应用的时候,明确的指定应用所需的 Buildpack 类型,这些 Buildpack 有的来自社区,有的来自程序员自己的开发,因为 Bluemix 是一个开放的云平台架构,允许第三方根据其标准去做一些客制化的拓展。下图所列的就是目前 Bluemi 支持的运行时类型。
图 3. 运行时(Runtimes)
Bluemix 提供的服务(Services)和功能插件(Add-Ons)
应用程序往往不是单独存在的,它需要额外的附加一些新的价值才能使其丰富起来,在 Bluemix 中这些应用程序的附加值是通过服务(Services)和功能插件(Add-Ons)来实现的。在 Bluemix 中,为程序员提供了分门别类的多种服务,这些服务主要包括:Web 和应用服务,移动开发服务,数据管理服务,大数据,DevOps 服务等等。Bluemix 可以做到以最小的代价将相应的服务添加到应用程序中,以此来丰富应用程序,这些操作既可以通过命令行,也可以通过基于浏览器的 UI 来完成。在使用过程中,用户可以创建多个服务的实例,同样多个应用也可以同时使用同一个服务实例。
功能插件(Add-Ons)可以理解成一种特殊的服务,这些功能插件是为运行时来提供更高层次的附加功能。用户可以根据自己的需求,选择应用是否连接到一个或者多个功能插件上,以此来丰富运行的应用程序。功能插件与服务的不同之处在于,同一个 Space 里,只能有一个功能插件实例,多个应用去连同一种功能插件的时候,实际上连的是同一个插件实例,共享同一份服务资源。
对于服务和功能插件来说,当某一个服务绑定到应用中,或者当应用连接到某一个功能插件上时,关于这个服务和功能插件的相关服务信息就会被写进一个成为“VCAP_SERVICES”的系统环境变量中,用户可以在代码里通过调用 System.getenv(“VCAP_SERVICES”) 来获取具体的信息,这些信息是遵循一定的格式的 JSON 字符串,例如对于某一个数据库的服务,读到的环境变量里主要就是数据库的连接信息,用户可以在应用程序里获取并建立与数据库的连接。
如何使用 Bluemix Java 运行时
BlueMix 为程序员提供了多种方法开发,测试应用并最终运行在 Bluemix 运行时中,本文主要关注 Bluemix Java 运行时,并向读者介绍最常用的几种方法,其他运行时的使用方法和本文介绍的类似,读者可以自行使用。
使用命令行工具部署和管理应用
命令行工具一直受大多数程序员欢迎,高效并且高性能,你想在 Bluemix 上做的任何事情,都可以通过命令行工具来完成。比如下面所列,是我们和应用打交道时用到的最频繁的操作。
应用的部署,启动,停止,重启以及删除、 服务的创建,绑定,以及解除绑定等操作 查看和监控应用程序的日志
命令行工具的安装也很简便,请首先阅读文章末尾的参考资源安装命令行工具。使用 Bluemix 之前,需要首先注册 Bluemix 账号,访问 www.bluemix.net 注册 Bluemix 账号,当这些都完成以后,让我们开始你的平台云之旅吧!
当使用命令行部署 Java EE 的应用到 Bluemix 的时候,Bluemix 支持三种格式应用的部署,分别是:WAR,EAR 以及直接上载一个 Liberty server 到 Bluemix。除了支持这三种格式的打包文件外,还支持将打包文件解压成目录结构,通过命令行将整个目录结构上传并部署到 Bluemix 环境。我们这里将以一个 WAR 应用为例子来详细讲解每一步的操作,关于其他两种格式的应用的部署与 WAR 应用的部署几乎是一样的,详细介绍请阅读参考资源——部署 Liberty 应用到 Bluemix。
登录 Bluemix
使用之前注册的用户名和密码登录到 Bluemix,为部署应用做准备:
首先,使用“cf api”建立于 Bluemix 的连接,连接地址是 https://api.ng.bluemix.net
清单 1. 连接 Bluemix
USAGE: cf api [URL]C:\Users\IBM_ADMIN>cf api https://api.ng.bluemix.netSetting api endpoint to https://api.ng.bluemix.net...OKAPI endpoint: https://api.ng.bluemix.net (API version: 2.2.0)Not logged in. Use 'cf login' to log in.
其次,运行“cf login”登录到 Bluemix 并选择所要工作的组织和空间
清单 2. 登录 Bluemix
USAGE: cf login [-a API_URL] [-u USERNAME] [-p PASSWORD] [-o ORG] [-s SPACE]C:\Users\IBM_ADMIN>cf loginAPI endpoint: https://api.ng.bluemix.netUsername> xiuleizh@cn.ibm.comPassword>Authenticating...OKSelect an org (or press enter to skip):1. xiuleizh@cn.ibm.com2. OE_Runtimes_SVTOrg> 1Targeted org xiuleizh@cn.ibm.comTargeted space devAPI endpoint: https://api.ng.bluemix.net (API version: 2.2.0)User: xiuleizh@cn.ibm.comOrg: xiuleizh@cn.ibm.comSpace: dev
部署应用到 Bluemix
本文提供一个例子应用供大家下载部署使用,这个应用是 HelloWithMongo.war,里面包含了一个简单的 servlet 以及一些对 Non-SQL 数据库 Mongo 的基本操作,在 Bluemix 提供的数据库服务里包含了 Mongo 数据库,我们直接拿来使用。
运行“cf push”命令来部署应用到 Bluemix:
清单 3. 部署应用到 Bluemix
USAGE: Push a single app (with or without a manifest): cf push APP [-b BUILDPACK_NAME] [-c COMMAND] [-d DOMAIN] [-f MANIFEST_PATH] [-i NUM_INSTANCES] [-m MEMORY] [-n HOST] [-p PATH] [-s STACK] [-t TIMEOUT] [--no-hostname] [--no-manifest] [--no-route] [--no-start]C:\Users\IBM_ADMIN>cf push HelloMongoDW -p C:\A_Workspace\apps\HelloWithMongo.warCreating app HelloMongoDW in org xiuleizh@cn.ibm.com / space dev as xiuleizh@cn.ibm.com...OKUsing route hellomongodw.ng.bluemix.netBinding hellomongodw.ng.bluemix.net to HelloMongoDW...OKUploading HelloMongoDW...Uploading from: C:\A_Workspace\apps\HelloWithMongo.war53.4K, 14 filesOKStarting app HelloMongoDW in org xiuleizh@cn.ibm.com / space dev as xiuleizh@cn.ibm.com...-----> Downloaded app package (484K)OKBuildpack Version: 20140527-0132-----> Downloading IBM 1.7.0 JRE from http://file.icap.cdl.ibm.com/icapShared/jre/ibm-java-jre-7.0-6.0-linux-x86_64-small-footprint-uncompressed-jar-20140116.tar.gz (0.0s) Expanding JRE to .java (1.2s)Downloading from output/wlp/com.ibm.ws.liberty-2014.4.0.0-201405270132.tar.gz ... (0.0s).Installing archive ... (0.6s).-----> Uploading droplet (93M)0 of 1 instances running, 1 starting1 of 1 instances runningApp startedShowing health and status for app HelloMongoDW in org xiuleizh@cn.ibm.com / space dev as xiuleizh@cn.ibm.com...OKrequested state: startedinstances: 1/1usage: 1G x 1 instancesurls: hellomongodw.ng.bluemix.net state since cpu memory disk#0 running 2014-05-30 06:45:02 PM 0.6% 329.8M of 1G 179.1M of 1G
部署成功以后可以运行“cf apps”查看应用的运行状态。在这里有几点需要说明:第一,<app_name>最好要做到唯一,不和部署在 Bluemix 上的其他应用重复,因为默认情况下这个<app_name>会和 domain 组成应用的访问连接,即:<app_name>.ng.bluemix.net,每一个应用的访问连接应该是唯一的,如果不是唯一,部署的过程中会报错提醒,我们只要换一个不一样的名字即可;第二,cf push 命令默认会将当前目录下的所有内容 push 到云端,除非我们显示的使用 –p 参数显示的指定要部署的内容;第三,从上面的输出中可以看到,应用的访问路径是“urls: hellomongodw.ng.bluemix.net”,即“http:// hellomongodw.ng.bluemix.net”,这也是默认的 Bluemix 中应用的访问路径的统一格式“appname.domain”。