我们的SAP Cloud Platform提供了开发和运行多租户应用程序的能力。 多租户应用程序允许您在提供商提供的一种解决方案的框架内分别为来自不同组织的多个客户端提供服务。 每个客户称为租户。 他通过分配给特定租户的URL访问该应用程序-这样,用户彼此隔离。
在几篇文章中,我们将介绍以下主题:
第1部分。SAP Cloud Platform场景概述中的多租户
第2部分。将MTAR解决方案上传到平台,链接数据库并为租户创建订阅,配置提供者子帐户
第3部分。持久性服务-数据初始化和隔离
第4部分。身份验证管理-配置服务承租人
第5部分。SAP Cloud Connector-设置和配置服务以连接到本地系统
第6部分。配置连接服务并测试多租户应用程序
第7部分。Fiori Launchpad-使用Portal服务,针对多租户应用程序的图块配置注意事项:本文使用全局(生产性)SAP Cloud Platform帐户。 要运行脚本,必须在该帐户中另外连接以下服务:
- 对于应用程序提供商子帐户(SAP HANA,SAP Cloud Platform Portal),必须至少分配一个配额来启动Java应用程序(Java配额);
- 对于客户子帐户:SAP Cloud Platform门户,SAP Cloud Platform身份验证。
第1部分。SCP多租户和解决方案审查SAP Cloud Platform是用于开发和启动云应用程序(包括具有多个租户的应用程序)的平台,因此其服务支持多租户。
您认为如果客户存储在SaaS应用程序中的数据可供其他客户使用,他们会感到高兴吗? 这显然违反了数据隔离。
通过为每个客户端提供唯一的租户ID,可以解决此问题。 由于该应用程序是直接从提供程序中部署的,因此必须订阅客户端才能访问此应用程序。 这意味着客户无需将应用程序复制到他的帐户,只需订阅即可,此后,客户将收到特定租户的特殊URL。 因此,当通过此专用URL启动应用程序时,将通过唯一的租户标识符来标识用户。
多租户应用程序的好处:
- 降低总体拥有成本(TCO):通过在客户之间共享计算资源和运营成本,可以降低此类应用程序的总体拥有成本。 随着多租户应用程序服务的客户数量的增加,成本节省也增加了;
- 运营效率:通过更新供应商提供的应用程序实例,应用程序更新和错误修复适用于所有租户;
- 可扩展性:快速的客户服务。 要访问该应用程序,新客户端仅需要为其创建订阅;
- 可配置性:允许客户根据应用程序的要求配置自己可以使用应用程序的用户储备,自己的后端服务等。
考虑全局SCP帐户中客户子帐户和提供商子帐户之间的区别:

