[关闭]
@liuhui0803 2016-04-17T13:01:03.000000Z 字数 7195 阅读 2308

使用Bluemix和混合云技术造就更健康的星球,第4篇

云计算 Bluemix 混合云


在这一系列文章中,我们将介绍一个在为公民提供所需医疗用品方面遇到挑战的虚构国家中发生的故事。我们会介绍云解决方案(IBM Bluemix®)和预测分析,以及移动和安全技术如何帮助他们应对挑战, 造就出一个更智能、更健康的星球。

本篇将讨论第1篇提到的移动应用程序。现场的工作人员可以使用移动应用获取有关医疗记录、已发货药品数量,以及实际收到药品数量等信息。通过这些信息可以了解配送过程中浪费的药品数量。此外为了避免不可靠的互联网连接造成问题,所有操作都可脱机进行。当连接恢复后,订单可提交至云端的后端系统。

移动应用概述

在下列架构示意图中,移动组件(移动应用以及相应的服务器端)如下所示。所有组件都托管在IBM Bluemix上:

此处输入图片的描述

MobileFirst Starter容器

MobileFirst Starter容器可供您在Bluemix上开发移动应用程序。这些应用程序还可与其他Bluemix服务配合使用。详细了解适用于Bluemix的IBM Containers

应用程序托管在IBM MobileFirst平台上。IBM MobileFirst Platform Foundation提供了企业所需的重要能力,例如所有这些操作所需的强大安全机制、移动应用程序管理(MAM)、直接更新,以及分析能力。

作为迁移至云环境工作的一部分,应用程序也托管在IBM Bluemix的MobileFirst Starter容器内,而非使用常规的内部环境部署。

IBM Bluemix中的容器运行在IBM Containers之上,这是一种使用了Docker技术的Bluemix运行时。从技术的角度来看,使用Docker或IBM Containers创建的映像或容器之间没有任何区别。

MobileFirst Starter容器为MobileFirst Platform的构建和运行提供了一种快速可靠的方法。

Cloudant DBaaS

我们的系统使用Bluemix中的Cloudant NoSQL服务作为数据服务。Cloudant是一种分布式NoSQL数据库,在JSON文档的存储方面提供了强大的功能,该服务可通过遍布全球的Cloudant数据中心进行复制和分发。

Cloudant实例充当了所预测订单信息的主副本(Master copy)。该实例可使用Bluemix中的Cloudant NoSQL数据库服务创建,其中可存储:

在移动设备上,还将通过该应用创建另一个实例,这个实例会与主副本进行同步,以存储:

移动客户端

我们会在这一节中从比较高的角度介绍有关移动客户端平台、身份验证方法,以及与Cloudant的集成等的选择。

确定平台

在这一场景中,我们选择使用纯粹的原生iOS应用程序,该应用可以通过适用于iOS的MobileFirst原生客户端API与MobileFirst Platform实现全面集成。因为这是一个专用于某一具体用途的企业级应用,因此使用混合环境为多种平台提供支持的做法并不是很必要。另一方面,通过使用原生环境,我们可以借助SDK充分利用只能在原生实施中实现的各种功能。例如指纹验证、设备传感器、对智能手表的支持等。

我们选择使用iOS平台,但通过非常类似的方法也可以为Android平台创建原生应用程序。目标平台的选择取决于客户的具体需求、预算,以及生态系统。

身份验证

身份验证是通过硬编码的用户名和密码实现的。如果需要对这一场景进行扩展,可以将Bluemix中的单点登录服务作为用户目录。将身份验证适配器(Authentication Adapter)与该服务进行集成,便可对用户进行验证。

与Cloudant的集成

与Cloudant数据库的集成是通过MobileFirst Data Proxy实现的。这个数据代理是托管在MobileFirst服务器上的MobileFirst中的一个组件,可对所有到已配置Cloudant服务的调用进行重定向。对数据代理的调用需要进行身份验证。此时可由MobileFirst OAuth Trust Association Interceptor (TAI)对数据代理的调用进行监听,以确认所需的身份验证。详情请参阅"使用Cloudant NoSQL DB API。"

