SAP-HANA-XSA-微服务教程-全-
SAP HANA XSA 微服务教程(全)
一、SAP HANA XSA 架构
欢迎学习如何使用 Node JS 在 SAP HANA XSA 构建微服务。在这一章中,我将解释 SAP HANA 架构、从 HANA 1 到 HANA XSA 的演进、云铸造(CF)架构,以及开源如何在 HANA XSA 的微服务开发中发挥非常重要的作用。
SAP HANA 公司
企业拥有 ERP(企业资源规划)系统,在该系统中,它们自主地或通过利用在这些公司工作的员工来运行业务流程。诸如 SAP 之类的 ERP 系统已经提供了成熟的技术,这些技术在数据处理中利用系统应用和产品(SAP)来分析、计划和生产商品和服务。这些商品和服务扩展到各个行业,有时甚至遍布全球。
SAP HANA(图)是一个内存平台,包含一个数据库、一个 web 服务器和其他引擎,构成了一个高可用性、高性能的分析引擎。SAP HANA 作为数据库本质上主要面向列,其内存中功能将 OLAP 和 OLTP 结合在同一个系统中。本书将展示的这些和其他特性使这个系统在全世界的企业中非常受欢迎。众所周知,OLAP 用于传统数据库管理系统中的大量数据。OLTP 用于利用大量短期事务的数据仓库。SAP HANA 具备这两种能力。
图 1-1
显示 HANA 数据库和 XS 引擎的 SAP HANA 环境
了解 ERP 系统并拥有 SAP HANA 等内存平台已变得至关重要,因为业务流程需要根据需求和新趋势做出近乎实时的决策。业务场景,如涉及制造、规划、调度、零售、能源和工业生产等,需要这些能力来创新和重新想象其在日常运营中的可能性。您能想象一家企业的所有数据和流程可以完全集成,而不必在一个系统中进行一些业务操作,在另一个系统中进行其他操作吗?这种流程效率低下,许多冗余的数据副本会给整个环境带来混乱。
截至目前,SAP HANA 已经具备了这些能力。SAP HANA 可以充当数据库。在同一个系统中,有各种方法将数据集合在一起,以创建业务数据模型。集成来自企业其他部分的数据的许多方法之一被称为 SLT (SAP 环境和转型)。
SLT 是一种从 SAP ECC 到 SAP HANA 架构的 ETL(提取、转换、加载)、基于触发器的复制技术。如图 1-2 所示,SLT 还可以集成到其他数据库系统中,如微软 SQL Server、Oracle 和 SAP HANA。可以从 SAP GUI 配置 SLT,或者在 SAP HANA Studio 中建立系统连接后,开发人员可以使用 SAP HANA Studio 中快速查看菜单中的数据配置链接设置表的复制(完全、部分、停止、恢复或暂停)。
为什么这项技术很重要?因为我们将不再需要单独查询外部数据源来分析它们,然后聚合它们。一旦外部数据源表发生变化,它们的触发器会自动将最新的变化复制到 SAP HANA 中,然后可以在 SAP HANA 中创建其他业务数据模型,以便提供对逻辑上分离的系统的全面了解。查看 SAP 的 SLT 官方文档,更深入地了解这项技术( www.sap.com/products/landscape-replication-server.html
)。
图 1-2
从外部数据源到 SAP HANA 的数据集成
将数据模型集成到 SAP HANA、ECC 和外部数据库系统的另一种方法是通过智能数据集成,也称为 SDI。SDI 是一种连接到外部系统并使用自定义适配器批量或实时制作这些系统(微软 SQL Server 和 Oracle 等)上的数据结构的虚拟副本的技术,如图 1-3 所示。SDI 可以从 SAP HANA Studio 中设置,开发人员可以在其中提供虚拟表,并最终使用这些虚拟表创建集成的业务数据模型。在 SAP HANA XSA 中,SDI 可以通过数据库浏览器进行配置。
图 1-3
虚拟化数据源
SDI 中的另一个可用特性是开发人员可以在 SAP Web IDE 中创建流程图(图 1-4 )作为工作流。这些任务有助于创建复制数据或执行其他任务,而无需编写实际代码,只需使用拖放功能来绘制从源到目标的数据流。在某些情况下,可以通过在这些工作流中使用聚合、连接、联合或透视 Node 操作符来实现额外的 ETL。一旦工作流被创建,那么它就成为一个可以被调度的任务,如图 1-5 所示。
图 1-5
SDI 流程图 Node
图 1-4
SDI 流程图操作
要运行此任务,请使用以下语法从 SQL 控制台查询它:
开始任务<task_name>,如图 1-6 所示。</task_name>
图 1-6
从 SQL 控制台启动任务
要计划此工作流,请通过创建 XS 作业(。xsjob)并配置其作业细节,如频率、间隔、执行时间、要运行的对象以及要传递给流图的任何参数。
当我们从 SAP HANA 的数据库端过渡到 web 应用前端时,SAP HANA 提供了一个名为扩展应用服务的 web 服务器,称为 XS 引擎,它允许 SAP HANA 平台通过 HTTP(s)公开和接收数据、发送电子邮件、执行类似历史记录的作业,以及进行出站外部 web 请求调用,例如调用第三方 API(应用编程接口)。XS 引擎是一个相对较小的应用服务器、web 服务器和开发环境。在 SAP HANA 1.x 和 HANA 2.x 中,XS 引擎也有自己的服务器端 JavaScript 语言,称为 XS JavaScript (XSJS)。XSJS 由 SAP 创建,用于提供对数据的 HTTP 访问并与 SAP HANA 数据库进行交互。XSJS 语言是在 SpiderMonkey Firefox 引擎之上创建的。这种语言有几个内部 API,如表 1-1 中所列。
表 1-1
sap hana xsjs apis
|描述
|
$ API
|
用于
|
| --- | --- | --- |
| 数据库ˌ资料库 | . | 集成到 HANA 数据库(已弃用) |
| HTTP 出站 | .请求 | 分析对 XS 引擎的请求 |
| 作业调度 | .安全 | 使用防病毒软件检查数据,并存储安全数据 |
| 微量 | .文本 | 文本分析和文本挖掘*需要额外的许可 |
| 跑龙套 | $.跑龙套 | Zip 和 xml 解析 |
虽然这些 XS API 仍在 XS 兼容模式下的 HANA 2 上工作,但还有另一种方式可以在 SAP HANA XS 高级版中与 SAP HANA 数据库进行交互。在第四章中,将会有使用 Node JS 实现和@sap Node 模块的等效方法。
XS 引擎受到企业的欢迎,因为它允许 SAP HANA 中的近实时内存流程,并允许公司以一种更简单的行业标准方式(称为 REST APIs)与其 ERP 数据进行交互。REST 代表具象状态转移,通俗地说就是系统的状态来源于数据,而不是会话状态。对于无状态的互联网也是如此。API 允许系统的外部消费者通过互联网协议与它交互,而不必提供对后端系统的直接访问。API 的消费者需要知道后端 API URL、发送给 API 的数据结构以及他们将收到的响应(如果有的话)。一些希望最小化技术栈足迹的公司开始远离像微软这样的外部技术。NET 或 Java,并创建了 XS 应用,而其他人仍然使用这些外部技术来消费来自 XS 引擎的 SAP HANA 后端服务。
在 SAP HANA 中创建 XS 应用的另一个好处是,应用可以像后端的数据库一样简单,也可以包含一个 web 服务(REST API),甚至是前端的 HTML5 modern 应用,如图 1-7 所示;否则,在全栈场景中,它可以包含所有这些组件,作为解耦的微服务应用。REST APIs 充当服务消费者的黑匣子——消费者不应该关心后端运行的是什么流程。出于他们自己的考虑,他们只需要知道 URL、合同,以及服务是否会返回响应,这样他们就可以处理它。
图 1-7
通过 XS 引擎的 SAP HANA API 请求
云代工厂(CF)
Cloud Foundry(图 1-8 )是一个开源的云应用平台。Cloud Foundry 由一组公司组成,如 IBM、SAP、微软、谷歌和其他公司,他们共同建立行业标准,允许应用在云提供商之间运行,以便开发人员可以专注于应用开发,而不是创建云。创建 Cloud Foundry 就绪的应用的好处之一是,这些应用基本上与基础架构分离,因此当它们准备好迁移到内部、公共或其他私有云时,这些应用可以轻松地从一个环境/云迁移到另一个环境/云。在进入应用之前,看一下 Cloud Foundry 的分层组织和一些我们将与之交互的重要概念是合适的:组织、空间、应用、服务和角色,如图 1-8 所示。
图 1-8
云铸造组织层级
-
一个组织 (org)被定义为一个开发帐户,其中一个或多个开发人员(称为贡献者)具有称为用户帐户的访问权限。这些贡献者被分配了特殊的角色,以便管理、审计和构建云就绪应用或向其他人授予访问权限。出于演示目的,本书中提供的示例将已经创建了一个组织,并且该组织处于活动状态。只有管理员可以更改此组织的状态;但是,我们将假设它在我们的其余练习中处于活动状态。
-
跟随一个组织,有一个或多个空间。一个空间被定义为组织内的一个分区,专门用于构建、部署和维护应用。每个应用的作用域都是一个空间。拥有一个应用最终需要授予访问该应用的角色。应用角色属于且仅属于一个空间。稍后,在微服务 REST API 部分,需要将我们的应用设置为分配到一个空间。
-
应用和服务是 CF 层次结构中的下一层。这些应用和服务允许用户查看一些数据或消费数据。
-
用户可能被分配了一个或多个角色(角色集合是模板)。这些角色允许用户开发、访问、管理或审计应用、空间甚至组织。应用安全性是软件系统中非常复杂的一部分。云中(以及 SAP XSA)的安全性本身就是一个广泛的话题。目前还有其他几本书详细介绍了 SAP HANA XSA 安全性。对于本书来说,在 SAP HANA XSA 环境中访问一个表和一个视图并执行一些存储过程将有足够的安全性。
与基础架构无关的应用本质上更加动态,可以在几分钟内轻松部署,而无需对应用进行更改。这种类型的架构被称为基于容器的架构。CF 是基于容器的,它允许应用在任何编程语言(BYOL——自带语言)和选择的框架中开发和运行。
如前所述,Cloud Foundry 将应用从基础设施中分离出来。此外,Cloud Foundry 资源(应用/服务)可通过一个名为 UAA(用户帐户和认证服务)的路由和授权服务进行访问,如图 1-9 所示。
图 1-9
遵循 CF 路由和 UAA 服务的 REST API
UAA 服务的主要作用是以 OAuth 令牌的形式向经过身份验证的请求颁发用于授权的客户端令牌。这些 OAuth 令牌以 JSON 的形式出现,生成时有一个有限的生命周期。一旦令牌过期,必须发送另一个获取令牌的请求并进行身份验证,UAA 服务需要为后续请求生成新的令牌。本书稍后将演示类似的步骤,展示在 SAP HANA XSA 微服务 REST API 上发出请求的流程。请记住,CF 概念对于理解 SAP HANA XS 高级架构的实施非常重要——有关“SAP HANA 到 HANA XSA”部分的更多详细信息。
通过 UAA(图 1-10 )的客户端到后端资源端点的步骤如下:
图 1-10
CF 客户端请求到端点的步骤
-
请求者在我们的(云)环境中请求一些 URI。
-
路由发现并识别该请求,然后重定向到 UAA 服务进行身份验证。
-
UAA 接收该请求
-
验证并返回 OAuth 令牌
-
拒绝并返回未授权
-
-
请求者必须将所需的请求与 UAA 令牌一起发送,以便后端资源能够识别请求的真实性。有时这被称为不记名令牌。
-
如果令牌有效,后端资源向请求者返回响应;否则,它将返回一个未经授权的错误。
有不同的方式与 Cloud Foundry 实例进行交互。其中之一是通过命令行界面(cf CLI)。CLI 可以与 Linux 命令结合使用,如 pipe、grep 等。我们必须使用各种命令与云/XSA 架构进行交互,例如登录、设置服务、创建、编辑、构建、部署甚至扩展应用或服务。Cloud Foundry CLI 是一个多功能工具,允许开发人员与其云实例进行交互。自动化和编写其他需要人工输入命令的过程是很容易的。它最大限度地降低了在与云交互时引入错误的风险,并让需要了解云容器细节的开发人员和管理员可以使用它。
此类命令的示例有
-
cf 登录 <用户名> #登录云实例
-
cfapps| grep
#从应用列表中检索应用 -
cf 推送 < APP_NAME > #将应用推送到 cf 实例
-
cfscale
-m -I<实例>
这里显示了可用命令的完整列表: http://cli.cloudfoundry.org/en-US/cf/
。
否则,一旦在系统上安装了 Cloud Foundry CLI,就可以运行命令 cf - help 来查看如何使用命令以及它有哪些标志,如图 1-11 所示。
图 1-11
cf 命令行界面(cf CLI)
随着这种动态环境的出现,需要利用额外的开源软件。许多公司正在慢慢采用开发和重用开源软件的概念,以从其他贡献者的开发中受益,并避免必须重新创建可重复的软件解决方案。目前存在几个开源软件包管理器,它们在开发人员社区中非常流行;其中之一是 Node 包管理器(npm)。
在进入 npm 之前,理解 Node JS 是很重要的。Node JS 是一种异步、动态、非阻塞、事件驱动、服务器端的 JavaScript 语言,建立在 Google Chrome 的 V8 JavaScript 引擎之上。与传统的 JavaScript 不同,它不需要浏览器来运行。如果 Node JS 运行时存在于这样的计算机中,它可以作为自治程序在这样的计算机上运行。除了运行时之外,开发人员可能需要利用额外的包/模块来开发健壮的程序,如 REST APIs。这些其他的包/模块是如何进入我们的开发的?这就是软件包管理器派上用场的地方——假设开发者在机器上有特权,能够下载软件包管理器,并且能够运行和安装额外的软件包。创建 Node 程序时,有一些文件需要重点强调:
-
主 Node JS 文件——姑且称之为 index.js。
-
package . JSON——这个文件包含关于 Node 应用的元数据,如运行时、来自其他模块的依赖项,以及一些有助于运行、测试和部署我们的 Node 应用的脚本命令。这个文件在调用包管理器时使用,以便尝试下载特定的依赖项和那些依赖项的版本并将其集成到我们的应用中。
一个从文本编辑器运行的简单的“Hello World”程序如图 1-12 所示。
图 1-12
Node JS 简单的“Hello World”
而在浏览器上运行时(由于使用 HTTP Node 模块创建了一个服务器来服务响应),如图 1-13 所示。
图 1-13
浏览器中 Hello World 的输出
想象文本可以被服务,按照逻辑下一个用例将是能够作为 web 应用服务 HTML,甚至创建一个 REST API 后端服务来服务和接收请求;这将在后面的章节中说明。
Node 包管理器(npm)是一个开源软件包/模块的在线存储库。npm 对开发公共软件的开发者是免费的(查看 NPM 定价部分了解私人开发许可费用)。开发者可以利用这些 Node 模块来构建和扩展他们的应用。当导航 Node 包管理器、 www.npmjs.com/
时,可以找到细节,例如版本、(其他模块的)依赖性、下载历史、下载次数、许可证、储存库 URL、合作者、作者信息,以及开源模块的其他重要细节。其中一些模块足够广泛,可以成为框架本身。一个流行的模块/框架叫做 Express。Express 是构建 REST APIs 的一个非常强大的极简框架。Express 框架具有强大的功能,包括健壮的路由、快速的性能、超高的测试覆盖率和内容协商,它还具有快速生成应用的功能。对于任何类型的工作、流程或任务都有免费的模块,例如,用于验证请求的 Passport 模块、Socket。用于基于事件的实时双向通信的 IO 和 PDF 生成器,仅举几个例子。其中一些模块将在本书的后面部分用于构建 Node JS 微服务,包括路由、认证和请求/响应处理。
什么是微服务?微服务是一种分散式架构,在这种架构中,前端、后端和数据库应用等程序可以独立于环境中的其他程序工作、扩展(增长/收缩)、构建、部署、启动和停止。微服务架构是构建可扩展的、云就绪的、健壮的解决方案的现代方法,这些解决方案是松散耦合的、可独立部署的,主要围绕业务功能进行组织,由一个小团队拥有,如图 1-14 所示。
图 1-14
微服务
开放源码
对于开发团队来说,开源软件已经变得非常重要,它可以将未知的完成特定任务的方法与一些通过包管理器(如 Node 包管理器)开发和共享的软件快速集成。
就像其他事情一样,使用开源软件有好处也有坏处。表 1-2 显示了使用开源软件的一些好处和缺点。
表 1-2
使用开源软件的好处和缺点
|利益
|
缺点
|
| --- | --- |
| 有许多免费使用的开源库 | 大多数来自不知名的开源贡献者出版商 |
| 这些库通常有易于理解和遵循的代码示例和计划文档 | 理解许可证细节可能需要时间 |
| 几乎不需要时间(通常几分钟)就能融入 | 开发人员必须跟上库的版本和更新 |
| 软件包管理器显示最新版本和下载次数,这表明了模块的受欢迎程度 | 软件按原样使用,没有担保 |
| 加快开发成本,因为开发人员不需要重新发明通用流程 | 有经验的开发人员通常理解集成的过程;然而,缺乏经验的开发人员需要一些关于如何使用这类软件的解释 |
| 需要开发一些常见场景的公司的成本节约 | 易受恶意用户攻击 |
| 比商业解决方案便宜 | 缺乏广泛的支持(使用风险自担) |
除了优点和缺点之外,还有一些公司规则可能禁止在某些许可下使用某些开源软件。通常较大的企业有适当的程序,要求他们的法律部门评估使用开源软件的需要,当这种软件不是从他们的资源内部开发的时候。如果您的企业受到这些限制或保护,请咨询您的软件架构师或法律部门,了解您希望利用什么要求和开源库,以便了解您的公司能够利用这些开源软件的可能性。
一些最常见的开源许可证是(请阅读您想要使用的任何开源软件的相应许可证)
-
阿帕奇许可证
-
带许可证
-
通用公共许可证
-
Mozilla 公共许可证
-
Eclipse 公共许可证
SAP HANA 至 HANA XSA
许多公司都是 SAP 的现有客户,并利用 SAP HANA。这些公司是学习如何从 SAP HANA classic 迁移到 SAP HANA XSA(蓝绿色现场部署)的主要受众。蓝绿部署是一种通过运行两个相同的生产系统来减少停机时间的技术,其中一个是活动系统(蓝色),另一个是空闲系统(绿色),在空闲系统上部署并执行完整测试,然后将流量从活动系统(蓝色)切换到空闲系统(绿色),并在新的空闲系统(蓝色)上执行相同的部署和完整测试。那些没有进行升级的公司将能够轻松地从 SAP HANA XSA 开始他们的旅程,因为他们不需要担心现有的开发要兼容新的环境(全新的绿色领域)。根据升级路径的状态,建议制定良好的计划,以最大限度地减少停机时间,甚至消除停机时间。在后面的章节中,我们将探讨实施绿色领域部署方法的模拟,因为 HANA 1 不支持 Node JS 运行时*(作为 XS 经典环境)。
完成这一新的实施练习的第一步也是最重要的一步是能够理解云铸造原则。让我们花点时间来提一下 Cloud Foundry 的几个重要概念,以及它们如何应用于 SAP HANA XSA。这些概念是理解 web 应用、微服务和 REST APIs 的架构、安全性和集成的基础。
从层级的角度来看,正如《Cloud Foundry》中所描述的,XSA 从一个组织开始。在 SAP XSA,组织也是由管理员管理的一组空间。空间是零个或多个应用和/或服务(管理的或用户提供的)的持有者。托管服务是由环境提供的服务。SAP 中这类服务的一个例子是 XS UAA(用户账户和认证服务)。用户提供的服务是由开发者创建的定制服务(CUPS ),这种类型的服务通常不是由市场提供的。应用是用于特定目的的一组一个或多个模块,例如 HTML5 应用或 Node JS REST API。应用由包含具有特定访问权限(也称为范围)的角色的用户访问。
既然已经解释了 Cloud Foundry 的分层结构,并且相同的结构适用于 SAP HANA XSA,那么开始规划将在本书中演示的练习就很重要了。
在演示之前,必须强调 SAP HANA 和 SAP HANA XSA 两种架构之间的差异。对象将受到以下一种或多种方式的影响:
-
不受影响(无变化)
-
被更改(升级或更新)
-
不推荐使用(以后将不再适用)
-
以前不存在的新对象
出于演示目的,请参见下面一个非常相似的项目,因为它存在于 SAP HANA 1 中,现在需要重新创建(或针对 SAP HANA XSA 进行更新)。
假设这个项目有一个多模块项目,包含一组数据库工件,比如一组表、HANA 视图和存储过程等等。这些数据库构件将彼此协同工作,并与 XS JavaScript REST API 服务层协同工作,以读取、创建、更新和删除 SAP HANA 系统中的数据,如表 1-3 所示。这些后端服务将从前端 HTML5 应用中消费,如表 1-4 所示。
表 1-4
XS SAP 1 和 XSA SAP 2 之间的 XS 工件差异
|组件
|
HANA 1 神器
|
HANA 2 XSA 人工因素
|
| --- | --- | --- |
| 旧项目文件 | xsapp | 在 XSA 并不存在 |
| 结节(向后兼容) | 不适用的 | xs-app . JSON–包含安全认证类型、路由、欢迎文件的新工件。如果需要创建 REST API,则必须创建 HTML5 模块,并且它应该包含路由。API 将使用部署 HTML5 模块的 URL Node 模块的相对路径** |
| xsjs(维基百科) | 在 XSJS 向后兼容模式下没有变化 |
| xsjslib |
| xshttpdest |
| xsjob | 无变化 |
| 不适用的 | (Node)。js 文件和 npm 模块(公共或@sap) |
| HTML5 | 视图(xml/js) | 无变化 |
| 控制器(js) | 无变化 |
| index.html | 无变化 |
| MTA 项目 | 不适用的 | xs-security . JSON–描述应用范围的新工件。在必须强制应用范围的情况下,它是一个可选文件 |
| | 不适用的 | MTA . YAML–包含项目 UAA 服务的模块关系和元数据的新工件 |
表 1-3
SAP HANA 1 和 HANA 2 XSA 版之间的数据库工件差异
|组件
|
HANA 1 神器
|
HANA 2 XSA 人工因素
|
| --- | --- | --- |
| 数据库ˌ资料库 | 计划 | 无更改-从 SQL 控制台创建 |
| 模式表 | 需要同义词 |
| 虚拟表 | 需要同义词(类似于跨模式对象访问) |
| 计算视图 | 无变化 |
| 存储过程 | 无变化 |
| 表列函数 | 无变化 |
| 作用 | 无变化 |
| 脚本计算视图 | 必须转换为表函数或存储过程* |
| 分析/属性视图 | 必须转换为计算视图 |
| 不适用的 | hdb grants–从 SQL 控制台创建的新工件 |
| 不适用的 | 角色集合–新工件(角色组) |
| 不适用的 | HDI-config–HDI 容器的元数据 |
| 不适用的 | HDI-名称空间–数据库模块的元数据 |
表函数和存储过程的区别在于,表函数不能执行 CUD (create,update,delete)语句,它们必须返回一个表结构作为输出。然而,存储过程在执行后不需要返回任何类型的输出参数。存储过程是这些类型的操作(创建、更新、删除)的唯一方法。
从代码进入下一层,人们必须考虑应用生命周期管理器。这段代码将被存储、检索和部署到哪里?在 SAP HANA 1 环境中,有 SAP HANA 存储库。这种方法的缺点之一是多个开发人员不能同时处理同一组文件/变更。在 SAP HANA XS 高级架构中,SAP HANA 存储库不再存在;相反,SAP 消除了拥有自己的存储库解决方案的想法,并建议公司将他们的代码存储在外部代码存储库中,如 GIT (Bitbucket 或微软 TFS)。这种方法有许多巨大的好处,例如 DevOps 简介,允许多个开发人员致力于代码功能和 bug 修复,最重要的是,SAP HANA 中 CI(持续集成)的开始。
为简单起见,本书假设每个练习者都可以使用自己的许可证连接、提交和克隆 GIT 存储库——本书将展示使用免费许可证的帐户。
为了使用 GIT,开发人员必须能够访问这个库,熟悉表 1-5 中显示的 GIT 命令,并且要么从命令行执行(如果您使用这种方法,您将需要下载 GIT CLI)要么从 SAP Web IDE 与它们交互,该 IDE 已经有一个到 GIT 库的接口,如图 1-15 所示。GIT 命令是现代软件开发和维护的基础。需要了解这些命令的工作方式以及何时使用它们。还有更多的命令可用,但这里没有全部显示出来。表 1-5 显示了最常用的列表(未按顺序排列)。
图 1-15
SAP Web IDE 中的 Git 窗格
表 1-5
Git 命令
|命令
|
描述
|
例子
|
| --- | --- | --- |
| 克隆 | 将外部存储库克隆到本地工作区 | git clone |
| 犯罪 | 将本地工作区的变更提交到远程存储库 | 去委员会-m |
| 隐藏物 | 保存不想立即提交的更改 | git stash |
| 推 | 将您的更改推送到远程(主)分支 | 去推
| 拉 | 从远程分支提取更改 | git 拉〔??〕〔??〕 |
| 重定…的基准 | 将一系列提交移动或组合到新的基本提交的过程。重定基础的主要目的是维护项目历史 | 吉特狐狸 |
关于外部存储库(如 Git)的最后一点需要理解的是,能够理解 GIT、GitHub 和 GitLab 之间的区别,这可能会给开发人员带来一些困惑,并且经常被错误地解释。Git、GitHub、GitLab 有什么区别?GitLab 和 GitHub 都是基于 web 的 Git 仓库。Git 是在软件开发生命周期中管理开发项目和文件的机制,并将这些更改存储在称为存储库的存储中。类似 git 的存储库不仅仅是一个存储库,它还是 CI/CD(持续集成和持续交付)的开端,因为它通过创建一个流程,经由这些命令自动构建软件。
对于这种类型的存储库和软件生命周期管理的新开发人员,一个巨大的建议是在开始项目之前阅读关于如何使用它们和理解过程的最佳实践。这将真正改变整个过程。一些建议是
-
在提交之前测试你的软件——避免引入错误。
-
经常提交–小的和相关的提交允许更容易的代码共享。
-
编写详细的提交消息——帮助他人理解您提交的代码。
-
使用分支–将 bug 修复和新特性与主分支(黄金副本)区分开来。
-
不要惊慌——当你开始时事情可能会出错,但请阅读如何解决你的问题。
还有许多其他的最佳实践将在后面展示,但是在开始开发之前记住这些将有助于开发人员长期维护更好的软件。
如果以前没有使用过 GitHub 等外部代码库,请从一个示例项目开始。创建它,向项目中添加一些文件,提交,添加有用的消息,并尝试创建一个分支并将其合并回主线。开发人员在真正的项目之前准备得越充分,他们和他们的团队在真正的项目中就会做得越好。
下面是创建首次示例项目的一些步骤。请注意,这不是 REST API 练习中的同一个项目,它只是出于说明的目的——假设已经创建了一个 GitHub 帐户并可供使用,如图 1-16 所示。
图 1-16
GitHub 帐户
- 导航到 存储库 选项卡,点击新建。
图 1-17
创建 GIT 存储库
- 如图 1-17 所示,提供名称和描述等回购详细信息,选择私有或公共,并选择要包含在该项目存储库中的任何许可证。点击创建存储库。
图 1-18
GIT 存储库示例
- 一旦创建完成,将会出现如图 1-18 所示的屏幕。请务必注意屏幕上显示的内容。花点时间浏览不同的选项卡,查看您的代码、问题、拉取请求和所有选项卡。这个屏幕上有很多相关信息,这些信息可以决定发展的成败。在继续之前,在这里投入足够的时间是非常重要的。更多文件可在
https://help.github.com/en/github/getting-started-with-github/create-a-repo
上找到。注意,这个屏幕还允许开发人员克隆或下载一个存储库。克隆或下载按钮将提供一个 URI,可用于从不同的工具设置外部回购,例如 SAP Web ide 或开发人员选择的任何其他支持 git 集成的 IDE,例如 Visual Studio 代码,如图 1-18 所示。
图 1-19
克隆 GIT repo
- 使用来自可视代码的早期 Node JS 文件,将该项目设置为 SMP_PROJ 存储库,如图 1-19 所示。复制网址。
从可视代码中,使用 git 命令 git remote add 设置远程存储库(图 1-20 )。
图 1-20
从 VS 代码添加远程 repo
运行 git remote add 命令后,验证远程存储库(图 1-21 )。
图 1-21
正在验证 git repo 版本
继续将初始文件集 index.js 和 package.json 提交到映射的 GitHub 存储库中。此时使用 Visual Code IDE(或另一个首选 IDE)提供描述更改的消息,而不是使用 git 命令行。请注意下一个图像的右上角,以查看提交消息,其中列出了待提交的更改——确保在提交更改之前, 始终会准备好;否则,可视代码会提示预先暂存它们,然后提交(点击终端菜单下的复选图标),如图 1-22 所示。
图 1-22
来自 VS 代码的代码提交注释
如果提交成功,应该会有一条消息,并且在该操作之后不应该有任何挂起的更改(图 1-23 )。
图 1-23
VS 提交后的代码
此时,变更已经被暂存并提交(它们被放在一个占位符中)。下一步是将这些更改推送到远程存储库。选择源代码控制:GIT 部分上的三个点,并选择按钮或按钮,以选择所需的远程库,如图 1-24 所示。
图 1-24
VS 代码推送至 GIT repo
收到一个错误,因为必须先进行拉操作,然后进行合并和推操作。下一步是提取更改(最初没有),然后重做阶段、提交和推送。尝试几次后,提交的文件出现在 GitHub 存储库中,如图 1-25 所示。
图 1-25
在 GitHub 中验证提交的代码
当回到可视代码时,通过添加注释,在索引文件中进行了有意的更改。保存文件后,它显示为挂起的更改。重复了登台和提交的步骤。最后,变更被推送到外部存储库。几秒钟后,这些更改反映在提交计数中(从 13 增加到 14),如图 1-26 所示。
图 1-26
验证最新提交
要验证文件内容,请参见图 1-27 中显示的第 5 行添加的注释。
图 1-27
验证代码文件更改
一旦 SAP Web IDE 被映射到 GitHub 存储库,合并和执行所有附加步骤的需求应该是不必要的。这些步骤是为了演示不同的 IDE 如何连接到 GitHub 这样的外部代码库,以及如何对它们进行更改,然后使用 git 命令或 IDE 插件接口提交这些更改。SAP Web IDE 示例将包含类似的截屏和对该工具上的步骤的解释。
mta.yaml 公司
在云应用中,有一个扩展名为 yaml(或 yml)的文件。YAML 代表“YAML 不是标记语言”这是所有编程语言的可读数据序列化文件标准。该文件指定了(容器化的)应用如何构建、集成和部署到云环境中。这个文件有一个特定的结构,它遵循关于间距、命名约定、语法和规则的严格规则,这些规则可以在他们的网站上找到( https://yaml.org/
)。
此外,在 SAP HANA XSA 的范围内,该 mta(多目标应用)文件从微服务解释了模块关系、使用的任何服务(托管或用户提供的)以及云系统内部署应用的依赖关系。YAML 文件包含极其敏感的语法和间距规则;因此,在对该文件进行任何修改之前,理解它是很重要的。
该文件中还可以包含其他元数据属性,例如表 1-6 和图 1-28 中显示的属性。
图 1-28
mta yaml 档
表 1-6
mta yaml 公司
|元数据属性
|
意义
|
| --- | --- |
| 身份 | 指多目标应用的名称 |
| 版本 | 指要部署的完整应用(内部版本)版本。您可以使用同一个版本进行多次构建;但是,当版本改变时,会创建一个新的 mtar 文件 |
| 模块 | 指组成数据库模块、Node JS 模块、HTML5 模块或 Java 模块的代码 |
| 资源 | MTA 需要但 MTA 没有提供的东西。本节指定了自定义用户提供服务(CUPS)或托管服务(SAP HANA 提供的服务)的使用 |
| 性能 | 运行时使用的模块中的键值对 |
| 因素 | 保留变量 |
| 需要 | 指的是模块依赖关系 |
结论
在本章结束时,您应该能够了解基本的 SAP HANA 1 环境,并能够了解即将进入 SAP HANA XSA 的一些变化,例如对 GitHub 等外部代码库的需求,XSA 命令行界面的介绍,以及 XSA 环境中存在的新构件,作为能够在 HANA XSA 创建微服务的介绍。
二、XSA 的安全模式
本章解释了使用用户帐户和授权服务(UAA)的 Cloud Foundry 安全模型以及 SAP HANA XSA 如何实施该模型。OAuth 协议及其在 XSA 的重要作用是这一章的一部分。HDI 容器以及对经典对象的跨模式访问与其他开发工件(如同义词)一起进行了解释,并解决了授权问题,因为它们对于任何准备在 XSA 环境中实施开发的企业中存在的跨模式开发场景都是至关重要的。
用户帐户和授权服务(UAA)
用户帐户和授权服务是 Cloud Foundry 架构中的托管服务。它用于根据充当 OAuth 代理的系统对请求进行身份验证,向客户端应用颁发令牌,反过来,这些令牌用于根据与令牌和用户相关联的某些范围对后端系统进行身份验证和授权。该(UAA)服务在用户登录过程中提供帮助,并且还可以充当单点登录授权。在我看来,这是该环境架构中最重要的一步,因为没有它,就不可能对任何用户请求进行身份验证。如果没有经过身份验证的请求,应用或 API 将导致在安全是整个软件系统最重要方面的生产环境中无法访问它。
在 SAP HANA XS 高级版中,该 UAA 托管服务以 JSON Web 令牌(jwt)的形式生成访问令牌。JWT 是一种紧凑且独立的方式,用于以 JSON 对象(RFC 7519)的形式在各方之间安全地传输信息。SAP HANA XSA 中的 jwt 包含用户授权和范围的附加信息。
jwt 的常见用例有
-
授权——这是 JWT 最常见的场景。用户登录后,每个后续请求都将包含允许用户基于其范围访问资源的令牌。单点登录是一个已经广泛使用 jwt 很多年的特性。
-
信息交换–这是一种在各方之间安全传输信息的好方法。还可以使用公钥/私钥对对 jwt 进行签名,以验证请求的真实性。此外,使用报头和有效载荷来计算签名,以验证从原始发送者到接收者的内容没有被改变。
OAuth 2.0
OAuth 是行业标准的授权协议,由 UAA 服务用于授权。OAuth 2.0 专注于客户端开发人员的简单性,同时为 web、桌面和移动应用以及 IoT(物联网)设备提供特定的授权流程。
范围是 OAuth 2.0 中的一种机制,它限制应用对用户帐户的访问。应用可以请求一个或多个作用域。然后,颁发给应用的访问令牌将被限制在授予用户的范围内。通俗地说,作用域定义了可以在服务或应用中执行的操作,例如,能够对 REST API 执行创建、更新、删除和读取。在请求作用域和直接从这些授权服务器访问之前,开发人员必须(或至少尝试)考虑所有可能的方法来防止对应用的未授权访问。开发者必须遵循现在大多数公司执行的简单规则,例如谷歌、脸书、AWS。
创建新用户时,通常会看到这些新帐户默认具有
-
最低权限(或者像 AWS 中的新用户一样没有任何权限)
-
增量授权(仅请求所需内容而不请求额外内容的过程)
-
受限范围(仅提供完成某人日常任务所需的权限,并且必须经过证明)
-
安全评估(旨在最大限度地减少对某些帐户的过多范围的未授权请求。一些评估对于立即消除黑客行为来说成本很高)
通过历史和经验,这些规则更有意义。开发人员通常希望拥有所有类型的权限,这样他们就不会重复向管理员团队请求访问权限;但是,这些规则和做法是为了最大限度地降低向未授权用户暴露数据的风险,并保护数据隐私。
回到协议的定义,OAuth 协议用于让客户端应用知道它在系统上的授权,而不一定是用户是谁或者他们想做什么。Oauth.net 网站上描述的一个完美的例子是使用一个酒店客户进行比较。
该客户到达酒店并出示了他/她的身份证明和支付方式(凭证)。反过来,酒店大厅的某个人(授权服务器)给了客户一把房间钥匙(令牌),然后这把钥匙被批准打开一扇门(某个 API)。该钥匙不是用于打开所有的门,而是仅用于打开授权给用户的门,仅在用户停留期间使用(最终会过期,同一把钥匙将不起作用),如图 2-1 所示。
图 2-1
OAuth 类比
除了 OAuth 令牌之外,开发人员还可以在他们的应用中加入额外的保护措施,比如跨源资源共享(CORS)和跨站点请求伪造(CSRF)。
使用 CORS,可以基于域启用或禁用对特定资源的访问。可以修改 CORS 设置,以设置访问或拒绝访问的特定来源。
在应用路由配置中(在 HTML5 模块的 xs-app.json 文件中),开发人员需要指定需要保护哪些路由。CSRF 设置称为 xsrfProtection(默认值为 true)。这些保护适用于任何改变服务器端状态的 HTTP 请求(PUT、POST、DELETE)。
jwt 有不同的生成和使用方式。最常见的 JWT OAuth 2.0 访问类型是承载令牌。不记名令牌是一个长的加密字符串,对客户端可能没有任何意义。一些服务器可能发布短字符串十六进制令牌,而其他服务器可能将令牌构造为 jwt。我们将在第四章中看到这个令牌。
自定义用户提供的服务–CUPS
Cloud Foundry 架构中的另一种服务是自定义用户提供的服务(CUPS)。根据定义,这些 cup 是由开发人员用户创建的服务,而不是由框架创建的。此外,创建这些服务是因为市场提供的其他服务不存在。一旦创建,CUPS 的行为将类似于通过市场创建的服务。其服务实例将使开发人员能够使用应用绑定来配置他们的应用——CF 使用相同的应用运行时环境变量来自动提供市场服务的凭证。在 XSA 环境中,可以从 SAP HANA XSA 驾驶舱或通过 Linux 终端使用 XS CLI 查看这些服务。
在 SAP HANA XSA 中创建用户提供的服务的用途之一是能够从数据库模块访问经典模式表。
让我们首先在系统数据库中创建一个模式(或者您选择的不同模式),如图 2-2 所示。
图 2-2
在 SAP HANA 中创建模式
一旦创建了一个模式,继续在这个模式中创建一个数据库表,如图 2-3 所示。
图 2-3
在 SAP HANA 中创建表格
一旦创建了表,就验证它。运行 select 语句查看初始的空表,然后向该表添加数据。在本练习中,单个 insert 语句运行了几次。控制台日志显示成功插入的语句,如图 2-4 所示。
图 2-4
添加样本数据
再次验证表格,确保记录确实成功创建,如图 2-5 所示。
图 2-5
验证插入的数据
此时,表中有足够的内容来模拟一个经典的 SQL 模式。接下来,分析需要创建的 XSA 项目。首先创建一个 MTA 类型的新项目(多目标应用)。
请记住,从 Cloud Foundry 层级结构来看,应用属于一个单独的空间。在这个初始步骤中,选择在项目创建过程中将应用绑定到的 XSA 空间。还要注意应用版本(初始版本 0.0.1)。在部署过程中,应用版本有助于部署新功能或应用错误修复。目前,保持这个应用版本为 0.0.1。
图 2-6 后点击完成并确认。
图 2-6
创建新的 mta 项目
一旦创建了项目,它将显示在 SAP Web IDE 的工作区下,默认结构包括 mta.yaml 文件,类似于图 2-7 。
图 2-7
在工作区中显示新项目
我们开始工作吧。首先创建一个名为 db 的数据库模块,这样它可以保存数据库模型、存储过程、同义词以及其他工件,如图 2-8 所示。
图 2-8
创建数据库模块
第一步是提供一个模块名。为简单起见,将其命名为 db ,如图 2-9 所示。
图 2-9
命名数据库模块
然后, db 模块向导将询问可选的名称空间、模式名称和首选的 SAP HANA 数据库。此时,使用版本 HANA 2 SPS 04 来利用环境中的最新功能和开发,如图 2-10 所示。
图 2-10
选择数据库版本
点击下一步,然后完成,如图 2-11 所示。如果提供的一切都正确,应该会出现确认消息,在关闭它之后,新创建的模块将显示在 wavepress 项目中。
图 2-11
数据库模块创建的确认
由于勾选了进行数据库模块初始构建的复选框,创建模块并运行第一个 db 模块构建可能需要几秒钟时间。这样做是为了确保正确创建了 db 模块和 HDI (HANA 部署基础设施)容器。在向项目中添加任何更多的开发之前,所有的都应该是内联的,并且在初始安装和项目创建中没有任何问题。SAP Web IDE 控制台将显示构建日志,最终应该会出现一条成功构建的消息。随着这一进程的结束,在后台发生了一些事情。构建了 db 模块,用 HDI 容器更新了 mta.yaml 文件,更新了 HDI 名称空间,在数据库中创建了一些容器用户,最后,收到了完成日志消息。此时,所发生的大部分事情在 Web IDE 中可能是不可见的。是可以的;这些项目可以稍后验证。现在,假设 Web IDE 已经按照预期完成了所有工作,如图 2-12 所示。
图 2-12
Web IDE 控制台生成消息
如果在项目内部展开 db 模块,那么会创建一个 src 文件夹和一个 package.json 文件。 src 文件夹将用于存放开发工件(如模型、存储过程、同义词),而 package.json 文件在每次触发 db 模块构建时使用。该文件中包含在项目构建期间使用的元数据,包括依赖项和构建信息,如图 2-13 所示。
图 2-13
SAP Web IDE 显示了数据库模块和数据库模块中的 package.json
到目前为止,唯一已经完成的工作是数据库模块。开发人员不希望在某个时候看到数据库屏幕吗?是的。请注意 SAP Web IDE 的左侧导航面板;到目前为止,所有的工作都已经在工作区部分完成了,它用一个 xml 标记图标表示。
数据库浏览器部分是工作区图标下面的下一个图标(用四个立方体表示)。点击它,看看会发生什么。在其他数据库系统中,第一次打开数据库时,它会提示输入连接字符串设置和凭据。它与 SAP HANA 数据库浏览器没有什么不同。由于此时尚未配置任何数据库连接,并且 SAP Web IDE 知道当前项目正在使用 HDI (HANA 部署基础设施)容器(在 db 初始模块构建期间创建,并且在数据库模块创建期间尚未指定任何要使用的模式),因此它将询问是否应该现在添加一个。此时的选项是映射到默认的 HDI 容器,或者,如果已知任何模式凭证,那么也可以建立连接,如图 2-14 和 2-15 所示。
图 2-14
第一次打开数据库浏览器
从默认的 HDI 容器开始。注意,HDI 容器名由用户名、一些惟一的标识符、项目名、hdi_db 和括号中的空间名组成。如果创建了一个以上的 HDI 容器连接,将遵循类似的模式。此时继续使用默认设置。这个 HDI 容器将包含我们从数据库模块创建的任何 CDS 模型(hdbcds 文件)和同义词。另一方面,经典模式连接将包含来自经典世界的任何数据库对象。
图 2-15
添加数据库连接(显示 HDI 容器)
如果 HDI 容器连接建立正确,应该是这样的。选择表部分,注意没有最初由 HDI 容器创建的表。稍后,在创建表之后,它们将显示在此部分中。如果表格列表太长,可以在图 2-16 底部的搜索框中输入几个字符进行细化。
图 2-16
显示来自数据库连接的 HDI 容器
现在, db 模块有了 HDI 容器,并且已经正确构建。在演示场景中,对于创建模型、查看表格和查询数据的人来说,这些步骤可能已经足够了。在真实的场景中,情况并非如此。在真实的场景中,开发人员需要使用和集成逻辑上分离的数据库表或模式中的数据。开发人员可能需要创建混合信息模型,并从计算视图提供这些数据,或者从存储过程或表函数中查询这些数据。假设到目前为止只创建了一个 HDI 容器和数据库模块,开发人员将如何实现这样的场景呢?请记住,SAP HANA XSA 环境遵循 Cloud Foundry 原则,开发人员还必须了解容器之间的安全性和容器隔离概念;访问单独的模式不再像在 SAP HANA 1 中那样简单。
在 SAP HANA XS 高级架构中,需要创建自定义用户提供服务(CUPS ),并授予对 CUPS 服务架构的访问权限。在 SAP HANA XSA SPS 03 之前,这一步必须从 XS 命令行使用 xs cups 命令完成
xs CUPS–“主机”、“端口”、“用户”、“密码”、“驱动程序”、“标签”、“模式”(如果开发人员不熟悉命令语法,并且如果开发人员以前没有使用 cli 工具的经验,这将是一个非常繁琐的过程)
db 模块有一个新特性叫做 SAP HANA 服务连接——如图 2-17 使用 SAP HANA XSA SPS 04 所示。要使用该功能,右键单击 db 模块,选择 New,然后选择 SAP HANA Service Connection。
图 2-17
添加 SAP HANA 服务连接(定制服务)
选择该功能时(图 2-17 ),会出现一个向导提示输入 CUPS 设置,如名称、数据库连接详情和认证凭证,如图 2-18 所示。创建此 CUPS 服务时要小心,因为在 db 模块重建之前,不会向用户显示由于不正确的身份验证而导致的任何错误设置。完成此步骤后,mta.yaml 文件中的设置将被更新。
图 2-18
自定义服务属性
打开 mta yaml 文件,查看添加的新部分。注意,新的 CUPS 服务出现在参考资料部分。如果提供的凭证不正确,在构建 db 模块后,控制台中将显示一条 CUPS 服务的错误消息。在 db 模块中删除新添加的资源(CUPS 服务)和新需要的服务。解决此问题后,返回并添加新的 SAP HANA 服务连接,直到获得成功的 CUPS 连接。当不再显示错误消息时,确定连接成功。此步骤可能需要多次尝试才能成功。以下是一些有助于成功创建 SAP HANA 服务连接的提示:
-
在添加 CUPS 之前,确保 db 模块总是构建成功——这将节省大量调试时间。不要试图一次调试许多问题;分而治之!
-
当添加 CUPS 服务时(从 db 模块>新建> SAP HANA 服务连接),立即打开 mta yaml 文件查看其结构。请注意 Resources 部分和创建的新项目(类型为 org . cloud foundry . existing-service)。
-
知道了 db 模块将需要新创建的资源作为必需模块——这是 db 模块能够正确连接到经典模式的唯一方式——小心地确保必需部分使用定义的 CUPS 资源的名称。
-
对过程有耐心会使开发更成功。
所有先前的步骤将产生图 2-19 。
图 2-19
包含数据库模块和定制服务详细信息的 mta 文件
使用同义词的跨模式访问
同义词允许对象用不同的名字来称呼某物。在 SAP HANA XSA 中,系统利用这些同义词来读取 HANA 经典模式(非 HDI 容器)。需要创建 HANA 同义词(hdbsynonym 文件),以便使用来自系统模式的虚拟表。如果同义词的使用者从源数据获得了访问权限,那么同义词就可以工作。同义词本身似乎是不必要的;然而,它们的重要性将在下文中展示。
添加 CUPS 服务并再次重建 db 模块后,需要为这个 CUPS 服务分配(授予)模式特权。通过模式所有者授予访问权,该帐户授予通过名为 hdbgrants 的对象查询模式 WAVEPRESS 的权限,如图 2-20 所示。
图 2-20
hdbgrants
hdbgrants 文件是一个 JSON 格式的文件。它通过来自 mta.yaml 文件的名称“ServiceName_1”指定了一个 object_owner 。它进一步表示作为 SAP HANA 服务连接创建的 WAVEPRESS_SVC CUPS 服务。除了将服务名绑定到 CUPS,对象所有者还分配模式特权(选择、选择元数据、创建、更新、删除)。
hdbgrants 文件中的以下部分确认了将接收引用数据库模式的 schema_privileges 的 application_user ,以及被授权者将能够在开发期间应用的特权。
在添加这个 hdbgrants 文件并保存它之后,在继续之前,需要正确地重新构建 db 模块,而不引入任何语法错误。
选择 db 模块。右键单击并选择构建。如果构建成功,则继续;否则,请返回并调整 CUPS 服务、mta 文件或 hdbgrants 文件。由于各种集成点和敏感的语法,这可能需要几次迭代才能正确完成。
仔细阅读 SAP Web IDE 控制台,了解错误消息的详细信息。遇到的一些错误可能是由于 CUPS 创建过程中的不正确凭证造成的。如果遇到错误,重复前面提供的步骤。如果 CUPS 服务被重命名,并且不知道旧服务是否仍然存在(从 SAP Web IDE 中看不到),则导航到 XSA 驾驶舱以查看当前系统中存在的服务实例。
如果在重新创建这些 cup 时更改了服务名称,孤立服务将存在于驾驶舱中。如果出现这种情况,请转到驾驶舱,导航到服务实例,并在清理这些服务时执行尽职调查。
下一步是创建一个同义词,从名为 WAVEPRESS 的跨模式表中选择数据。设备如图 2-21 所示。
图 2-21
hdbsynonym 文件
重复上一步,为虚拟表创建一个同义词,将其添加到同一个 hdbsynonym 文件中(以及以后可能需要的其他文件中),如图 2-22 所示。每当对 db 工件进行修改,并且开发准备好被验证时,构建 db 模块以确保这些工件被正确地更新。如果同义词创建正确,切换到 SQL 控制台并测试新创建的同义词。
图 2-22
同一同义词文件中的多个表
至此,已经创建了一个 CUPS 服务、一个授权文件和一个同义词。现在可以创建计算视图来显示数据库表数据了。
返回到 db 模块,创建一个名为 models 的新文件夹。在该文件夹中,将创建一个新的信息模型。右键单击文件夹,选择新建,然后选择计算视图,在提示时提供一个有意义的名称如下图 2-23 。
图 2-23
创建计算器视图
由于需要公开 DEVICES 表,因此模型名称将为 CV_DEVICES。默认情况下,该视图将被创建为多维数据集视图(在语义层之前需要一个聚合 Node)。保持原样,按照图 2-24 继续。
图 2-24
计算视图初始属性
当执行数据库建模时,模型的开发人员和消费者不需要知道或者不应该关心数据来自哪里,只要他们可以查询表或视图。稍后,在创建视图后,将从图形编辑器中包含其他 Node。
从屏幕的中间部分添加一个投影 Node(计算视图 Node 类型)。添加投影后,Node 上会出现一些图标,选择+(加号)以找到所需的数据源–wave press。设备表。瞧啊。选择桌子并将其添加到投影中,如图 2-25 所示。
图 2-25
将数据源添加到计算视图中的投影
随着越来越多的 Node 被添加到图形视图中,模型最终将需要被重新排列,以获得更好的可见性。在计算视图的名称下,会显示一些图标来帮助进行布局、调试和性能分析。选择自动布局图标,使数据模型在视觉上更具吸引力。它现在看起来应该如图 2-26 所示。
图 2-26
自动布局功能
在 Projection_1 Node 中添加数据源后,向上映射列。将数据源框中的列拖动到输出列中,或者如果需要投影所有的列,在映射部分中选择添加到输出图标,如图 2-27 所示。
图 2-27
绘制投影中的列
如果在数据模型构建期间,随着建模向上进行,需要相同的列向上移动,则重复相同的 Add To Output 。映射出的列将显示为从源到目标的一条线。如果需要计算列,也可以通过转至“计算列”选项卡并根据需要添加它们,如图 2-28 所示。
图 2-28
列映射
在视图创建过程中,多维数据集视图是从初始创建向导中设置的默认行为。现在可以将数据类别更改为维度视图(非聚合)。通过选择语义层之前的聚合 Node 并单击它(图 2-29 ),选择切换到投影,因此不需要向输出添加度量。其他功能,如数据预览,也显示在上下文菜单中。这些功能逐个 Node 地出现。数据预览功能在数据模型调试期间非常有用——在第三章中描述。
图 2-29
聚合 Node 中的列映射
随着开发从底层 Projection_1 Node 向上移动到语义层,将会看到要输出的列和标签(在表创建期间添加的注释)以及它们的预期数据类型(度量与属性),如图 2-30 所示。
图 2-30
语义层,用于设置数据聚合和列类型
计算视图中另一个有用的功能是重命名 Node 的能力。在开发过程中使用有意义的名称有助于理解每个 Node 中做了什么。底部 Node 从 Projection_1 重命名为 p_devices,因为它表示设备表的投影。需要注意的是,在语义层视图属性中,数据类别属性被设置为维度(来自默认的多维数据集视图设置),如图 2-31 所示。
图 2-31
语义层视图属性
当对视图的更改令人满意时,再次右键单击 db 模块并构建它。如果 db 模块构建成功,那么确保它可以从视图中读取数据。
右键单击视图,并选择数据预览–这是生成计算视图数据的示例视图的简单方法,无需在 SQL 控制台中键入“select * from view”的整个查询,如图 2-32 所示。
图 2-32
运行视图的数据预览
选择“原始数据”选项卡,如图 2-33 所示。
图 2-33
显示原始数据窗口
创建数据模型后,在 db 模块中创建一个存储过程。将展示模拟创建、更新和删除操作的场景——首先从 SQL 控制台,然后从 api 模块。创建一个名为 procs 的文件夹来保存存储过程。在该文件夹中,创建一个存储过程,并将其命名为 SP_DEVICE_UPSERT,如图 2-34 所示。该过程的目的是在记录不存在时创建一个新记录;否则,应该根据主键更新记录。
图 2-34
显示创建的新存储过程
该存储过程被编码为以表类型结构的形式接受输入参数,输出将是最后插入或更新的记录的 ID(称为 identity)。为了便于说明,这里显示的代码非常简单,它不处理不存在的 id 或任何错误消息。假设死刑会通过快乐之路来执行。确保存储过程不包含读取 SQL 数据,以便它可以对数据库表执行创建或更新操作——在图 2-35 的第 7 行注释掉。
图 2-35
存储过程示例代码
由于将使用更多的特权(插入、创建、删除),因此需要更新 hdbgrants 文件以包含额外的特权,从而避免在 db 模块的开发和构建过程中出现错误,如图 2-36 所示。
图 2-36
显示模式特权的 hdbgrants 文件
更新了这些工件之后,现在重新构建 db 模块。如果构建成功,系统将在后台更新 hdbgrants 配置,并且将在 HDI 容器中创建存储过程。
从数据库浏览器窗口验证这个假设,查看 HDI 容器连接下的存储过程,如图 2-37 所示的过程部分。
图 2-37
数据库资源管理器中显示的存储过程
创建存储过程后,从 SQL 控制台对其进行验证。为了对该数据库对象进行单元测试,需要完成以下工作:
图 2-38
在临时表中创建一些数据
-
创建一个本地临时表,其结构与表类型的输入参数类似。
-
从 SQL 控制台向该临时表中添加至少一条记录,如图 2-38 所示。
图 2-39
显示本地临时表中的数据
- 验证新添加的记录(图 2-39 )。
图 2-40
调用存储过程
- 执行如图 2-40 所示的调用语句。
图 2-41
验证通过存储过程运行的数据
- 验证表格以确保表格中最近创建的记录确实是返回的记录,如图 2-41 所示。
为了通过存储过程运行更新,执行下一组步骤(图 2-42 ):
图 2-42
用现有记录填充临时表以模拟更新
-
从本地临时表中删除现有记录。
-
将表中的现有记录添加到临时表中。
-
在本练习中,它显示为记录 ID = 20,将其 TEMP_F 值更改为 26。
-
该存储过程还会将 REC_DT 更新为当前日期。
-
再次运行 call 语句,验证存储过程是否更新了所需的记录(图 2-43 )。
第一个输出(显示为 Result1 选项卡)来自运行 call 语句,OUT_ID 列被映射到占位符?来自调用语句。
图 2-43
存储过程的输出返回被更新的记录的 ID
第二个输出窗口(如图 2-44 中的 Result2 选项卡所示)显示运行的 select 语句。它使更新的记录生效,并且也以降序显示在控制台上,如图 2-44 所示。验证 TEMP_F 值已正确更新,并且 REC_DT 首先显示最新更新。
图 2-44
更新后验证表
这个相同的存储过程将在 Node JS 模块中使用,并在本练习的后面章节中演示。
最后一个场景描述了如何删除记录。运行删除语句的程序代码如图 2-45 所示。确保代码不包含读取 SQL 数据的行,这样它就可以对数据库表执行删除操作。
图 2-45
显示删除操作的存储过程
一旦 db 模块成功重建,新的存储过程将出现在数据库浏览器的过程部分,如图 2-46 所示。
图 2-46
删除数据库资源管理器中显示的记录的存储过程
在执行 SP_DEVICE_DELETE 语句之前,运行一条 select 语句来显示表中的当前记录,如图 2-47 。
图 2-47
表数据,然后运行存储过程来删除记录
接下来,从 SQL 控制台执行存储过程以对其进行单元测试,运行 call 存储过程语句并从可用记录中传递一个 id(本练习假设有效 ID 总是传递给存储过程),如图 2-48 所示。
图 2-48
运行存储过程删除记录后的输出
如图 2-49 所示,重新运行 select 语句以验证记录已被成功删除。
图 2-49
删除记录后验证表中的数据
暂时保持存储过程不变。当从 api 模块调用时,将在后面的章节中使用它。
结论
在本章结束时,您应该对 CF 安全层及其在 HANA XSA 中的实施有所了解。OAuth 协议在 XSA 微服务的开发中扮演着重要的守卫角色,因为 XSA 环境遵循相同的请求和验证令牌的架构和方法。引入了一些工件,比如同义词、用户提供的服务和授权,这些都有助于跨模式环境中的数据访问。
三、SAP XSA 的开发工具
本章将深入理解使用 SAP HANA XSA 内部的 NodeJS 进行 REST API 开发的相关工具。本章将讨论的工具包括 SAP Web IDE、数据库浏览器、XSA 驾驶舱和 GitHub。
SAP Web IDE 和连接到 GIT
首先,这些工具允许开发者开发企业软件应用。此外,它们允许调试代码。开发和调试齐头并进。一些开发人员消极地考虑调试;相反,它应该被视为任何开发场景中的基本步骤。世界上没有一个开发人员可以不经过调试就进行开发,即使是在某人的初始程序“hello world”期间。正如所有编程开发人员工具所必需的一样,下面的解释将帮助开发人员理解编程语言的执行,下一行如何运行,它如何在控制台和浏览器上显示,或者只是编程语言如何完成任务。
SAP HANA XSA 的开发也不例外。在最初几章中,我们展示了如何使用 XS 命令行界面,这对于 SAP HANA XSA 的开发至关重要。无论您的角色是管理员、解决方案架构师、开发人员还是质量保证工程师,在某些时候,了解软件开发周期中涉及的工具都是很重要的。在第二章中,展示了一些来自 SAP Web IDE 的截图,现在,本书将在这一部分展开。
首先了解什么是 SAP Web IDE 是很重要的。它是 SAP 通过 web 浏览器开发和提供的工具,作为他们的集成开发环境。SAP 将 SAP Web IDE 描述为“一个强大的、可扩展的、基于 Web 的工具,它简化了端到端费奥里应用的开发和整个堆栈应用生命周期。”默认情况下,可以从以下 URL 访问 SAP HANA Web IDE,http(s)😕/host:53075(默认端口),如果以这种方式安装,也可以从不同的端口访问。如果不知道确切位置,请咨询您公司的系统管理员。
SAP Web IDE 有多个版本;然而,它们的界面看起来很相似。熟悉不同版本的 SAP Web IDE 及其许可条款,以确保在开始任何开发之前使用合适的版本和许可证。以下是 SAP Web IDE 的不同版本:
图 3-1
SAP Web IDE
-
SAP 云平台上的 SAP Web IDE(图 3-1
-
面向 SAP HANA 的 SAP Web IDE(内部部署和 HANA Express 版)
-
个人 SAP 网络集成开发环境
每个环境有什么不同?
SAP 云平台 Web IDE 提供了创建费奥里应用和扩展以及连接到 ABAP 后端存储库的模板,它还可以连接到 git 存储库。在 SAP Cloud Web IDE 上创建应用时,有三种环境类型可供选择。
前两种类型的环境, ABAP 和尼奥,具有相同类型的费奥里(SAPUI5)模板、主细节、列表报告、工作列表和 SAPUI5 应用。这两个环境非常简单,可以用提供的模板开始创建用户界面(UI)。注意,当基于这些模板之一创建项目时,需要选择 SAPUI5 版本。SAPUI5 是现代 HTML5 和 CSS3 控件的 SAP 库,使用 JavaScript 创建费奥里应用。如果决定创建 SAPUI5 应用,请在 SAPUI5 SDK(软件开发工具包)网站上查看当前支持的版本。
这两个环境之间的其他差异包括 NEO 环境(图 3-3 )是一个 SAP 专有环境,在其中,开发人员可以创建复杂的 Java、XS JavaScript (XSJS)和 HTML5 应用。这是在 SAP 云中开发的最简单的环境类型。NEO 环境不支持 Node JS 开发。
图 3-2 中的 ABAP 环境,顾名思义,就是从 SAP 云平台创建和扩展 ABAP 应用。这种环境需要在使用前调查许可成本。
图 3-3
使用 Neo 环境选择 SAP Web IDE 模板
图 3-2
使用 ABAP 环境的 SAP 云平台的 SAP Web IDE
第三种环境被称为云铸造 (CF)环境,如图 3-4 所示。由于 CF 的性质和功能——参见第一章了解关于 CF 的信息——在 CF 环境下工作时,还有许多其他类型的模板。
图 3-4
使用 Cloud Foundry 环境选择 SAP Web IDE 模板
除了创建费奥里应用,还有用于物联网(IoT)应用的模板、用于创建 OData 服务和云平台业务应用(CBA)的模板。一旦选择了环境和项目类型,就会出现如图 3-5 所示的 SAP 云平台 Web IDE。它非常类似于第二章中所示的本地 SAP Web IDE 版本。
图 3-5
显示工作区的 SAP Web IDE
屏幕顶部的菜单项包括
-
文件–创建新文件或导入文件/项目
-
编辑–撤销/重做一个动作并添加注释(行或块)
-
构建–构建模块(上一章显示,下一章显示)
-
运行——运行一个应用或将其作为一个单元测试来运行
-
部署–部署到 ABAP 存储库或 SAP 云,或者注册费奥里启动平台
-
搜索–对文件进行搜索,例如右侧导航图标(放大镜)上的高级搜索
-
视图–允许开发人员查看不同的窗格(git、history、debug)或位于屏幕右下角的控制台、错误和警告窗口
-
工具–允许从工作区切换到数据库浏览器、SAP 云驾驶舱、故事板、首选项或 SAP 云平台的其他功能
-
Help–提供文档、SDK、快捷方式、提示和技巧、关于部分和反馈的链接
-
法律–提供有关使用条款和隐私声明的信息
请注意左侧导航栏上的图标:
-
工作区–是开发过程中使用的工作区,由 xml 标签图标表示。
-
数据库浏览器–连接到数据库或 HDI 容器。
-
story board–SAP Web IDE 的本地版本中不存在此功能。此功能用于创建应用的可视化表示,并设置应用和导航中使用的服务端点,而无需编写任何代码。
-
首选项–此功能用于设置 Web IDE 设置,如代码编辑器规则、数据预览、git 设置、SQL 控制台设置和工作区设置
右侧导航栏上的图标是
-
放大镜–高级存储库搜索,用于查找文件夹、项目或工作区内的文件内容。
-
Git pane–用于连接外部代码库并与之交互(对代码库执行操作,如拉、推、提交、重置)。
-
Git history–查看外部代码库的最新变化。
-
Outline–显示应用视图中控件的层次结构。
-
调试器–这是在开发和调试时设置调试会话。
-
测试结果–显示单元测试结果。
在屏幕的右下角,还有几个图标,显示日志、错误和警告的控制台输出。在开发、构建应用和服务以及对其构建和部署进行故障排除时,这些控制台输出非常有用。它显示系统记录的任何信息。
用于 SAP HANA 的 SAP Web IDE(内部部署和 SAP HANA Express Edition,HXE)看起来非常接近之前显示的精确副本,也显示在图 3-6 中。如前所述,这个版本中没有故事板;但是,数据库浏览器是。到目前为止,两个版本都有非常相似的特性。这些工具的一个主要区别是许可条款。在右下角查询这些工具的许可类型。
图 3-6
SAP Web IDE 内部部署(HANA Express 版)
SAP Web IDE 个人版
同样,SAP HANA Web IDE 个人版的大多数功能(图 3-7 )与此版本的 Web IDE 具有相同的功能。其中一个主要区别是没有数据库浏览器,因为个人 Web IDE 主要用于开发 SAP 费奥里应用和 SAP 费奥里扩展。在图 3-7 中,SAP Web IDE 的个人版可以连接到 ABAP 的后端存储库(通过目标文件)。一旦连接上,它就可以通过命令克隆、拉取、暂存、提交和推送代码到 Git 外部存储库。
图 3-7
SAP Web IDE 个人版
一旦进入个人 Web IDE 的工作区部分(图 3-8 ,开发人员又回到了熟悉的领域。上面显示的大多数功能之前已经解释过了。它们的工作方式与所描述的类似。虽然个人 SAP Web IDE 安装在某人的笔记本电脑上,并显示在浏览器地址栏上,但个人 Web IDE 托管在本地主机上;这意味着它是作为可执行文件下载的,并被配置为在本地开发机器上运行。同样,如果决定使用个人 Web IDE 进行任何费奥里开发,请务必阅读许可条款。
图 3-8
SAP Web IDE 个人版工作区
在介绍了 SAP Web IDE(及其不同版本)之后,继续看如何将其连接到外部代码库 GitHub。在第一章中,简要展示了如何从可视化代码 IDE 中设置外部代码库。书中剩余的开发和练习将在 SAP Web IDE 中完成。
在使用数据库模块开始练习之后,继续将 wavepress 项目连接到 GitHub 存储库,以便可以克隆它。
在 SAP HANA Web IDE 中,转到项目名称。右键单击,选择 Git,然后选择初始化本地存储库(图 3-9 )。如图 3-10 所示,在下一步提供与 Git 账户匹配的电子邮件和用户名。
图 3-10
Git 用户信息提示
图 3-9
初始化本地存储库
在这一步之后,本地 GIT 存储库变得可用于开发,或者更好的是,此时可以通过点击图 3-11 所示消息中的 Set Remote 按钮来设置远程存储库。
图 3-11
本地存储库初始化消息
如果选择了设置远程,则指定要连接的远程存储库的 URL。在 GitHub 中,在连接之前创建一个远程存储库。如第一章所示,打开存储库并选择其 URL。该 URL(以 git 结尾)将用于 SAP Web IDE 向导的下一步。此时,如果使用 Git,可能需要选择“为 Gerrit 添加配置”,并在图 3-12 中选择 OK。Gerrit 是一个与 Git 一起工作的代码审查特性。
因为 GitHub 上没有设置 SSO,所以 GitHub 帐户的身份验证是通过 SAP Web IDE 使用凭证完成的(基本身份验证)。
图 3-12
配置远程存储库
如图 3-13 所示,提供认证 GitHub 账户的凭证。
图 3-13
Git 认证提示
如果通过验证,将会收到一条获取初始提交的消息,如图 3-14 所示。
图 3-14
初始 GIT 提取
SAP Web IDE 初始化了主分支,并将开始跟踪未来的变化。由于项目最初是用数据库模块创建的,所以额外的未决变更需要像前面所做和显示的那样进行准备、提交和推送。这个工具的一个很好的特性是它能够跟踪未决的变更。它允许开发人员输入注释,此外,它还有一个从命令行模拟 git 命令的界面。值得注意的是图 3-15 中几件非常重要的事情:
-
工作区上的**显示当前项目被映射到一个外部存储库。
-
映射的分支是主分支。它在项目部分显示方括号,也是从 Git 窗格的下拉列表中选择的。
-
任何挂起的更改都列在 Git 窗格中(右侧导航菜单)。只需点击一下鼠标,就可以分阶段、提交和推送这些变更——不要忘记提供有意义的注释;否则,将不会启用提交和按钮。
图 3-15
从 SAP Web IDE 到远程 GIT 存储库的初始提交
继续初始提交–如果收到错误,则首先执行拉取(在远程存储库的初始映射之后,如图 3-16 所示)。最初需要一个拉力。
图 3-16
来自 SAP Web IDE 控制台的 GIT 消息
成功拉取后,一些提交可能会显示为挂起状态(在库: wavepress 所在行的末尾带有向上箭头的数字显示在图 3-17 中)。初始拉取完成后,继续运行推取命令(注意按钮已被启用)。
图 3-17
SAP Web IDE GIT 窗格主分支
从控制台日志来看,在图 3-18 中,拉和推操作的消息显示为正确完成。
图 3-18
从 SAP Web IDE 控制台拉和推请求消息
返回 GitHub 库,查看并对比推送操作前后的库(如图 3-19 和 3-20 )。
图 3-20
从 SAP Web IDE 推送代码后的 GIT 存储库
图 3-19
GIT 存储库显示了提交 SAP Web IDE 之前的
在工作区(SAP Web IDE)中,注意当代码在 SAP Web IDE 和 Git 存储库之间同步时,**符号也变成了一个不同的标识符,即单点。继续下面一组相关的更改,并向消息框添加额外的提交(遵循提交通常较小的相关更改的最佳实践(图 3-21 ))。
图 3-21
代码文件显示一个代表更改跟踪的图标
数据库浏览器
数据库浏览器是 SAP Web IDE 附带的一个工具,有助于连接到 SAP HANA 系统中的 HDI 容器和经典 SQL 模式。数据库资源管理器允许开发人员从 SQL 控制台运行 SQL 查询。它还允许查看各种对象,如表、列视图、过程、任务、触发器和同义词。当需要在经典环境模式中创建对象(非容器、基于运行时的对象)时,Database Explorer 用于开发、调试、测试和运行命令。可以从数据库浏览器建立一个或多个数据库连接,如图 3-22 所示。
图 3-22
数据库浏览器中显示的多个数据库连接
熟悉数据库浏览器及其特性的第一个也是最简单的方法是从 SAP Web IDE 工作区创建一个数据库模块。第一次访问数据库浏览器时,它将允许创建到 HDI 容器(如第二章所示)或经典 SQL 模式的连接。在项目中创建数据库模块后,开发人员可以查看、查询和修改属于同一容器的数据库对象。在真实世界的场景中(在第二章中描述),将会有模型和过程在 HDI 容器和经典模式中交互。创建混合数据模型和其他数据库工件的需求是正常的开发活动。当使用来自 HDI 和经典模式对象的工件时,CUPS、HDB 授权和同义词的创建是先决条件。如图 3-23 所示,在构建了相应的模块并建立了与数据库容器/模式的连接后,可以从 SQL 控制台查询同义词和经典对象。下面是一些使用设备和虚拟(图 3-24 同义词的查询。
图 3-24
虚拟表的同义词
图 3-23
使用同义词显示查询的 SQL 控制台
在分析数据库开发时,可以利用 Database Explorer 中的一些非常重要的特性,如解释计划和 SQL 分析器。
解释计划通过将运行 SQL 语句的过程分解为涉及的数据库对象、涉及的操作符、连接细节和执行操作的时间来提供帮助(图 3-25)。4
图 3-25
解释计划
SQL 分析器提供了一种不同类型的分析。
在概览页签中(图 3-26 ),“编译对执行”的时间显示在第一部分。在排除性能故障时,本节有助于排除数据库对象的故障。
Overview 选项卡中的另一部分是 SQL 性能建议。目前还没有。当分析更复杂的语句时,可以填充此部分。
该选项卡中的第三部分是主要的操作符部分,在这里可以看到数据库模型中不同 Node 和执行的性能指标。
最后,Statistics 部分包含来自系统的信息、执行的视图、输出的记录数以及 SQL 语句执行期间分配的内存。
图 3-26
概观
在概览部分的底部,有一个不同的表格网格表示。
操作符选项卡,图 3-27 ,显示了预测中使用的表格和其他指标,如执行和 CPU 时间等。
图 3-27
经营者
下一个选项卡是时间轴(图 3-28 )。在这个选项卡中,时间线以毫秒为间隔递增地显示从底部投影到语义层发生的事情。在分析这些片段时,会出现不同类型的执行视觉效果,因为它们可能更大或更小,这取决于完成的总时间。
图 3-28
时间表
使用中的表格在图 3-29 中不言自明;简单信息模型显示了一个表的投影。
图 3-29
正在使用的表格
在表格访问页签中,只有一个表格,如图 3-30 所示。然而,这些步骤和过程被显示为好像它们是在上下文中的查询执行期间发生的。
图 3-30
表访问
在编制概要中,展开各节查找详细信息,如图 3-31 。
图 3-31
汇编摘要
编制概要在图 3-32 中展开。
图 3-32
汇编摘要-时间分解
建议见总览页签和图 3-33 。没有适用于此数据库模型的。
图 3-33
推荐
概览页签旁边是图 3-34 中的平面图页签。大多数拥有 SAP HANA 1 经验的开发人员将很快熟悉这一部分,因为它几乎是 SAP HANA Studio 中查询计划执行的精确副本。它现在出现在 SAP Web IDE 的数据库浏览器中。计划图将在图形表示中从上到下显示信息模型中正在执行的各种 Node。图中的 Node 包含非常有用的信息,比如从一个 Node 返回到下一个 Node 的记录数。从底部 Node 向上执行时,还会出现时间和增量时间。该表示中显示的其他指标包括独占时间、当前操作符执行时间和完成查询的时间。
图 3-34
平面图
最后, SQL 页签显示执行的 SQL 语句,如图 3-35 所示。
图 3-35
SQL 语句
SAP SAP XS 高级驾驶舱
如图 3-36 所示, SAP HANA XS 高级驾驶舱是一个主要用于 SAP HANA XS 高级开发团队领导和 XSA 系统管理员的工具。该工具允许开发人员/管理员浏览 XSA 组织并查看空间、用户、角色、应用和服务实例。SAP SAP XS 高级驾驶舱着陆屏幕如图 3-36 。
图 3-36
SAP SAP XS 高级驾驶舱
该工具可通过 SAP Web IDE 以两种方式之一访问:导航至工具、SAP HANA XS 高级驾驶舱,如图 3-37 所示。
图 3-37
从 SAP Web IDE 访问驾驶舱
或者从 XSA 控制器 URL,YOUR_HOST:39030(默认端口),如图 3-38 。请注意,SAP 提供的其他 XSA 应用也可以通过这些链接访问。
图 3-38
SAP XSA 控制器
如云铸造部分所述,了解 CF 和 XSA 结构层次。空间是组织的一部分。
在 SAP HANA XSA 的默认安装中,默认包括 开发 和 SAP 空间。在图 3-39 中,显示了空间中当前应用的数量。还会显示关于正在使用多少资源和内存的信息。从默认的两个空间中要注意的一件重要事情是,SAP 空间不应该被编辑。这是因为其中运行的 SAP 应用包括 SAP Web IDE、XSA 驾驶舱和数据库浏览器,以及所有其他 34 个显示为已启动状态的应用/微服务。
图 3-39
XSA 组织
如第一章所述,在每个空间内部,有 应用 和 服务 。为了验证这一点,点击开发空间并进入该区域,如图 3-40 所示。此时,只创建了一个用 di-builder 构建的数据库模块。因此,它应该只显示开发空间中的一个应用。由于应用状态显示绿色的启动状态,这意味着它运行正常;如果状态显示为“已停止”,这意味着从应用日志中可以看到一些问题。
图 3-40
XSA 空间
图 3-40 非常重要,因为显示了空间内的其他细节:
-
钉住主机(图 3-45 )
Currently, no Space is pinned to a host.
图 3-45
驾驶舱固定主机
-
成员(图 3-44 )
This section shows users mapped to the current Space. In the default setting of the development Space, the initial two users and their status within the Space are shown. Use these accounts as templates for other users that need to be created.
图 3-44
XSA 空间成员(用户)
-
路线(图 3-43 )
Currently, there is only one route related to the di-builder application. Later, when creating the REST API, additional routes will be shown in the Routes section.
图 3-43
XSA 路
-
监控
它显示了应用监视设置,例如应用消耗的内存量、CUPS 服务、用户模式时间、mta yaml 文件以及运行它的主机。
-
服务
-
服务市场
这些是由框架提供的现成服务,例如 XS UAA 服务、作业调度程序、托管 HANA db 服务或 SAPUI5 服务等。
-
服务实例(图 3-41
This one is very important because services can be created in different ways, and those service instances will be displayed here. In previous development steps, service instances were created (the UAA service instance) from the db module assigning access to a cross-schema service. During the earlier exercise, WAVEPRESS_SVC was used; however, some attempts yielded incorrect authentication, and consequently, those service instances are still showing here. The cleanup of these instances needs to be done with proper care so that the correct instances are removed and those being used remain untouched.
图 3-41
XSA 海关服务
-
用户提供的服务(UPS)(图 3-42
The custom user-provided services are used when the platform marketplace does not offer such services. In the current example, a UPS service for cross-schema access was created. Opening the details of the UPS, its content can be seen. Be extremely careful when granting access to the cockpit application since users with this access will be able to see the raw connection details (including credentials for the schema) for this UPS service instance. Only authorized users to sensitive system credentials should have access to the XSA cockpit.
图 3-42
自定义服务连接详细信息
分析图 3-46 所示的 XSA 驾驶舱内的不同特征。第一节是安全。此部分允许我们查看和管理现有的角色集合(角色组)。XSA 环境的默认配置包括 XSA 开发者和 XSA 管理员的一些角色集合,如图 3-46 所示。
图 3-46
XSA 角色集合
信任配置(图 3-47 和 3-48 )部分允许管理员在 XSA 环境和外部系统之间建立信任连接。在此配置单点登录等设置。任何需要信任的东西都可以通过下面显示的新信任配置按钮来设置。
图 3-48
设置新的信任配置
图 3-47
XSA 信托配置
信任证书允许用户设置信任证书,以使用指定的证书(特定域证书或由全球权威 CA 签署的证书)连接到其他系统,如图 3-49 所示。或者,可以使用 XS CLI 通过使用 xs set-certificate 命令来设置证书。
图 3-49
设置新的信任证书
在 XS 高级驾驶舱的安全下,租户数据库项如图 3-50 所示。
图 3-50
XSA 驾驶舱租户数据库
主机管理部分显示 XSA 环境中的一台或多台主机,如图 3-51 所示。
图 3-51
XSA 驾驶舱主机管理
在用户管理部分,可以从默认安装中找到默认用户和角色集合。按照这些角色集合的模式为 XSA 环境创建其他角色。这两个默认用户也是在安装 XSA 环境时创建的,如图 3-52 所示。
图 3-52
XSA 用户管理
点击新用户按钮并提供以下详细信息,可创建更多用户。当试图在 XSA 环境中创建用户时,最简单和最好的方法如图 3-53 所示。
图 3-53
创建新用户
从 XSA 驾驶舱创建 XSA 用户的替代方法是迁移 SAP HANA 用户,如图 3-54 所示。SAP HANA 用户的迁移必须仔细规划和执行,因为这些用户的某些属性可能不会始终正确迁移。如果组织决定采用这种方法,请仔细验证新的 HANA XSA 环境中的用户创建和用户访问。
图 3-54
XSA 迁移 SAP HANA 用户
强调 SAP HANA XSA 驾驶舱登录页面的两个链接非常重要:
-
有用链接–这将重定向到与本节和开发人员教程相关的文档。为了理解这个工具,浏览这个链接并花些时间是值得的。
-
法律信息–这与许可条款有关。
邮递员休息客户端
POSTMAN REST 客户端是一个工具,它为开发人员提供了 REST API 请求场景的模拟,而无需构建成熟的应用或 API。POSTMAN REST 客户端工具是一个免费工具,可以从任何浏览器下载。还有其他类似的工具可以允许执行类似的任务(例如,发出 REST API 请求)。但是,他们可能有额外的许可和定价要求。出于演示的目的,POSTMAN REST 客户端将被用作演示该 API 的开发和单元测试的首选工具。
在大多数软件系统和编程语言中都有控制台、浏览器,或者在 ide 中,开发人员可以执行单元测试并验证他们的开发。在某些软件场景中,需要或建议使用额外的硬件或软件。开发 REST APIs 时,开发人员需要测试 GET、POST、PUT 和 DELETE 等 HTTP 方法。这些 HTTP 方法中的每一种都需要不同级别的测试。最容易测试的 HTTP 方法是 GET 方法。它的请求只从系统中读取数据。开发人员可以在拥有互联网连接(如果访问网络外的服务)的情况下,通过浏览器 URL 轻松完成 GET 请求。其他 HTTP 方法的测试要稍微复杂一些,因为任何改变系统状态的操作(PUT、POST、DELETE)都需要在与后端系统(OAuth 令牌)交互之前由 API 的消费者提供额外的安全级别。
在第一章第 1.2 节中,提到在请求访问资源时有一些安全考虑。此外,软件系统使用的某些协议和行业标准被强制执行以保护这种软件系统的完整性和数据的敏感性。此外,在第一章第 1.2 节中,提到了一个名为 UAA 的托管服务。还解释了它如何使用 OAuth 2.0 来接受请求、分析请求的各个部分、验证请求并返回访问令牌或者拒绝对后端资源的访问。
POSTMAN REST 客户端工具的附加特性允许创建工作区来分离单元测试、手动测试和自动化测试。它允许使用 POSTMAN API 命令集成到持续集成和交付管道中。请访问 POSTMAN 网站了解更多规则和定价详情。
开始 POSTMAN REST 客户端测试需要做什么?
首先,从浏览器下载该工具并接受许可条款,因为它适用于将使用它进行开发和验证的组织/团队所支持的版本。然后,将测试分解成如何在这个工具和他们的开发中使用。根据逻辑工作单元看起来如何合适来分离 API 调用,例如,按环境、按端点、按 API(如果您有多个 API)。
首先测试一些免费的在线 API 端点来展示工具的这一部分。当进入练习 API 时,第四章将展示将要构建的实际项目中的 POSTMAN 请求。
打开工具,点击新建。
提供请求的详细信息,并选择(或创建)一个集合来保存请求。集合类似于邮递员组织请求的文件夹。这里显示的集合称为测试 API,包含一个称为测试 API 的请求(图 3-55 )。在请求中,添加一些细节,比如 Method= GET ,URL = {一个在线找到的免费 URL },如果不需要设置其他请求参数,比如请求头或身份验证,就发送请求。
图 3-55
邮递员
点按“发送”后,查看几个重要的详细信息:
-
Figure 3-56 shows the response (bottom half of the screen) containing the Status (200), the Time it took to receive a response (39ms), the Size of the payload (689B), the response in JSON format, a cookie, and some Response Headers. This is a very basic request, but it shows most of the details of the request and the response from the POSTMAN tool toward an external service.
图 3-56
邮差请求示例
要查看来自另一个工具的相同请求以验证 POSTMAN 请求,请将相同的 URL 复制到浏览器窗口中并发送它。如果将这个例子用于实践,由于身份验证(在 Authorization 选项卡内)和一些请求头(headers 选项卡)的原因,需要传递额外的参数来发送和接收 JSON 格式的数据。请求的输出可以在图 3-57 中看到。
图 3-57
浏览器上的免费 REST API 和网络选项卡
虽然同一个请求可以通过两个不同的工具进行验证,但是在实际的项目开发中只会显示 POSTMAN REST 客户端工具。需要注意的是,不能从浏览器模拟 POST、PUT 和 DELETE 只能从浏览器地址栏验证 GET 请求。
结论
在本章结束时,您应该能够理解 SAP Web IDE 的不同变体,它是在 SAP HANA XSA 环境中开发微服务的主要工具。还有其他工具用来保持我们的软件同步,并存储在外部代码库中。随着开发团队的成长,需要这些代码库工具能够并行地进行代码修复和新特性开发。数据库资源管理器突出显示了附加的故障排除功能,以解决数据库模型和存储过程的性能问题。
四、SAP HANA XSA Node 开发
这大概是大家都在等待的篇章。在本章中,本书将解释适用于 SAP HANA XSA 的 Node JS 开发。这里详细讨论了各种端点和 HTTP 方法,以处理来自正在构建的微服务练习的请求和响应。系好安全带,我们出发吧。
REST APIs 的开发
在第一章,介绍了 REST APIs 的定义。成功开发的最重要因素之一是理解 REST APIs 的区别以及何时以及如何使用它们。创建 REST APIs 是为了通过 HTTP(s)方法公开和接收数据(表 4-1 )。使用 REST APIs 的另一个好处是允许这些 API 的消费者访问来自企业的数据,而无需直接访问数据库。REST API 的使用者必须知道使用 API 的 URL、所需的身份验证、提供给 API 的预期数据结构、从 API 返回的任何响应结构以及可能的错误消息。
表 4-1
HTTP 方法
|HTTP 方法
|
何时使用它
|
| --- | --- |
| 得到 | 读出数据 |
| 发布/上传 | 插入/更新数据 |
| 删除 | 是的,你猜对了 |
| 选择 | 预检选项–服务器将响应是否接受发送带有这些参数的请求 |
大多数 REST 实现都是从使用 GET 方法开始的(之前在 POSTMAN 一节中也有描述和展示)。在本节中,首先在 HANA XSA 应用中创建 Node JS 模块。打开 SAP Web IDE。请注意 mta.yaml 文件,因为随着附加模块的创建或模块依赖关系的更新,该文件可能需要手动干预。到目前为止,数据库开发只有一个模块( db 模块)。然而,由于开始使用后端模块,所以理解模块依赖性以及为什么和在哪里进行下一组更新是很重要的。
在 SAP Web IDE 中,右键单击项目,选择新建,然后选择 Node.js 模块,如图 4-1 所示。
图 4-1
创建 Node.js 模块
做出选择后,按照向导步骤进行操作。调用 Node JS 模块 api ,因为它将代表 REST API(图 4-2 )。
图 4-2
模块名
继续提供模块设置(如版本 1.0.0 ),因为这是初始步骤,并启用 XSJS 支持,因为它在上一小节中已提到并显示在图 4-3 中。
图 4-3
Node.js 模块设置
点击下一步确认或者直接点击完成,如图 4-4 所示。
图 4-4
模块创建的确认
向导完成这一步后,可以在 Web IDE 中看到创建并添加到项目中的 api 模块。此外,打开 mta.yaml 文件将在 wavepress 应用中显示该模块的新条目,如图 4-5 所示。
图 4-5
模块创建后的 mta yaml 文件
现在,有一个 Node 模块具有一些默认设置,如 XSJS 兼容模式和一些由 IDE 创建的默认文件。
在大多数涉及 Node JS 的软件开发中,也会找到 package.json 文件。该文件包含关于 Node 依赖关系的信息、模块的元数据、模块开始时要运行的文件,以及在项目开发期间可以设置的任何单元测试文件,如图 4-6 所示。仅当包含或删除了其他依赖项时,才会更新此文件。
图 4-6
Node.js 模块中的 package.json 文件
目前,默认的 Node JS 模块是一个基本文件,可以不加修改地运行;必须构建并运行该模块。建议在进行其他开发之前先构建模块,以确保可以构建当前模块,并且可以从 npm 软件包管理器下载任何依赖项。下载的一些依赖项将是开源的,一些将是@sap 模块。
由于是第一次构建该模块(图 4-7 ,可能需要几秒钟的时间来下载依赖项并在系统中创建 Node 应用。如果 npm 模块下载失败,请分析控制台窗口以查看诸如模块版本不正确或未找到之类的消息,或者查看 npm 站点是否可访问。SAP Web IDE 正在尝试从互联网下载一些模块,这将需要访问外部 URL。
图 4-7
模块构建
在这里收到成功消息意味着模块构建成功。如果收到错误,则必须在继续之前进行分析。此时可能发生的一些错误可能是由于未找到 npm 模块依赖关系版本或未下载 npm 模块。阅读控制台输出错误,以查看可能出现的错误。在对 npm 模块或版本进行更改后,请在继续之前重复重建过程以获得成功的构建。如果 XSA 环境托管在云提供商上,则该环境可能需要额外的权限才能从 npm 或外部包管理器连接和下载内容。如果出现这些问题,请联系环境管理员,以确保可以正确连接到外部资源。
如果构建成功,在 Web IDE 控制台中将出现以下消息,并显示“completed successfully ”,如图 4-8 所示。
图 4-8
模块构建后的控制台输出
通过右键单击 api 模块来运行它,选择 Run,然后选择 Run as Node.js Application。SAP Web IDE 将尝试运行如图 4-9 所示的应用。
图 4-9
运行 Node.js 应用
如果运行,控制台窗口将显示该模块从哪个 URI 位置运行——主机:51026——如图 4-10 所示。
图 4-10
构建和运行 Node.js 模块后的控制台输出
模块开始运行后,控制台窗口将显示一些消息。这个输出是在哪里以及如何产生的?
在 Node 模块中,有一个名为 package.json 的文件。这是在构建和运行 Node JS 应用期间使用的 json 文件。在包文件中,有一个包含 脚本 文件夹的部分,该文件夹还包含一个名为开始的命令。该命令调用 server.js 文件。
如图 4-11 所示,server.js 文件是 REST API 中 Node 模块的入口点。请参见图中第 18、25 和 31 行的控制台日志语句。这些语句在 SAP Web IDE 的控制台窗口中生成输出。
图 4-11
server.js 文件
今后更详细地检查这个文件是很重要的。
最初的第 4 行和第 5 行需要 SAP registry 提供的相关 Node 模块。
从第 8 行开始的 options 对象表示将不使用身份验证(anonymous: true),最终它将被重定向到/index.xsjs 文件。在开发的这个阶段,可以看到兼容模式在起作用。
在第 15–19 行配置 SAP HANA 和第 22–26 行配置 UAA 服务时,会分配一些其他选项。请记住,目前还没有配置 UAA 服务实例,因此在启动 api 模块时,对于映射到 API 模块的 URL,不会出现身份验证提示。
在第 29 行,控制台输出显示了运行模块时最初收到的内容。
如上所述,控制台上列出的主机和端口是运行 Node 应用的端口。单击它将启动作为 API 模块运行的后端 REST API,从第 11 行可以看到重定向到 XSJS 兼容模式。index.xsjs 文件的输出如图 4-12 所示。
图 4-12
浏览器的 Hello World 输出
生成该输出的 XSJS 代码如图 4-13 所示。
图 4-13
XSJS 代码
由于这个 Node 模块正在开发中,所以从后端系统(或管理视图)来查看这个应用可能会有所帮助。例如,这对于分析如何分配或消耗内存非常有用。
使用具有适当凭证的帐户,访问该视图,并通过转到 SAP Web IDE 工具菜单并选择 SAP HANA XS 高级驾驶舱选项来打开 SAP HANA XS 高级驾驶舱。图 4-14 显示了驾驶舱的着陆页面。记住 CF/XS 高级架构层次结构,导航至应用。
从 XSA 驾驶舱,从组织开始,导航到空间(图 4-14 )。找到在这个空间下运行的微服务(如图 4-15 和 4-16 中的应用)。
图 4-16
XSA 驾驶舱内的应用
图 4-15
SAP SAP XSA 共享空间
图 4-14
SAP HANA XSA 驾驶舱
如果部署的应用是微服务,如何进行验证?
验证从最初的构建(只有一个数据库模块)开始,现在随着额外的微服务(api 模块)的创建而发生。这是真实的,因为列出了多个过程。此外,每个(微服务)流程可以彼此独立地扩展、部署、启动或停止,如图 4-17 所示。
当深入应用时,可以看到以下内容。注意控制台输出中显示的一个熟悉的端口;它也显示在这个屏幕上(端口 51026)。
随着我们继续构建更多的应用,来自 CF 和 XS 的概念将开始彼此相似。
图 4-17
XSA 驾驶舱中显示的应用设置
暂时离开驾驶舱,返回 SAP Web IDE,继续构建 API。保持 XSJS 代码不变,并继续在 Node JS 端构建。
回想一下,构建 API 允许与 SAP HANA 数据库表进行交互,并通过调用 SQL 脚本查询公开数据。从 REST API 中保存和删除数据将通过调用展示不同集成方法的存储过程来实现。
与 XSJS 的兼容模式
SAP HANA XSA 环境的兼容模式允许从 HANA 1 进行 XSJS 开发并且不准备将其开发迁移到 HANA 2 高级架构的现有客户继续运行和支持应用,就像在 XS 经典架构中所做的那样。SAP HANA 1 中使用的 XS 应用是 SAP HANA 数据库和 XS 应用在同一环境中共存的应用。此外,云铸造原则不适用于这些应用。这种类型的场景将被简要解释,然而,对于本书的上下文,将显示使用 XS 高级架构和 XS 高级支持的 Node JS 语言创建 REST APIs 的重点。
重要的是要提到这两种架构之间的特征差异,如表 4-2 所示,这样,如果需要分析和比较公司 It 基础架构的当前状态和未来状态,就可以做出明智的决策。
表 4-2
XSJS 兼容模式与 XSA
|XSJS 兼容模式
|
XS 高级应用(NodeJS、Java、Python)
|
| --- | --- |
| 单线程应用(和单片) | 可以独立运行的微服务 |
| 它的性能取决于整个系统的进程 | 可以独立扩容(向上和向下) |
| 使用 XSJS 和$。蜜蜂 | 由于 BYOL(自带语言),可以利用来自外部包管理器和其他编程语言的 Node JS、Python 和其他模块 |
| 使用 HANA Studio 或 SAP Web IDE 进行开发 | 可以使用 SAP Web IDE 或其他带有附加插件的外部 IDE |
| 同步编程 | 异步、非阻塞编程 |
| OData V2 | OData V4 |
如何启用 XSJS 兼容模式?很简单。创建 Node JS 模块时,向导会显示一个复选框,创建 Node JS 模块时需要选中该复选框,如图 4-18 所示。
图 4-18
创建 Node JS 模块时启用 XSJS 支持
按照向导步骤完成模块创建,并在 XSA 环境中查找 XSJS 文件以与兼容模式进行交互。兼容模式的起始 XSJS 文件位于 api/lib/index.xsjs,如图 4-19 所示。
图 4-19
兼容模式下使用的 XSJS 文件
Node 依赖性
随着 API 构建的进展,Express 等成熟的 Node JS 框架将用于创建 API 端点。快速框架在第一章第 1.2 节中有所描述。这是首选框架之一,因为它易于使用,具有很好的社区采用度(来自 SAP 内部和外部),文档清晰,并且在 Node JS 开发中很容易创建 REST APIs。
要继续开发,请在 package.json 文件中添加 Express framework 的依赖项。所需的其他依赖项包括 HANA 数据库模块(查询将针对该模块运行)、XS 环境、XS 安全性、任何问题的日志记录,以及 Passport 模块(将在使用 UAA 身份验证和令牌生成时使用)。
包文件现在看起来如图 4-20 所示。
图 4-20
Node.js 模块中的 package.json 文件
在 server.js 文件中,继续进行一些更新以初始化 Express,配置中间件,能够将参数传递到框架中,并向 Node js 服务发出请求。遵循模块化和最佳实践,决定将路由(来自请求)和服务实现分离为单独的模块。这一段代码是 SAP 常用的,也出现在一些 SAP 教程网站上,如图 4-21 所示。
图 4-21
SAP 教程中的示例代码
注意,在 server.js 文件中,Express 模块被初始化。除了 Express 模块,还包括其他 Node 和 SAP 模块。当初始化快速模块时,与 SAP XSA 环境和 HDB 客户端等相关的设置将被初始化。在初始化 Express 之后,它将作为一个参数传递给路由(第 18 行)。路由(处理来自 xs-app.json 文件的路由的进程)将用于处理服务器端的 API 请求,执行过程将从 Express 框架传递到处理任何 JavaScript 逻辑的特定 Node JS 文件或函数,执行该文件或函数是为了处理请求、验证业务逻辑、调用任何数据库工件,并最终向请求者返回响应。
匿名身份验证已被删除,以使用 UAA 服务强制执行身份验证过程。XSA 有三种类型的身份验证:无、基本和路由。“无”意味着 API 将是完全开放的,不会受到攻击。基本意味着用户提供用户名和密码。简单认证基本认证可以;但是,它不如路由身份验证可靠。
路由身份验证是首选方法,因为它遵循应用于 UAA 服务和 JSON Web 令牌(JWT)的最佳实践。UAA 方法将在 api 模块中演示。通过 UAA 服务的身份验证是 CF 架构的一部分,这也是这里展示它的主要原因。
继续再次构建 api 模块,并查看图 4-22 中是否显示了与任何附加依赖项相关的任何错误。继续下一步之前,请确保模块构建正确。
如果显示任何与依赖项相关的错误,请通过访问 npm 站点或确保 package.json 文件具有正确的语法来确保模块版本正确。确保 SAP Web IDE 可以连接到 npm。这里可能需要环境管理员的帮助。
图 4-22
构建 Node.js 模块后的控制台输出
构建模块后,确保正确下载了指定的 Node 模块。打开应用的 api 模块,验证 api/node_modules 文件夹中是否存在 Node 依赖,如图 4-23 所示。
每次该模块的构建被触发并成功完成时,package.json 文件中列出的依赖项将用于下载或更新任何指定的依赖项(以及它们的子依赖项)。每个下载的模块都包含自己的 package.json 文件,该文件包含该模块自己的依赖项、元数据和与该模块相关的其他属性。打开模块的 package.json 文件以查看其版本下载,并确保它与 api 模块的包 json 中的指定版本相匹配。
node_modules 文件夹应该类似于图 4-23 (为了节省空间,对图像进行了裁剪,大约有 30-40 个非 sap 模块)。
图 4-23
添加到包文件中并下载到项目中的 node_modules
模块构建完成后,运行它并仔细观察接下来会发生什么。右键单击 api 模块并选择运行。
几秒钟后,控制台消息显示模块正在运行。控制台中显示的是和以前一样的主机:51026;但是,如果点击该 URL,浏览器窗口将显示运行时错误信息,如图 4-24 所示。
图 4-24
在模块初始化期间启用 UAA 检查后,浏览器出现运行时错误
尽管由于显示的消息,此消息可能会对模块是否正在运行给出错误的判断,但请通过打开 XSA 驾驶舱并导航至应用页面来验证 api 模块的请求状态。请注意,应用实际上正在运行,如图 4-25 所示。
图 4-25
从 XSA 驾驶舱运行的应用视图
这是一个正确的实现,并且显示的消息是有效的。由于 api 将利用 UAA 认证,它将进一步要求路由认证,并且必须声明导航路由。(导航)路线是在 UI 模块中声明的。
创建一个新模块,并声明这两个模块之间的依赖关系(在 mta yaml 中)。
右键单击项目,选择 New,然后选择 SAPUI5 HTML5 Module,按照提示将其添加到 wavepress 项目中,如图 4-26 所示。
图 4-26
从 SAP Web IDE 创建 SAPUI5 HTML5 模块
添加模块名称。请记住,在添加其他模块时,这个模块部分也会添加到 mta yaml 文件中。不久之后,这个模块将需要被添加为 api 模块依赖项之一,以便它能够提供到 api 后端的路线导航。
如果要构建前端用户界面,则命名空间非常有用。本例中使用项目名称作为命名空间,如图 4-27 所示。
图 4-27
创建 HTML5 模块后的名称空间提示
SAPUI5 是一个现代的 UI 框架,它使用 MVC(模型-视图-控制器)软件设计模式。从 SAP Web IDE 创建此模块时,请提供其中一个 UI (XML)视图的名称。默认情况下,向导指定 View1 作为其名称,但如果需要,可以将其更改为另一个名称。允许 JavaScript 和 HTML 视图类型;然而,SAP 建议使用 XML 视图,因为这些类型的视图遵循结构化的层次结构,使得它们更容易在图形编辑器中可视化和表示(图 4-28 )。
图 4-28
SAPUI5 视图名称提示
完成此步骤后,单击下一步并确认或完成。
当新的 HTML5 模块被添加到项目中时,它将如图 4-29 所示。在这个步骤中,一个常见的错误是创建了文件夹,导致错误阻止了模块的构建。
如果创建了文件夹,应用将无法工作。请务必使用新的{特定}模块向导来创建这些模块。添加完新创建的模块后,右键点击并构建 ui 模块,如图 4-29 和 4-30 所示。
图 4-30
构建 HTML5 模块后的控制台输出
图 4-29
新添加的 HTML5 模块
成功构建后,再次右键单击它,将其作为 web 应用运行,如图 4-31 所示。
图 4-31
将 HTML5 模块作为 web 应用运行
单击控制台输出窗口顶部显示的 host:51027 URL。空的 SAPUI5 应用将在下一个选项卡上启动。这个 SAPUI5 应用使用默认的 SAPUI5 主题和默认版本。
此时,如图 4-32 所示,验证 ui 模块是否运行,没有其他内容。
图 4-32
运行 SAPUI5 HTML5 模块后浏览器中的默认 UI 代码
这还不是 API。因为 UI 是 API 的入口点,所以需要更新应用设置来将这两个模块链接在一起。打开 mta yaml 文件,查看它是如何更新的。
三个模块应显示在 mta yaml 文件的图形编辑器中,因为这些是目前为止创建的模块,如图 4-33 所示。
图 4-33
显示项目内部模块的 mta 文件
为了从浏览器中清除 api 错误,按照以下步骤添加 wavepress 模块依赖关系(按照创建的顺序),如图 4-34 所示:
图 4-34
从 mta yaml 文件中看到的 db 模块依赖关系
- db 模块(db 模块中的属性应该已经正确存在)
-
需要 hdi_db 容器
-
需要跨架构服务
-
图 4-35
从 mta yaml 文件看到的 api 模块依赖关系
- api 模块(图 4-35
-
需要 db 和 hdi_db 容器,以便与它们进行交互
-
需要 UAA 服务的实例来验证(HTTP)请求
-
(向其他模块)提供要从外部(例如,从 ui)调用的资源
-
图 4-36
从 mta yaml 文件中看到的 ui 模块依赖关系
- ui 模块(图 4-36
-
要求 UAA 服务对 API 请求进行身份验证
-
需要 api 资源来转发请求和令牌
-
在再次构建模块之前,验证 XSA 驾驶舱是否提供了服务,以确保创建新的 UAA 服务实例。
前(如图 4-37 ):
图 4-37
从 XSA 驾驶舱显示的服务实例
建立新的 ui 模块(并重建 api 模块)和图 4-38 后。
图 4-38
在项目中重建不同模块后显示的控制台输出
新创建的 XS UAA 服务的服务实例出现在 XSA 驾驶舱中,如图 4-39 所示。
图 4-39
在项目中重建模块后运行的服务实例
已经创建了 UAA 服务的一个实例(图 4-40 ,模块将使用它来建立它们的关系和依赖关系。还没有映射允许从 UI 访问 wavepress REST API 的路由。由于应用最终将需要 UAA 身份验证,后端模块将无法直接访问。这是在软件系统中禁止 API 消费者直接访问后端服务的一种正常而安全的方式。相反,应用需要公开 ui 模块。使用 ui 模块的重新路由配置和路由认证流,来自浏览器的传入请求将从 ui 模块传递到 REST API。这些是云铸造原则,而不是 SAP HANA XSA。
图 4-40
在开发空间内运行的应用
下一步是在 ui 模块内的 xs-app.json 文件中指定路由和身份验证方法。默认情况下,该文件如图 4-41 所示。
图 4-41
REST API 的 xs-app.json 文件配置设置
编辑该文件,并将 认证方法 属性设置为 route。
添加 API 将要使用的 路线 (图 4-42 )。
图 4-42
xs-json 文件,包括路由和验证方法
-
第一条路线是导航到 Node JS REST API(沿着路径 /wpsvc )。
-
第二条路线是导航到 XSJS 向后兼容模式服务(在 api 模块初始构建期间构建的第一个服务)。
-
第三条路线是“捕获所有路线”,它将 ui 从任何未指定的路线重新路由到 webapp/index.html 文件,也称为 welcomeFile。
如果您想要处理不同的 API 端点,请继续添加路由。路线从更具体到不太具体进行匹配。源/目的地的路由设置可能会使用正则表达式,以防您需要处理各种类似的路由。
在项目的这一点上,有许多信息需要仔细分析和理解:
-
路由是一个 URL(它可能包含一个端口号)和它所指向的相对路径(也称为根和端点)。
-
每条路线都包含
-
来源–它是如何进入系统的
-
目的地–使用 mta,有针对性的重新路由
-
csrfProtection–跨站请求防伪
-
authenticationType–使用创建的 xsuaa 实例,如 yaml 文件中定义的那样
-
添加完依赖连接后,重新构建并重新运行 api 和 ui 模块。如果构建成功,如图 4-43 所示,从 ui 模块所在的根 URL 导航,并将相对路径更改为标识为 /wpsvc 的(api 端点)默认 api 路径。
运行 REST API 来验证它仍然返回“Hello wavepress!”来自 Node JS api 模块的消息如图 4-44 所示。如果是,这意味着 UAA 服务实例正在应用中使用,并且被应用使用。如果用户尚未在系统中通过身份验证,可能会出现凭据提示。如果出现这种情况,请向系统提供凭据。
图 4-43
在包含路由身份验证后,将应用作为 web 应用重新运行
注意图 4-43 中 ui 模块使用的同一个端口,图 4-44 中主机或域后面附加了 api 模块路由(相对路径)。浏览器输出由 nodejs 服务生成。
图 4-44
Hello wavepress 端点在进行 api 调用后将输出返回到浏览器中
保持“Hello wavepress!”端点暂时作为健康检查端点(如图 4-45 第 13 行所示)。健康检查端点在验证服务已启动并正在运行时非常有用,无需发出需要一直返回到数据库的请求。有时,该运行状况检查端点也称为心跳。
在 XSA 环境中,这是学习请求的一个巨大进步。如果需要,请多次回顾这些步骤,以理解集成点。
在能够创建和验证第一个健康检查端点之后,继续 api 开发的其余部分。通常,API 以 GET 端点开始。GET 端点允许 API 向请求显示一些数据。
继续创建一个端点,该端点将对数据库执行 select 语句(利用 HTTP GET 请求),如图 4-45 所示。这个操作代表了从 api 模块到数据库工件的第一次集成。使用在第二章第 2.4 节(CV_DEVICES)中创建的计算视图,请求将如图 4-45 所示。
图 4-45
wavepress.js 服务显示视图中的选择
每次编辑或添加代码时,都必须重新构建并重新运行 api 模块。请求从 api 模块获取/devices 端点。如果视图存在,并且后端表中有数据,请求将根据提供的 select 语句返回一些数据。为简单起见,api 请求的第一条和最后一条记录如图 4-46 所示。
图 4-46
从浏览器调用 api 后的计算视图输出
要显示 REST API 中相同端点的不同方法,通过 POSTMAN REST 客户端工具发送请求。如果一切正常,它应该显示相同的输出。
一旦该工具成功验证了请求,就进入下一个场景。将显示一个 POST 请求,演示在数据库表中插入和更新记录。
在 POSTMAN 请求中使用来自浏览器的相同 URL,API 将返回一个 未授权的 HTTP 错误响应,因为请求是从 ui 模块的浏览器会话发起的。出现凭证提示, ui 模块将请求转发给 api 模块。邮递员将需要一个稍微不同的方法。
图 4-51
邮递员获取新的访问令牌表单
-
Ensure POSTMAN has the request URL that will be made. Ensure that the setting for collecting cookies is enabled (displayed as a satellite icon on the top right of the tool) as shown in Figure 4-48.
图 4-48
邮递员
-
打开 授权 页签,选择 OAuth 2.0 作为所需类型。
-
Click the Get New Access Token button on the right side of the screen shown in Figure 4-49.
图 4-49
邮递员授权获取新的访问令牌
The form for OAuth will appear. It requires it to be populated with certain values from the environment variables displayed from the XSA cockpit. The correct environment variables can be collected from the XSA cockpit by navigating to the api application and selecting the environment variables. Look at the values provided within the xsuaa section shown in Figure 4-50.
图 4-50
用户提供服务的 XSA 驾驶舱内的环境变量
Pay close attention to the VCAP_SERVICES setting, examine the xsuaa section, and obtain the following values to provide to the form from Figure 4-51:
-
令牌名称 可选。可以提供任何名称。
-
接入令牌 URL 是 XS 控制器 UAA 服务 URL。
-
在 URL 末尾追加 /oauth/token 。
-
客户端 ID 的值显示了环境变量里面的值。这是一个编码字符串。
-
客户端的也在同一个区段内的环境变量值内。它也是一个编码字符串。
*** 点击请求令牌生成将在 POSTMAN 中使用的令牌。
**
-
**1. 为了模拟授权,需要一个 OAuth 令牌:
打开 POSTMAN 并将 URL 设置为后端 api(不是从浏览器,而是从 SAP Web IDE 控制台)。
The URL appears after building and running the api module as shown in Figure 4-47.

图 4-47
运行 Node 模块后 SAP Web IDE 的控制台输出
要使用 POSTMAN 生成令牌,请遵循以下步骤:
一旦请求,令牌就会出现在 POSTMAN 的主请求/响应窗口中,如图 4-52 所示。
图 4-52
邮递员获取新的访问令牌并输出新的令牌
- 发送请求并观察收到的响应类型。
配置授权令牌后,尝试如图 4-53 所示的 POST 请求。
要执行 POST 请求,需要其他属性:
-
需要指定要调用的下一个端点,因为不同的端点将在 api 中执行不同的操作。此端点不同于原始的 GET 操作。这一次,它将用于插入、更新或删除数据库中的记录。
-
选择 POST 作为 HTTP 方法。
-
提供请求的正文。POST 主体需要 JSON 有效负载(而不是执行 GET 请求,在 GET 请求中,输入参数作为查询字符串值在 URL 中发送)。
-
对 POST 请求的响应也将作为 JSON 有效负载返回。REST API 的消费者需要知道如何读取有效负载,以便处理额外的逻辑。
在 Node 模块和 wavepress.js 服务中,创建一个将用于 POST 请求的新端点/设备。
图 4-53
wavepress API 端点
使用从 GET 请求中检索到的示例主体有效负载将 POST 请求发送到该端点。确保提供了正确的结构,并提供 OAuth 令牌,如图 4-54 所示。
图 4-54
邮递员发布更新设备记录的请求
通过分析请求/响应过程和任何错误,可以了解从任何外部工具到 api 以及从 api 返回到外部工具(本例中为 POSTMAN)的流程,这是一个完整的往返请求。api 可能会遇到主体未定义的情况,即使请求中提供了主体。当其他问题出现时,包含额外的逻辑来解决它们是正常的。POST 请求的主体基于用户输入。它的所有属性和值都不受系统信任,必须进行验证。如果遇到这种问题,包含一个名为 body-parser 的 Node JS 模块,以便 Express 能够解释进入 API 的请求体。知道解决方案中需要这个模块,建议将其作为依赖项包含在 package.json 文件中,如图 4-55 所示。作为一个依赖项,它将被下载,并且在代码中也必须是必需的。打开 node_modules 文件夹,查看它是否已经作为不同模块的依赖项存在。无论如何,建议将它包含在 package.json 文件中,以防原始模块将来删除它的依赖项。
图 4-55
Node.js 模块中的 package.json,包括主体解析模块
包含后,在 wavepress 服务实现上导入,如图 4-56 所示。
图 4-56
wavepress 服务导入服务实现(第 4 行和第 15 行)
重新构建 api 模块后,再次运行它。开始运行后,返回到 POSTMAN,发送一个后续 POST 请求,如图 4-57 所示。
图 4-57
包含主体解析器后的邮递员更新请求
这一次,请求是成功的,因为 Express 可以读取所提供的请求正文。它也作为对 POSTMAN 工具的响应被返回。api 模块上的往返行程已经过验证。
在成功地向 POST 端点发送请求并验证其工作正常后,连接调用以执行在第二章第 2.4 节中编写的存储过程。建议将对 api 的调用和从 Node JS 到数据库的实现分解成小部分,确保集成场景的每一部分都在完整的场景集成之前工作。将相同的原理从 POST 应用到 DELETE HTTP 方法实现。遵循这种方法将确保默认设置没有问题。出现的任何问题都可以通过分解集成点来轻松解决。分而治之!
将加载存储过程以更新/插入记录的 JavaScript 代码如图 4-58 所示。
第 53 行获取 db 客户机对象,当使用 hdbext (sap)模块加载存储过程时,需要提供这个客户机。存储过程作为对象加载到第 56 行的 Node.js 运行时中,然后在第 63 行执行。在第 63 行执行存储过程之前,添加任何业务逻辑来验证输入或格式化输入参数。存储过程的第一个参数是提供它期望的任何输入参数。在下面的示例中,设备数组被传入。注意,设备数组包含一个对象,它是请求的主体对象。
任何输出参数都将从作为存储过程的第二个参数提供的回调中返回。在以下示例中,存储过程返回一个名为 OUT_ID 的输出参数。
很高兴看到整个请求处理、业务逻辑,以及将 SAP HANA 数据库对象作为 JavaScript 对象调用,而无需在 Node.js 实现中进行 JSON 解析,如图 4-58 所示。
图 4-58
调用 SAP HANA 存储过程的设备端点
重复重建和重新运行 api 模块的步骤,使最新的代码可用于 api。
在 api 模块运行之后,运行 POST 请求。首先从现有记录中获取原始 JSON(从 GET 请求的输出中获取),如图 4-59 所示。
图 4-59
POSTMAN GET 请求获取设备列表
将 JSON 有效负载作为下一个 POST 请求的主体复制到不同的 POSTMAN 选项卡上。更新主体中的一个属性,即 TEMP_F 值从 74 到 72,以测试更新操作,如图 4-60 所示。点击发送。
图 4-60
更新记录后来自 wavepress 服务的邮递员 POST 请求和响应
如果主体结构正确并且存储过程成功执行,存储过程的响应将返回更新后的 ID 值作为响应的输出。可以通过重新运行 GET 端点并查看实时更新的值来验证响应,如图 4-61 所示。
图 4-61
邮递员请求验证更新的记录
运行插入操作,模拟新记录进入数据库。请注意,ID 属性为 null,并确保 TEMP_F 的数据类型为 decimal,而不是 string,以避免在 SQL 语句执行期间出现数据类型异常,如图 4-62 所示。
图 4-62
邮递员请求发送空 ID 以插入记录
在 nodejs api 中添加逻辑来处理错误的输入和输出响应是一个很好的做法,可以让 api 的使用者有任何不正确的行为或期望值。
像之前一样,通过 GET HTTP 请求端点重新运行验证,如图 4-63 所示。
图 4-63
邮递员请求通过 GET 请求验证最后一次插入
接下来测试删除端点,如图 4-64 所示。请记住,在这个端点中,必须提供希望删除的记录的 ID。记录的 ID 作为 URL 的参数传递,而不是在请求体中传递。删除端点的路径如图 4-64 所示。
图 4-64
wavepress 服务显示删除操作的端点
这一次,查询字符串参数包含将被删除的记录的 ID。该 ID 作为存储过程的输入参数 IN_DEVICE_ID 传递。
从 POSTMAN,删除请求出现,如图 4-65 所示。
图 4-65
邮递员请求发送删除请求
要验证请求,请重新运行 GET 语句,确保响应中不再存在匹配设备 ID = 13 的记录。请注意图 4-66 中 SQL 控制台显示的项目顺序的差异。
图 4-66
验证记录不存在的数据库资源管理器 SQL 控制台
如图 4-67 所示,可以再次使用 GET 请求从 POSTMAN 验证删除操作。
图 4-67
验证已删除记录的邮递员请求没有从 GET 请求中返回
调试 Node JS (api)模块
调试是在代码中设置断点(中断执行)的过程,目的是排除错误或检查代码中特定点的值。调试是任何软件开发的基础部分,应该小心谨慎地进行。
要在 SAP Web IDE 中运行调试场景,请在 api 模块中选择一个端点,设置几个断点,并启动一个调试会话,如图 4-68 所示。当前小节显示了如何设置调试会话。
图 4-68
Web IDE 调试窗格
在 api 模块中,打开 wavepress 服务并执行以下操作:
-
在代码行上(屏幕截图的左侧),单击其中一行以设置断点。
-
在右侧导航面板中,选择顶部第五个图标以打开调试窗格。请注意,在调试窗格的底部,它显示了设置调试点的两行。
-
在调试窗格的顶部附近,可以看到活动会话标签,下拉控件显示选定的活动会话。在下拉控件旁边,有建立会话、分离会话和显示会话信息的图标。
图 4-69
Web IDE 调试点
- 点击附加调试器图标(图 4-69 )。
图 4-70
Web IDE 将调试附加到目标
- 选择 api 会话(通过选择运行脚本开始)并点击确定按钮(图 4-70 )。
请注意,断点有一个复选标记,调试器窗格显示一个活动会话。如果调试器处于活动状态,继续运行来自 POSTMAN 的请求,如图 4-71 所示。
图 4-71
Web IDE 调试器正在运行
触发 POSTMAN 的请求执行 api 中的代码,并在设置的第一个断点处停止,如图 4-72 所示。
图 4-72
活动会话期间的 Web IDE 和调试窗格
由于调试器已经在预期的位置停止,请检查右侧的调用堆栈。调用堆栈显示在断点处停止执行的语句。
调试器中的导航可以通过顶部图标(在调试器部分下)或使用键盘中的一些功能键来执行。它非常简单,使用的方法和在其他开发工具中一样。
播放按钮将从当前行开始推进代码执行,只有在当前执行行前面有另一个断点时才会再次停止。如果没有设置其他断点,那么执行将继续,直到执行结束。此功能也可以通过按键盘上的 F8 来执行。
下一个图标(指向右边的箭头)是跨过。单步执行功能允许开发人员继续执行,并允许执行跳过嵌套函数内的代码。通过按键盘上的 F10 可以实现跨越。
接下来,是进入特性的步骤。这个特性允许执行到下一行,它也进入嵌套函数。如果您想要逐行检查方法,请使用此功能。按键盘上的 F11 键也可以达到同样的效果。
最后,在调试子部分中,有步出(当前函数的)。当函数嵌套在内部时,使用此功能可以跳出函数。通过按键盘上的 Shift+F11 可以实现相同的功能。
变量选项卡(图 4-73 )用于局部变量值、全局变量值和当前代码执行的任何其他类型的范围变量,包括 JS 闭包。
图 4-73
调试变量
除了检查当前变量值外,还可以设置 表达式 (图 4-74 ) 。 点击 表达式 选项卡,点击表达式下的加号,添加一个表达式。
图 4-74
调试观察表达式
如果设置正确,表达式选项卡将显示添加的表达式。任何作为对象的表达式将允许进一步扩展以查看其嵌套属性,如图 4-75 所示。
图 4-75
调试表达式
在表达式部分下,可以选择 控制台 部分(图 4-76 )。此部分允许输入变量名以快速表达式求值的方式查看值,而表达式选项卡将继续显示当前值,即使在推进代码执行后也是如此。
图 4-76
显示变量值的调试控制台
另一个必须描述的场景是从 SAP Web IDE 中调试存储过程。存储过程是充当函数的数据库工件,它们对数据库表执行读取、创建、更新和删除操作。存储过程接受简单类型(NVARCHAR、INT、DECIMAL、SECCONDDATE)或复杂类型(作为表的结构)的输入和输出参数。在第章第二部分第 2.4 节中,创建了 SP_DEVICE_UPSERT 存储过程,用于描述在第章第四部分第 4.3 节中创建的/device 端点的场景。开发 API 时,有时上下文中的问题可能在 JavaScript 代码之外;但是,如果开发人员能够对 SAP HANA 数据库中的 SqlScript 进行故障排除,就会产生一个端到端的开发场景。
首先打开数据库浏览器并选择存储过程。右键选择打开调试,如图 4-77 所示。
图 4-77
存储过程调试
单击选项“打开以进行调试”后,会有一个弹出窗口显示附加调试器的不同方式。保持“SQL 控制台连接”处于选中状态,因为该示例将从数据库资源管理器中显示该存储过程的调试。在图 4-78 中选择确定。
图 4-78
通过 SQL 控制台连接将调试器附加到存储过程
存储过程将在数据库浏览器中打开,调试点的设置方式类似于在 Node JS API 中的设置方式。在显示行号的屏幕左边添加一些调试点。参见图 4-79 。
图 4-79
调试存储过程
在 SAP Web IDE 的右侧,观察调试窗格,如图 4-80 所示。
图 4-80
存储过程调试会话期间的调试器
打开 SQL 控制台窗口,准备调用存储过程。由于 SP_DEVICE_UPSERT 存储过程使用表类型作为输入参数,因此该示例显示了一个与输入参数具有相同结构的临时表。添加到临时表中的记录模拟相同的结构。调用存储过程之前的 select 语句是为了验证数据是否存在。
突出显示调用“WAVEPRESS_HDI_DB_1”。" wave press . db . procs::SP _ DEVICE _ UPSERT "(…。)语句并点击运行图标(图 4-81 左上角的绿色播放按钮)。
图 4-81
SQL 控制台开始调试以表类型作为输入参数的存储过程
如果输入参数具有正确的结构,则调试会话开始,存储过程的执行在断点处停止,如图 4-82 所示。
图 4-82
调试在存储过程中的调试点停止
在调试器中(图 4-83 ),调用栈显示当前执行的位置。此外,“上下文变量”和“表达式”选项卡显示了调试会话中用于分析的可用信息。本章展示了这些相同的选项卡和功能。
图 4-83
调试存储过程时调试调用堆栈和变量
使用调试器的逐句通过、单步执行或继续执行功能继续移动执行。一旦该对象中的调试完成,输出(如果有)将显示在启动调试会话的 SQL 控制台中。
如本章所示,调试功能通常是相互结合使用的,例如使用调试变量或编写输出到控制台的表达式,以及在从 SAP Web IDE 调试 Node JS 或 XSJS 代码时,使用特殊的键盘按键从一条代码语句移动到另一条代码语句(或从一个调试点移动到另一个调试点)。调试控件用于 SAP HANA XSA 环境中 API 软件开发的任何典型场景。请记住,调试发生在服务器端,外部工具有助于启动这些调试会话(使用 POSTMAN 的 POST 请求或 GET 请求的浏览器窗口)。使用这些功能通常可以让开发人员理解软件程序的流程和执行逻辑,并有助于理解 SAP Web IDE 和数据库浏览器的行为。无论这种情况需要调试 JavaScript 还是 SqlScript 代码,本节都展示了这两种情况、如何准备处理它们以及执行开发和调试的建议方法。
结论
本章最后展示了任何有经验的开发人员所期望的所有技巧和提示,只要能够在开发周期中导航工具,能够设置调试点,能够调试软件系统的每个方面,无论是在存储过程的后端还是在提供健壮 api 的微服务中;本章介绍了每个集成点,并确定了成功完成端到端开发场景的各种方法,包括 GET、POST 和 DELETE HTTP 方法。**
五、SAP XSA 的部署场景
一个软件系统在交付到生产环境中之前是不完整的。本书将展示并解释如何将版本控制分配给本书分享的练习中正在开发的微服务。本章还将解释如何在环境中执行软件部署,以及如何部署到 SAP 云平台。
MTA 项目和版本控制
软件开发的一个重要阶段是版本控制和发布周期。在软件产品生命周期的不同阶段,开发团队将为他们的产品分配版本,以符合审计和文档。在 SAP HANA 1.x 中,没有简单的方法来保持产品版本;但是,SAP HANA XSA 架构中的一些特性有助于软件的版本控制。
在 SAP HANA XSA 中,如前几章所述,mta yaml 文件包含与多目标应用相关的元数据属性。该文件还包含模块依赖关系,应用构建器使用它来配置模块之间的关系。这个文件的另一个特性是它可以将构建版本作为运行时属性保存。
在最新的应用构建之后,mta yaml 文件看起来如图 5-1 所示。
图 5-1
mta yaml 公司
很明显,名为 版本 的属性确实是 mta yaml 工件中提供该特性的属性。到目前为止,所提供的示例已经指导我们构建和运行模块来查看 REST API 的运行情况。
下一个构建演示将在应用级别进行(与模块级别的构建相反)。
选择项目,点击右键,选择 Build,如图 5-2 所示。
图 5-2
应用构建
由于应用构建器收集每个模块的信息并运行集体构建,因此这一步比独立构建模块需要更长的时间。请看 SAP Web IDE 的右下方。它显示应用构建正在进行。当应用级别的构建完成时,打开控制台,注意显示完整成功消息的日志,如图 5-3 所示。
图 5-3
应用生成控制台输出
从控制台验证 mta 构建后,在工作区层级内会显示一个新的文件夹,如图 5-4 所示,名为MTA _ archivesT5。此文件夹包含与工作区内构建的应用相匹配的子文件夹。每个文件夹将包含从每个应用级构建生成的归档文件。
图 5-4
工作区下的 mta 存档
生成的多目标应用档案被称为 mtar 文件。存档文件以 mta yaml 文件中指定的版本作为其名称的一部分生成,如图 5-5 所示。确保 mta 文件中的版本和 mtar 名称中的版本匹配。如果重新构建应用,mtar 文件将被新的构建覆盖。在重新构建应用时要小心这个过程,以避免在应用构建中被覆盖。
图 5-5
mtar 生成的文件
如果需要不同版本的应用,请更新 mta yaml 文件,根据所需版本将版本号从 0.0.1 增加到 0.0.2,如图 5-6 所示。
软件版本控制的最佳实践将版本模式描述为 X.Y.Z,其中
-
X 代表主要版本号。一个主要的发布意味着各种各样的特性被添加到软件中并被发布。
-
Y 代表次要版本号。次要版本是指在软件中添加了一个小功能并发布。
-
Z 表示补丁号。补丁号意味着添加并发布了不同版本的软件。
在应用中,打开 mta yaml 文件并增加版本号以展示版本化过程,如图 5-6 所示。
图 5-6
mta yaml 版本更新
选择应用,右键单击,重新构建一次,如图 5-7 所示。
图 5-7
重建应用
返回 mtar 构建文件夹,注意新生成的 mta 归档文件。它与 mta yaml 文件中的更新版本相匹配。请注意,在同一文件夹中,初始的 0.0.1 和 0.0.2 归档文件都被保留。如果在 mta yaml 文件中继续更新 version 属性,情况也是如此。这次版本将根据需要更新到 0.0.3 等,如图 5-8 所示。
图 5-8
mta yaml 版本和生成的 mtar
SAP Web IDE 部署
通过从可用的 mtar 集中选择 mtar 文件,并从 SAP Web IDE 顶部菜单中选择菜单项 Deploy ,可以从 SAP Web IDE 进行部署。本章的这一节与开发任务无关;但是,了解如何在 XSA 环境中执行部署非常重要。开发人员和 XSA 驾驶舱管理人员都可能参与到前面描述的一系列任务中。
有两种类型的部署可用:
图 5-16
SAP 云平台
-
SAP HANA XS 高级版(此处展示)
如果执行内部部署,则使用此选项。部署应用需要了解(CF 体系结构)组织和空间。
In the SAP Web IDE, select the mtar file. Follow by selecting the “Deploy” menu item from the navigation. Select “Deploy to XS Advanced” as shown in Figure 5-9.
图 5-9
mtar 部署到 XSA
After selecting the XS Advanced option from the Deploy menu, follow the prompt to specify the Organization and Space for the deployment as shown in Figure 5-10. The same application could be deployed to different Spaces if one Space is needed for development and another Space may be needed for testing purposes. Deploying to different Spaces will eventually generate a different URL: PORT where the application is deployed to.
图 5-10
mtar 部署到组织/空间
单击“部署”按钮。
The deployment of the application may take a few minutes as the SAP Web IDE is using the mtar (binary file generated) to deploy the application to the on-premise XSA environment. Continue to monitor the console log for any issues or successful deployment messages as displayed in Figure 5-11.
图 5-11
mtar 部署控制台消息
The ui application is running on the host:51053 port which means that the deployed application will be launched from a different port than the same application that was used during the development exercise. Along the same lines, it is expected that developers/admins will be able to monitor these applications from the XSA Advanced Cockpit as shown in Figure 5-12.
图 5-12
运行在开发空间中的 XSA 应用
导航到 XSA 驾驶舱,进入组织和空间,并注意到部署的应用。
从新绑定的端口运行应用应该会返回 API 的输出。
Validate this deployment step by navigating to the URL and PORT where the ui module is running, and it will display the ui module as shown in Figure 5-13.
图 5-13
从不同端口运行的(部署的)应用
Similarly, validate the api module by changing the relative path to navigate to the /wpsvc url (displaying the “Hello wavepress!” message on the browser) as it was shown before and also in Figure 5-14.>
图 5-14
已部署应用的浏览器输出
Finally, validate the devices endpoint to retrieve the list of devices as shown in Figure 5-15 (which executes the CV_DEVICES view).
图 5-15
/devices 端点的浏览器输出
还可以验证插入、更新和删除设备的其他端点。由于本节遵循与第四章相同的步骤,验证第四章中的步骤,只需更新相对路径和 HTTP 方法并发送来自 POSTMAN 的请求即可验证其他 HTTP 方法。
从 SAP Web IDE 到 XSA 本地环境的部署流程现已成功通过验证。
-
部署到 SAP 云平台云铸造环境
使用此选项时,需要 SAP 云平台中的活动帐户(或 SAP 云平台中的免费试用帐户)才能部署 MTA 应用。
此外,如 CF 小节中的第一章所述,已经有一个组织和一个将部署应用的空间是一个先决条件。如果不是这样,请继续创建本练习的组织和空间。
登录 SAP 云账户(或试用账户),如图 5-16 所示。如果您需要在生产环境中运行应用,请务必咨询可用的 SAP 云许可证类型。
如图 5-17 所示,确保 CF 已启用(或点击“输入您的试用账户”后启用)。
图 5-17
在 SAP 云中启用 CF
CF 环境启用后,将如图 5-18 所示。请注意,CF 环境最初启用 30 天。如果环境需要启用超过 30 天,则需要请求延长试用期,以防止环境被停用并可能丢失任何更改。
图 5-18
SAP 云平台–CF
单击内容部分中的单幅图块。
下一个屏幕显示了从 SAP Web IDE 部署应用所需的 CF 设置(API 端点、组织和空间)。如图 5-19 所示,目前还没有部署任何应用或服务。
图 5-19
SAP 云平台 CF 组织/端点
尽管 REST API 是在本地场景中部署和测试的,但是在部署到 CF 环境时,MTA yaml 文件的相同部署配置可能不正确。请注意,在 CF 环境中,服务和应用共享资源。在构建这个 API 解决方案的过程中,附加设置被添加到 mta yaml 文件中,以符合 CF 部署。
添加的设置如下。
在 hdi-db 资源中,在 parameters 部分添加键值对:
-
服务:hanatrial
-
服务计划:人类发展倡议-共享
在 SAP Web IDE 中,选择一个 mtar 文件,点击右键,选择部署到 SAP 云平台,如图 5-20 所示。
图 5-20
部署到 SAP 云平台
SAP Web IDE 有一个需要 CF API 端点细节的接口,如图 5-21 所示。
图 5-21
SAP 云端点、组织、空间
提供 API 端点后,SAP Web IDE 将提示输入 CF 帐户的凭证,如图 5-22 所示。
图 5-22
CF 帐户的凭据
如果 CF 帐户使用针对 CF 端点提供的凭证进行身份验证,则在从 CF 帐户中检索后,提示将显示组织和空间的详细信息,如图 5-23 所示。
图 5-23
在 CF 中选择组织和空间
要验证 SAP 云平台 CF 部署,请回到现场,注意应用和服务的数量。
要从 Linux 终端验证部署和 CF 环境,请运行以下命令:
-
cf 登录-a <end_point_uri>t</end_point_uri>
The Organization details are displayed if login is successful as shown in Figure 5-24.
图 5-24
使用 CF CLI 连接到 CF 端点
-
cf services are shown in Figure 5-25.
图 5-25
检索 CF 帐户内的服务
如果需要从 SAP 云平台帐户检索其他信息,请从 CF/XS CLI 测试其他命令。可以在 SAP 官方文档网站上找到可用的命令:
通过 SAP HANA cockpit 为 XSA 扩展微服务
软件系统的可伸缩性是云环境提供的重要特性之一。根据 CF 原则构建的 SAP HANA XSA 也支持此类特性。扩展软件系统意味着一个应用或服务可能有多个实例同时运行,以满足软件系统的容量需求。扩展应用或微服务需要开发者和 XSA 驾驶舱管理员共同努力。
随着应用的增长,并逐渐从开发环境提升到质量系统,并最终进入生产环境,一些因素可能会降低软件系统的性能。通常,质量环境模拟同一公司的生产环境,系统在这种环境中进行更彻底的测试,在进入生产之前预测打嗝。通常,生产环境中用户数量和数据量的增加会导致应用性能下降。其他因素,如网络带宽、与业务相关的事件,或许还有以前没有遇到的其他未知因素。应用或服务如何满足这种需求?这就是可伸缩性在 XSA 应用的地方。
在当前练习中,一个应用和一个服务被创建为一个单实例应用。从图 5-26 中的 SAP XSA 驾驶舱可以看到。
图 5-26
从 XSA 驾驶舱看到的 XSA 应用
从 Linux 终端使用 xs apps 命令可以从 XS CLI 读取相同的信息,如图 5-27 所示。
图 5-27
从 XS CLI 看到的 XSA 应用
请注意,系统中只有一个可用实例在运行。如果要对应用或服务进行压力测试,在某个时候,如果在一段时间内向系统发送 X 个请求,就会显示性能下降。
增加分配给应用的内存以满足这种需求是完全有意义的;但是,开发人员或 SAP XSA cockpit 管理员也可以为同一应用创建额外的实例,以便将进入应用或服务的请求负载平衡到多个实例中,而不是由一个实例处理所有请求。
问题变成了应用何时应该增加内存,而应用何时应该运行多个实例?内存增长与实例增长的行业术语称为水平和垂直可伸缩性。
水平可伸缩性意味着应用的实例会更多/更少。水平扩展有利于系统负载平衡请求,并将这些请求平均分配给任何可用的实例。运行的实例越多意味着使用的资源越多,因此这种保持活动实例运行的方法是有代价的。如果将实例放置在不同的地理区域,以确保响应应用请求时的低延迟,或者如果预期的事件将会发生,并且业务知道它将会暂时承受沉重的负载,则可能需要这种方法,如图 5-28 所示。
图 5-28
微服务实例表示
垂直可扩展性意味着额外的内存限制将根据系统的需要而增加/减少。随着内存资源的增加,垂直可伸缩性将导致额外的成本。应该对可伸缩性进行适当的规划,以分析内存需求。
根据所提供的信息,这两种情况演示如下。
增加应用的内存(垂直扩展)
图 5-29
从 mta yaml 文件扩展微服务
-
从 SAP Web IDE 中,在图形编辑器中打开 mta yaml 文件。
-
确定需要增加内存限制的应用模块。
-
导航至参数部分,并在模块内添加内存属性及其期望值(图 5-29 )。
-
保存并重建模块。
从控制台验证模块是否已成功构建。
图 5-30
(之前)验证扩容微服务,如图 5-30 所示
重新启动应用应该会生效。注意在图 5-31 中服务被重新启动。
图 5-31
扩展微服务的(后)验证
如果应用重新启动,但没有显示更新的内存值,可能是由于系统覆盖了这些值,如图 5-32 所示。
图 5-32
扩展微服务–应用重启
如果应用内存没有按照 mta yaml 文件的指示分配内存值,继续从 Linux 终端执行 xs scale 命令,如图 5-33 所示。
图 5-33
从 xs cli 扩展微服务
返回 XSA 驾驶舱,刷新显示分配给应用的内存的同一屏幕,查看并验证应用的内存确实从原来的 512MB 扩展到了 1GB(或 1024MB),如图 5-34 所示。
图 5-34
扩展应用后的 xsa 驾驶舱
添加同一应用的其他实例(水平扩展)
图 5-35
XSA 座舱应用实例操作
-
在 SAP XSA 驾驶舱中,单击应用名称以进入应用详细信息屏幕。
-
在屏幕顶部附近,有可以对应用执行的操作(重启、重新登台、启动、停止、+实例、–实例、删除)(图 5-35 )。
-
选择“+ Instance”按钮添加同一微服务的实例。
图 5-36
XSA 驾驶舱向应用添加实例
- 系统立即添加一个实例,如图 5-36 所示。
图 5-37
XSA 驾驶舱显示添加的实例运行
-
几秒钟后,系统将显示两个实例中的两个在运行,一旦它们可用。该操作的结果显示两个实例正在运行,并且每个实例都有 1024MB (1GB)的内存,导致服务(api 模块)在图 5-37 中是可伸缩的。
-
可选–针对端点运行额外的请求,以查看服务是否仍在运行(在系统中运行压力测试可能会展示一个实例与两个实例的比较,它们的响应时间将有助于查看运行中的可伸缩性)。
当一个应用或服务存在多个实例时,请求仍然被发送到同一个 URL : PORT,然后系统内部知道如何检查每个实例上的负载,并智能地决定将下一个请求发送到哪里。这就是负载平衡过程。
可伸缩性并不意味着应用只能增长并能够响应压力负载。可扩展性还意味着当不需要资源时,可以缩小微服务的规模(以节省资源和资金——因为云服务对其资源/内存的消耗收费)。
从 XS CLI (Linux 终端),使用以下命令将应用缩小到 512 MB:xs scale
回到 XSA 驾驶舱,验证应用(api 模块)已成功缩减到 512MB。请注意,即使应用内存缩减,仍有两个应用实例在运行,如图 5-38 所示。
图 5-38
XSA 驾驶舱显示 2 选 2 应用正在运行
要删除其中一个实例并将应用设置回单个实例,请执行以下步骤(图 5-39 ):
图 5-39
正在删除应用实例
-
在 SAP XSA 驾驶舱中,选择应用。
-
进入应用详细信息屏幕后,请注意“–Instance”按钮并单击它。
-
系统将执行销毁(删除)其中一个实例的操作。几秒钟后,它将显示正在运行的实例的新数量。
-
Navigate back to the Space screen to show the applications running, displaying the number of instances and the memory values set.
图 5-40
XSA 驾驶舱显示删除一个后的应用实例
结论
请记住,当事件发生时,可伸缩性功能非常强大,企业需要能够对事件做出反应,以满足消费者的需求。
虽然许多公司都在想办法升级他们的 SAP HANA 系统并迁移到 XS 高级架构,但这本书解释了启动这一过程所需的基础架构和架构变化。本书的所有示例都与 SAP HANA 数据库进行交互,该数据库是读取和存储数据的基础。此外,本书涵盖了试图在 SAP HANA XSA 环境中实施 Node JS 微服务的开发人员的主题。
在整个章节中,我们学习了 CF 架构、实现 OAuth 授权的 UAA 服务、JSON 令牌生成和验证,以及它如何在 SAP HANA XSA 环境中工作。理解这种架构及其安全性的重要性是构建和部署在 XS 高级版上运行的 Node JS 微服务的基础。在将 XSA 架构与 Cloud Foundry 的架构进行比较后,这本书深入研究了 SAP HANA 数据库中几个组件的开发。利用经典的模式表,为 API 的后端提供了设计时对象,如计算视图、同义词和存储过程。在 XSA 环境中以 NodeJS 微服务的形式消费和公开数据是本书的重点。最后,展示了这些微服务的部署过程和软件版本控制步骤。这本书以应用的可扩展性和在云环境中部署这些微服务的步骤作为结尾。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· 地球OL攻略 —— 某应届生求职总结
2020-10-02 《线性代数》(同济版)——教科书中的耻辱柱