如图所示,在全局SCP帐户内部署了两个子帐户-提供者子帐户和客户子帐户。
提供者子帐户包含应用程序的业务逻辑,其接口以及存储彼此隔离的客户数据的数据库。 应用程序实际上是在此帐户上运行的。
如前所述,客户端通过订阅来访问应用程序。 请注意,不会在用户帐户内复制或启动应用程序。 在客户的子帐户中,可以添加仅适用于该使用者的配置。 例如,您可以将身份提供程序配置为云平台应用程序的用户存储库。 或者,配置目标路径,该路径可以指向在客户端环境中运行的内部服务(例如,您可以访问本地系统上的数据)。
现在让我们谈谈SCP服务中的多租户。
a)持续服务可以通过三种方法在此服务中实现多租户:
1.分隔柱。 此方法使用表中的特定列以确保数据隔离。 在这种情况下,用户可以使用相同的方案。 但是,使用每个客户专用的租户标识符来区分数据。 为了确保在应用程序中共享数据,每个SQL语句必须包含一个租户标识符。
2.一种设计中的表格。 此方法允许应用程序客户端将其数据隔离在特定租户的一个或多个表中。 这是通过在数据库中为每个客户端创建表或架构来实现的。 客户端表鉴别符确定如何将这些表与其他客户端表区分开。 表可以采用相同的模式,并使用前缀或后缀来区分它们; 也可以使用该模式的表客户端标识符将它们置于单独的模式中。
3.计划的分离。 在这种情况下,通过以不同方案存储表来实现客户数据的隔离。
b)身份认证
身份认证是基于云的解决方案,用于管理SCP应用程序以及必要时本地部署应用程序的生命周期。 它允许您配置身份验证,用户单点登录等。 连接服务后,将为帐户管理员提供一个租户,在其中配置应用程序并管理用户授权。 该服务为SCP提供了身份提供者。
为特定提供商配置了客户的子帐户,在其中定义了用户,配置了角色,并配置了对客户端所订阅的提供商应用程序的访问。 角色在提供商的应用程序中描述。 因此,实现了用户的隔离。
c)连通性
客户端可以配置对本地系统上数据的访问。 使用诸如SAP Cloud Connector之类的工具,您可以安全地连接到提供某些数据的本地应用程序或系统。 客户端在其子帐户内配置云连接器中描述的本地系统的目标路径。 目标路径的名称在提供商的应用程序中指示-因此,当客户端访问该应用程序时,客户端本地系统中的数据将传输到该应用程序并进行可视化显示。
我们转向对场景的回顾,其实现的描述将在本文的框架内进行。
SAP有一家可靠的合作伙伴公司,专门为石油和天然气行业提供解决方案。 我们将其称为ITeLO Consulting。 该公司使用SAP Cloud Platform构建和启动其云应用程序。 ITeLO Consulting倾向于以SaaS的形式提供其应用程序。 在此模型中,该软件作为服务提供,可通过Internet向客户提供。
该公司开发了一个污染监测小组,可帮助石油和天然气公司比较工厂和城市中的空气污染水平。 该决定引起了一些希望采取措施防止污染的石油和天然气公司的兴趣。
ABC PetroCorp和XYZ EnergyCorp是两家从ITeLO购买此解决方案的石油和天然气公司。
该项目的架构师Robert ITE在ITeLO Consulting工作。 该公司购买了SAP Cloud Platform软件包,其中包含创建此应用程序所需的服务。 Robert的方案是开发多租户SaaS应用程序并将其提供给客户-ABC PetroCorp和XYZ EnergyCorp。” Emily是ABC PetroCorp IT员工。 她被指派与罗伯特一起从事这个项目。
该解决方案的体系结构如下所示:

在这种情况下,提供者子帐户将是ITeLO Consulting,订阅该应用程序的客户的子帐户将是ABC PetroCorp和XYZ EnergyCorp。 客户子帐户中的设置将相似,因此,我们将仅考虑ABC PetroCorp客户的配置。
帐户说明:
1)ITeLO Consulting-在其中运行数据库,业务逻辑和用户界面应用程序的提供商帐户。
数据库:
每个工厂的空气污染信息都存储在SAP HANA数据库中。 来自不同客户端的数据使用JPA提供的租户隔离功能分别存储。
业务逻辑:
业务逻辑是在提供者的子帐户中运行的Java应用程序中定义的。 一个Java应用程序实例由不同的客户端使用。 每个用户都订阅该Java应用程序,并接收一个唯一的URL来访问该应用程序。 由于使用此URL访问应用程序,因此SCP会检索在应用程序逻辑中使用的租户标识符。
使用者介面:
用户界面逻辑是在提供程序的子帐户中运行的HTML5应用程序中定义的。 与Java应用程序一样,HTML5应用程序的实例为不同的客户端运行。 客户端使用唯一的URL来访问应用程序。
2)ABC PetroCorp-在其中创建订阅的客户端子帐户,创建身份提供者(IdP)的特定配置并提供对本地服务的访问。
Java和HTML5应用程序未部署或复制到此帐户。
身份和访问管理:
该应用程序的访问应仅限于ABC PetroCorp员工。 ABC PetroCorp拥有自己的身份认证提供程序(SAP Identity Authentication),其中包含有关公司员工的信息(姓名,电子邮件,组织,角色等)。 它是为ABC PetroCorp子帐户专门配置的,因此只有员工才能访问他们所订阅的应用程序。
连接服务:
ABC PetroCorp已在本地启动服务,提供有关其工厂的信息-工厂员工人数,工厂位置等。 所有这些信息都必须从其环境中提取,并使用SAP Cloud Connector提供给应用程序。
第2部分。将MTAR解决方案上传到平台,链接数据库并为租户创建订阅,配置提供者子帐户多租户应用程序必须在提供商的子帐户中运行。 ITeLO Consulting的Robert是帐户管理员,需要完成以下步骤来安装该应用程序:
- 创建一个包含所有工件的应用程序存档;
- 将应用程序存档下载到您的ITeLO Consulting帐户;
- 将ABC PetroCorp客户端订阅到在提供商的子帐户中运行的应用程序;
- 设置在Internet上运行的开放服务的路径。
预设:
- 您已经安装了Java 8。
- 为SAP CP安装了带有插件的 Eclipse Neon ;
- Eclipse已安装EGit插件;
- 下载并解压缩最新版本的SAP CP Java Web Tomcat 8 SDK ;
- 下载并安装MTA Archive Builder ;
- SAP HANA数据库已连接到SCP帐户(用于提供商子帐户);
- 在ITeLO Consulting提供程序的子帐户中,已为启动Java应用程序分配了配额(至少一个未使用的计算单元,更多有关在此处分配配额)。
注意:对于试用(trial)帐户,无法在全局SCP帐户中创建多个子帐户。为了安装多种族的应用程序,本文将使用SCP功能,例如“解决方案”(下载解决方案)。 或者,您可以将应用程序模块分别加载到平台中。
污染监测应用程序的源代码位于
GitHub上 。
首先,我们克隆项目并将其
上传到Eclipse工作区。 成功安装后,该项目将出现在工作空间中,其结构如下所示:

该应用程序包含使用各种技术开发的几个模块。 这些模块必须安装在不同的运行时环境中(例如Java,HTML5)。 SCP支持创建一个单个应用程序,该应用程序在一个档案中包含不同的模块,而不是分别创建和加载模块。
如应用程序体系结构所示,业务逻辑是在Java应用程序中定义的,而用户界面逻辑是在HTML5应用程序中定义的。 现在,罗伯特(Robert)先生将创建一个多模块(或多用途)应用程序(MTA)的归档文件,以将应用程序打包为便于下载到平台的格式。
要创建具有多个应用程序模块的归档文件,您需要下载“ mta.jar”并配置“ MTA归档文件生成器”(在上面的预设中指定了“ MTA归档文件生成器”安装说明的链接)。
MTA描述符文件(mta.yaml)中描述了多功能应用程序模块,该文件位于项目的根文件夹中。

mta.yaml文件包含有关在应用程序的构建过程中将创建的Java和HTML5模块的信息。 打开文件,然后通过在id字段中指定数据库标识符将SAP HANA数据库绑定到Java应用程序。

id是在提供者的子帐户中运行的数据库的标识符。 可以在持久性->数据库系统下的ITeLO咨询帐户的SCP控制面板中找到它。

在我们的例子中,“ mta.yaml”中的数据库标识符将如下所示:

我们保存更改,并打开命令行,转到包含污染监测项目的文件夹,然后输入以下命令:
java -jar [ mta.jar] –build-target=NEO build

此命令将开始在MTA归档文件中构建应用程序的过程。
成功组装后,将在项目文件夹中生成MTA存档文件(pollutionmonitoring.mtar)。

下一步是将MTA存档(pollutionmonitoring.mtar)安装在ITeLO Consulting子帐户中。 这可以使用SCP控制面板中提供的“解决方案”功能来完成。 为此,请转到“解决方案”选项卡,然后单击“部署”按钮。

在出现的对话框中,通过单击“ MTA存档”字段中的“浏览”按钮转到污染monitoring.mtar文件的位置并选择它,然后单击“部署”。

在ITeLO Consulting帐户的控制面板中成功下载MTA存档后,您将看到以下内容:
•在“ Java应用程序”选项卡中,将显示正在运行的Java应用程序“污染监控”;

•数据库将自动绑定到Java应用程序。 要进行检查,请转到Java应用程序,然后选择选项卡“配置”->“数据源绑定”;

•在“ HTML5应用程序”选项卡中,将显示正在运行的HTML5应用程序“ pollutionmonitoringui”。

现在,罗伯特需要为客户创建一个名为ABC Petro Corp的子帐户。
转到您的全局SCP帐户,然后在“子帐户”标签中选择“新子帐户”。

在出现的对话框中,输入子帐户的名称,选择环境(Neo)以及全局帐户以及提供者的子帐户所在的区域。 然后点击“创建”。