构建移动渠道

本节将概括介绍构建移动渠道的步骤。具体操作包括创建容器,在移动客户端中创建集成代码,以及将应用程序部署到IBM Containers。

创建MobileFirst容器

Bluemix提供了一个MobileFirst Starter映像。您可以使用该映像创建容器,并体验容器的功能和能力。然而为了根据项目的实际需求部署和定制容器,您需要下载评估映像,对其进行定制,然后作为新映像上传至IBM Containers仓库。

有关环境的准备和自行创建映像和容器的详细信息,请参阅"在IBM Containers上运行IBM MobileFirst Platform Foundation。"

构建移动应用

移动应用程序包含下列两部分:

原生代码可使用适用于iOS(或Android)的MobileFirst Native API与MobileFirst平台和服务器进行集成。此外通过MobileFirst Cloudant API与(部署在容器内的)MobileFirst Data Proxy进行通讯,还能实现与Cloudant的集成。

MobileFirst原生应用

若要设置环境并创建您的应用程序,请参阅"使用MobileFirst Platform SDK配置原生iOS应用程序"中的介绍。

在提供的代码中,请留意下列内容:

身份验证适配器

该适配器会通过硬编码的值对用户名staff和密码staff进行身份验证。

function submitAuthentication(username, password){​
    if (username==="staff" && password === "staff"){​
​
        var userIdentity = {​
                userId: username,​
                displayName: username​
        };​
​
        WL.Server.setActiveUser("cloudant", userIdentity);​
        ​
        return { ​
            authRequired: false ​
        };​
    }​
​
    return onAuthRequired(null, "Invalid login credentials");​
}​

请注意,需要在一个名为cloudant的领域(Realm)中设置活跃用户。数据代理需要使用这个领域。不要更改该领域的名称。下文还将介绍与该领域有关的安全配置。

在AuthenticationAdapter.xml中,请注意这里有两个过程:不受保护的身份验证过程(submitAuthentication),以及用于强制进行身份验证的getSecretData过程:

<procedure name="getSecretData" securityTest="AuthenticationAdapter-securityTest"/>​
<procedure name="submitAuthentication" securityTest="wl_unprotected"/>​

OrdersApp

在MobileFirst Native API应用程序的application-descriptor.xml文件中,请注意下列几行:

<userIdentityRealms>cloudant</userIdentityRealms>​

这是用于OAuth身份验证的用户身份领域,这个领域还可供您在AuthenticationAdapter代码中存储活跃用户的凭据。

在worklight.plist中,请注意下列值,您需要将其复制到原生的Xcode项目中:

<key>protocol</key> ​
<string>http</string>​
<key>wlServerContext</key>​
<string>/CAMSSHealthcareProj/</string>​
<key>application id</key>​
<string>OrdersApp</string>​
<key>application version</key>​
<string>1.0</string>​

在authenticationConfig.xml中,请留意为MobileFirst框架定义安全机制所用的下列配置:

领域

<realm name="cloudant" loginModule="AuthLoginModule">           ​
        <className>com.worklight.integration.auth.AdapterAuthenticator</className>​
            <parameter name="login-function" value="AuthenticationAdapter.onAuthRequired" />​
            <parameter name="logout-function" value="AuthenticationAdapter.onLogout" />​
</realm>​

安全测试

<customSecurityTest name="AuthenticationAdapter-securityTest">​
    <test isInternalUserID="true" realm="cloudant" />​
</customSecurityTest>​

登录模块

<loginModule name="AuthLoginModule">​
            <className>com.worklight.core.auth.ext.NonValidatingLoginModule</className>​
</loginModule>​

iOS应用

在配置原生iOS应用以使用MobileFirst Native API和MobileFirst Cloudant API时,请注意下列内容:

worklight.plist
从MobileFirst项目中所创建的worklight.plist版本中,复制项目根值中worklight.plist内的值:

protocol: http​
host: <<public IP of your container>>​
port:<<application server port of your container, i.e. 9080>>​
wlServerContext: /CAMSSHealthcareProj/ (the context root of your MobileFirst project)​
applicationId: OrdersApp​

