在SAP云平台的CloudFoundry环境下消费ABAP On-Premise OData服务

我的前一篇文章 使用Java+SAP云平台+SAP Cloud Connector调用ABAP On-Premise系统里的函数介绍了在SAP云平台的Neo环境下如何通过SAP Cloud Connector消费ABAP On-Premise系统里的函数。在那篇文章demo程序的Java代码里,我们实际是通过JCO(Java Connector)来远程调用ABAP On-Premise系统里的函数。

今天我们换个环境,试试SAP云平台的CloudFoundry环境。

同时我们也试试换一种方式来消费ABAP On-Premise系统的服务。让我们开发一个Web应用,通过OData的方式显示ABAP On-Premise系统里的产品列表及价格信息。

该例子运行效果如下图所示。

同前一篇文章提到的在SAP云平台的Neo环境里消费ABAP On-Premise函数相比,在CloudFoundry环境里实现同样的需求,所需的步骤要复杂一些。

同Neo环境的部署相比,在CloudFoundry环境下最显著的架构区别就是多了个App Router。为什么CloudFoundry环境下需要这个东西?我的同事李贝宁在他的文章 SAP成都研究院李三郎:SCP Application Router简介 里做过详细阐述。

为了完成这个例子,我们需要部署两个应用到SAP云平台的CloudFoundry环境去,即App Router和Web应用本身。两个例子的完整代码在我的github上:

https://github.com/i042416/CloundFoundry_Connectivity

上图各模块间交互的简单阐述:

1. App Router作为用户访问Web应用的入口。

2. App Router将请求重定向到XSUAA实例,弹出登录界面。该实例负责完成登录认证,稍后会创建它。下图是登录界面在我手机上打开的效果。

3. 登录完成后,App Router将请求重定向到Web应用。

4. Web应用向XSUAA发起两个并行的请求,如图4a和4b所示,获取用于访问接下来第5,第6步的JSON Web Token。

5. Web应用访问Destination实例获取对应配置信息。

6. Web应用将请求发送给Connectivity实例。

7. Connectivity实例将请求通过Secure tunnel(安全隧道)转发给Cloud Connector。

8. Cloud Connector和On-Premise系统都位于Corporate Network里,直接调用其服务。

明白了原理,下面跟着Jerry一起做一做吧。

1. 我前一篇文章 使用Java+SAP云平台+SAP Cloud Connector调用ABAP On-Premise系统里的函数介绍了Cloud Connector的下载与安装,因此现在我们可以重用之前安装好的Cloud Connector。

点击Add Subaccount按钮,基于CloudFoundry Subaccount创建一个新的配置:

最重要的是维护CloudFoundry Subaccount的ID和用户名(登录邮箱)。

创建一个从Virtual Host到Internal Host的映射关系。Virtual Host的名称可以随便维护,我维护的是my-backend, 记住这个名称,以后会用到。Internal Host我维护的是提供OData服务的On-Premise系统的主机名和端口号。点击Check按钮,确保Cloud Connector能够成功连接On-Premise系统,状态为Reachable。

将On-Premise系统的下列4个ICF服务路径暴露出来:

  • /sap/bc/lrep
  • /sap/iwbep
  • /sap/opu/odata
  • /sap/public

至此Cloud Connector上的配置完成了。

2. 回顾我们之前介绍的模块交互图,Cloud Connector上的配置无法直接被部署在CloudFoundry上的应用消费。我们还需要在SAP云平台上创建三个不同类型的实例。

首先在SAP云平台Cockpit里创建一个新的Destination,URL字段指向前一步Cloud Connector里创建的Virtual Host。这个Destination的名称也得记录下来,后面会用到。

进入Service Marketplace,创建一个新的XSUAA实例:

这个connectivity-jerry-demo就是稍后我要部署到SAP云平台上的Web应用名称。

创建好的XSUAA实例:

connectivity和destination的实例创建的方式相同,不再赘述。下图是为了完成本文介绍的场景所需的三个不同类型的实例创建好之后的状态截图。

至此SAP云平台上的配置也全部完成。

3. 现在开始Web应用的开发。先看App Router的xs-app.json: 入口文件是index.html, 这个html文件其实就一行代码:

<a href="/app/">Go to App</a>

点击之后,会跳转到/app/, 而/app/的route配置如下,指向destination "dest-to-app":

而这个destination对应的真实url维护在App Router的manifest.yml文件中。同样需要在该yml文件的services字段里维护前一步创建的XSUAA实例:

再看Web应用的manifest.yml文件:需要将前一步骤依次创建的三种类型的实例名称分别维护如下图所示:

接下来我们需要进行Web应用里UI5部分的开发,指定产品列表的数据源基于哪一个OData服务。在UI5的controller文件里,指定OData模型的路径为相对路径data-eu。

针对这个相对路径data-eu,在neo-app.json里定义了一个路由,会被重定向到On-Premise系统的标准OData服务EPM_REF_APPS_SHOP_SRV。具体重定向到哪个On-Premise系统是由路由的target字段决定的。在我这个例子里是jerry-abap-backend, 它就是我们之前在SAP云平台Cockpit里创建的Destination。

这个Destination的URL字段指向Cloud Connector的Virtual host,该host又映射到On-Premise系统的主机名和端口号。至此大功告成了,SAP Cloud Connector上的配置,App Router,Web应用,SAP云平台上的connectivity,XSUAA和destination三个实例,这一系列模型犹如一台机器上的一个个零件,协同工作,实现了从Internet Network到Corporate Network的访问场景。

将两个应用部署到SAP云平台的CloudFoundry环境去,点击App Router作为访问的入口,能看到文章开头的产品列表页面。

并且Chrome开发者工具里观察到的网络请求的路径里仅仅包含前文提到的UI5应用的neo-app.json里配置的路由data-eu, 而On-Premise系统的主机名和端口号并未暴露到Cloud环境中。

当然,为了跑这个demo,您需要在On-Premise系统使用事务码/iwfnd/maint_service,为EPM_REF_APPS_SHOP_SRV这个标准的OData服务指定一个后台系统。在我下图的例子里,该服务的后台实现系统我指定成了AG3。

在Java代码里打印实际的url,发现是http://my-backend:80/sap/opu/odata/sap/EPM_REF_APPS_SHOP_SRV/$metadata。

该url里的my-backend:80会被Cloud Connector替换成实际的On-Premise系统的地址并发送到On-Premise系统去。

要获取更多Jerry的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏FreeBuf

分析一个用于传播Hancitor恶意软件的Word文档(第一部分)

最近,TechHelpList将一个用于传播Hancitor恶意软件的Word文档上传到了VirusBay,并概述了与之相关的站点、C2服务器以及由该文档所释放...

901
来自专栏张善友的专栏

ASP.NET2.0应用中定制安全凭证之实践篇

一、方案架构   本方案架构很简单——它用一个Web服务来包装ASP.NET 2.0提供者并且为远程客户暴露该凭证管理,你甚至还能在该架构中加上一些失去的功能。...

1838
来自专栏葡萄城控件技术团队

.Net 高效开发之不可错过的实用工具 工欲善其事,必先利其器,没有好的工具,怎么能高效的开发出高质量的代码呢?本文为各ASP.NET 开发者介绍一些高效实用的工具,涉及SQL 管理,VS插件,内

工欲善其事,必先利其器,没有好的工具,怎么能高效的开发出高质量的代码呢?本文为各ASP.NET 开发者介绍一些高效实用的工具,涉及SQL 管理,VS插件,内存管...

1856
来自专栏从流域到海域

Apache libcloud中对CloudStack的支持

原文地址:https://dzone.com/articles/cloudstack-support-apache

2246
来自专栏猿天地

Spring Cloud Eureka REST 接口

Eureka 作为注册中心,其本质是存储了每个客户端的注册信息,Ribbon在转发的时候会获取注册中心的服务列表,然后根据对应的路由规则来选择一个服务给Feig...

3856
来自专栏非著名程序员

倍数提高工作效率的 Android Studio 奇技

这是从Philippe Breault的系列文章《Android Studio Tips Of the Day》中提取出来的自认为精华的部分。这些技巧在实际应用...

1969
来自专栏BeJavaGod

LeeCX - 开源后台管理系统简单介绍

我们在github上开源了一个后台管理系统,使用了前端css框架并且简单的封装了一下,技术的将会不间断更新,详细可以点击https://github.com/l...

3354
来自专栏安恒网络空间安全讲武堂

Jarvis-OJ平台多题WriteUp分享

题目 ## PORT51 ## LOCALHOST ## Login ## 神盾局的秘密 ## IN A Mess ## RE ## flag在管理员手里 ##...

1.2K10
来自专栏大前端_Web

chrome调试JavaScript脚本

随着 JavaScript 应用的复杂性逐渐提高,开发者需要有力的调试工具来帮助他们快速发现问题的原因,并且能高效地修复它。Chrome DevTools 提供...

894
来自专栏ChaMd5安全团队

DedeCMS的两个小trick

0x00 前言 昨天晚上做了一个神奇的梦,梦到了我高中时候晚自习在偷偷的看《黑客攻防技术宝典》,当年的事情无论是苦是乐,回忆起来总是感觉非常的美好。但是,现实就...

2829

扫码关注云+社区