现在,另一个子帐户将出现在全局帐户中-客户子帐户。
下一步是在ABC Petro Corp客户帐户中为在提供商帐户中运行的应用程序创建订阅。 为此,请针对Neo环境使用控制台客户端。 此处介绍了如何安装。
在Neo的控制台客户端中,输入以下命令:
neo subscribe –account << ABC_PetroCorp>> -application << ITeLO_consulting>>:pollutionmonitoring -user << >> -host << >>
子帐户ID可以在“概述”->“子帐户信息”标签中找到。

用户ID在SCP控制台右上角下拉菜单中的“用户信息”选项卡中指示。
文档中介绍了Neo环境所有区域的主机。
要订阅HTML5应用程序,请使用SCP控制面板。 我们将转到ABC Petro Corp客户的子帐户,然后选择“订阅”->“新订阅”标签(适用于HTML5)。

在对话框中,选择提供程序的子帐户和其中的HTML5应用程序,然后单击“保存”。

现在,客户端已订阅了提供程序提供的Java和HTML5应用程序,并且显示在ABC Petro Corp帐户的控制面板中。

用于监视污染的应用程序允许您显示有关工厂和城市污染的数据。
工厂污染数据位于客户的本地系统中。 有关城市污染程度的信息可以通过互联网上的开源服务获得。 这样的服务可以是OpenAQ。 污染监控应用程序可以通过在SCP控制面板中描述目标路径来访问此服务。
ABC Petro Corp和其他潜在客户将使用此服务,因此目标地址将添加到ITeLo Consulting提供程序的帐户中。
对于Java应用程序,在web.xml文件中描述了名为openaq – api – dest的目标路径。

该目标路径在类“ PollutionDataService”(文件“ PollutionDataService.java”)中指示。

完成对目标路径的搜索后,将通过它启动从Java代码到OpenAQ服务的所有调用。
目标路径“ open-api-dest”文件位于“ pollutionmonitoring”项目内的“ Destinations-Provider”文件夹内。

该文件包含OpenAQ服务的URL。

此目标路径必须加载到ITeLo Consulting提供程序的子帐户中。 为此,我们转到ITeLo Consulting子帐户,转到“ Java应用程序”选项卡,然后选择“污染监测”应用程序。
接下来,选择选项卡“配置”→“目的地”,然后单击“导入目标”按钮。

在出现的对话框中,指定文件“ open-api-dest”的路径。 此后,将在SCP控制面板中配置目标路径。 点击“保存”按钮。 在云平台中,目标路径如下所示:

该服务可通过https获得,因此您需要建立安全连接。 这可以通过SCP的“密钥存储”服务来完成。 从GitHub下载的污染监测项目已经具有密钥文件:jssecacerts.jks和cacerts.jks。 它们需要加载到ABC Petro Corp.客户的子帐户中。
为此,我们再次将控制台客户端用于Neo环境。
在Neo的控制台客户端中,输入以下命令:
neo upload-keystore –account << ABC_PetroCorp>> –user << >> –location << jssecacerts.jks>> –host << >>
neo upload-keystore –account << ABC_PetroCorp >> –user << >> –location << cacerts.jks>> –host << >>
这些文件(“ jssecacerts.jks”和“ cacerts.jks”)位于“污染监控”项目的“ KeyStore服务”文件夹中。
第3部分。持久性服务-数据初始化和隔离一些客户对ITeLO Consulting的应用感兴趣。 此多租户应用程序应确保ABC PetroCorp数据与数据库中其他客户的数据(例如XYZ EnergyCorp数据)完全隔离。 这对于确保客户端和应用程序数据的安全性非常重要。
来自ITeLO Consulting的Robert希望他的应用程序隔离其客户的数据存储,并且他对如何实现这一目标很感兴趣。
为了实现数据隔离,我们需要确定隔离度,即 表级别(在一个方案中将数据存储在不同表中),方案级别(在不同方案中存储客户端数据),租户级别(在不同数据库租户中存储客户端数据)隔离。 SAP Cloud Platform Persistence Service与JPA(Java Persistence API)和EclipseLink结合在一起,支持这些数据隔离方法的实现。
有三种方法可以在数据库级别实现多租户。 我们在第1部分中研究了这些方法。
在第二部分中,我们将重点介绍一种称为“列分隔符”的方法。 Robert将在他的决定中使用他来隔离数据库级别的数据。
使用分隔符列:
在这种方法中,一个数据库模式分布在应用程序的所有用户之间。 租户ID可用作定界符列中的值。 该代码段如下所示。