禁用ATS

ATS (App Transport Security)是Apple从iOS 9开始为所有应用强制使用的一系列限制。简单来说,你可以通过在info.plist中添加下列代码的方式将其禁用,否则除非使用带1.2版TLS的SSL,您将无法调用MobileFirst容器。详情请参阅"iOS 9中的ATS和Bitcode"中“禁用ATS”一节。

<key>NSAppTransportSecurity</key>​
<dict>​
<key>NSAllowsArbitraryLoads</key>​
   <true/>​
</dict>​

连接到Cloudant

Order类充当了从Cloudant中获得的订单所对应的模型。

下列代码可连接至Cloudant上的orders_db数据库。该数据库是在第2篇中创建的,可用于存储预测的订单。

//Use the public IP you acquired for the MF container and the port​
IMFDataManager *manager = [IMFDataManager ​
initializeWithUrl:@"http://134.168.13.219:9080/datastore"];​
    ​
NSString *dbname = @"orders_db";​
    ​
// Create remote store​
[manager remoteStore:dbname completionHandler:^(CDTStore *store, NSError *error) {​
        if(error){​
            // Handle error​
             NSLog(@"Error: %@ %@", error, [error userInfo]);​
        }else{​
            CDTStore *remotedatastore = store;​
            NSLog(@"Successfully created store");​
        }​
    }];​

通过使用远程存储,应用程序将可以从云端的Cloudant实例推送订单。

当医疗设施内的工作人员收到货物后,即可更新该数据库,将其写入本地Cloudant存储中。当应用程序进入联机状态后,会(使用pull的方式)与中央数据存储进行复制。

详情请参阅"对同步和脱机存储的支持。"

部署移动应用

本节将介绍下列两个部分的部署:

部署后端

要将移动应用的后端部署到您的MobileFirst容器,请针对评估映像执行下列操作:

  1. 打开ibm-mfpf-container-7.1.0.0-eval/mfpf-server/scripts。在Docker Quick Start终端内运行下列脚本以登录至IBM Containers并设置您的环境。请注意initenv.properties中已经填写了您的Bluemix账户信息:
    /initenv.sh args/initenv.properties
  2. 在ibm-mfpf-container-7.1.0.0-eval/mfpf-server/scripts/args/prepareserverdb.properties中,为您MobileFirst项目的名称设置下列属性:
    RUNTIME_NAME=CAMSSHealthcareProj
  3. 运行下列脚本:
    /prepare serverdb.sh args/prepareserverdb.properties
    这一步可在Cloudant中为MobileFirst运行时创建数据库。如果此时您查看Cloudant控制台,将看不到这个数据库。不过在下文第6步执行startserver.sh操作后就可以看到了。
  4. 在args/prepareserver.properties中,设置下列值:
    PROJECT_LOC=YOUR_MF_PROJECT_PATH/CAMSSHealthcareProj
  5. 准备好您的映像,并将改动的内容上传至IBM Containers仓库,运行下列脚本:
    /prepareserver.sh
    args/prepareserver.properties
  6. 将修改后的映像上传完毕后,即可创建并启动您的新容器。请运行下列脚本:
    /startserver.sh args/startserver.properties

部署客户端

您可以将该应用部署到iOS模拟器或真实的iPhone设备上。这些工作可使用Xcode完成。详情请参阅Apple开发者门户

结论

通过使用Cloudant作为中央操作数据库,并与设备进行同步,即可为移动设备提供脱机同步能力。对于互联网连接不够可靠的乡村等地区,这是一个非常重要的功能。更重要的是,通过在Bluemix上使用自定义的MobileFirst Starter容器,可以更快速地交付解决方案,获得MobileFirst平台所提供的全部收益,这种做法通常是此类大型解决方案所必需的。

在这一系列文章最后一篇,第5篇中,我们会演示如何创建能呈现已发送和已收到订单与货物的报表。

作者:Ahmed Abbass、Ahmed Abdel-Hamid、Mohamed El-Kholy
阅读英文原文Making a healthier planet with Bluemix and hybrid cloud technologies, Part 4

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注