作为准备步骤,我们还将初始化将在污染监测应用程序中使用的数据。
步骤1:验证应用程序代码中的分隔符列说明在此阶段,我们将看到如何使用应用程序数据模型在数据库级别提供多租户。
为此,让我们看一下
从GitHub下载的项目,该项目已经加载到Eclipse工作区中。
接下来,我们将看一些项目文件。 您可以通过Eclipse环境执行此操作,也可以下载项目,将其解压缩到方便的位置并分别打开文件。 我们将使用第二个选项。
解压缩的项目如下:

我们将转到位于路径
“ /pollutionmonitoring/java/src/main/java/com/sap/hana/cloud/samples/pollutionmonitoring/model/BaseObject.java”中的项目的文件“ BaseObject.java”,然后使用编辑器将其打开(例如记事本++)。

在此文件中,我们检查“分隔符”方法的描述。 看起来是这样的:

现在,我们转到位于路径“ /pollutionmonitoring/java/src/main/webapp/WEB-INF/web.xml”中的文件“ web.xml”。

确保将数据源(数据库)作为标准源(默认数据库)附加到应用程序。 在web.xml文件中,它看起来像这样:

此示例显示了如何在污染监视应用程序中实现多租户。
步骤2:验证数据初始化Servlet的配置Robert知道他的应用程序的客户需要下载数据才能使用它们。 因此,他创建了一个Servlet来初始化客户端(例如Emily)可用于将数据输入到污染监测应用程序中的数据。
至此,我们将了解如何配置数据初始化Servlet的发布。
该Servlet在文件“ DataInitializationServlet.java”中进行了描述,该文件位于项目中,路径为
“ /pollutionmonitoring/java/src/main/java/com/sap/hana/cloud/samples/pollutionmonitoring/api/DataInitializationServlet.java” 。

其发布方法在文件“ web.xml”中表示(
“ /污染监控/ java / src / main
/webapp/WEB-INF/web.xml“ )。

打开此文件,并确保已使用URL“ / initialize”发布了用于将数据加载到污染监测应用程序中的servlet。 看起来像这样:
步骤3.使用Servlet初始化ABC PetroCorp(客户端)的污染数据来自ABC PetroCorp的Emily可以使用创建的订阅来访问污染监测应用程序。
污染监测应用程序使用两种类型的数据:
污染数据:从外部API,污染传感器等来源读取。
通常从本地客户系统(例如ERP系统)读取工厂数据。
1)在这一阶段,我们将使用项目中的数据初始化servlet创建污染数据。 此数据将存储在SAP CP中的HANA数据库中,该数据库与提供者帐户中的应用程序绑定在一起。
2)应用程序从本地系统读取工厂数据,也就是说,它们没有存储在SAP CP的HANA数据库中。 这将在文章“ SAP Cloud Connector-配置和配置服务以连接到本地系统”的第五部分中讨论。
此时,我们将污染数据上传到“按订阅”应用程序中。 为此,将使用“数据初始化” servlet,该servlet位于项目中,可用于将准备好的数据输入到HANA数据库中。
让我们看一下准备好的数据的外观以及如何使用servlet对其进行初始化。 为此,我们再次转到文件“ DataInitializationServlet.java”,该文件位于项目中,路径为
“ /pollutionmonitoring/java/src/main/java/com/sap/hana/cloud/samples/pollutionmonitoring/api/DataInitializationServlet.java” 。打开它。
在这里,我们可以看到ABC PetroCorp和另一个客户(XYZ EnergyCorp)的准备数据。

我们通过调用数据初始化servlet来初始化ABC PetroCorp的污染数据。
我们将转到ABC PetroCorp客户子帐户的控制面板。 在我们的例子中,全球帐户位于欧洲(Rot)地区,可
通过此链接进行访问。

在子帐户控制面板中,转到“应用程序->订阅”标签,然后选择客户端要订阅的Java应用程序。

在“概述”选项卡中,将指示URL应用程序,将其复制。

打开一个新的浏览器窗口,粘贴复制的应用程序URL并在其中添加“ / initial?Company = ABC PetroCorp”。 之后,初始化将完成,并且数据应出现在屏幕上,并将其发送到应用程序。

现在,我们已经在ITeLO的污染监测应用程序中初始化了ABC PetroCorp的污染数据。
在下一篇文章中,我们将讨论使用身份认证的身份管理-设置租户服务。