SAP CAP(Cloud Application Programming)开发框架概述

CAP是什么


SAP云应用编程模型(CAP)是一个用于构建企业级应用的编程框架。它引导开发人员沿着经过验证的最佳实践的“黄金路径”以及丰富的开箱即用解决方案来构建应用。

与过度专注于技术细节相反,基于CAP的项目主要通过关注快速的业务实现而实现价值。

 

1.概述和设计原则


CAP框架采用一系列经过验证且广泛采用的开源和SAP技术,如下图所示。


 

在开源技术基础上,CAP主要增加了以下内容:


  • 核心数据服务(CDS)作为我们的通用建模语言,用于领域模型和服务定义。
  • js和Java的服务SDK和运行时,提供库以快速实现/消费服务。

     


 

将代码与技术栈解耦 → 保护投资

今天的技术发展太快,新的技术可能很快就会过时,如何与这样的时代保持同步是一个重大挑战。CAP通过更high level的概念和API来避免了和特定技术的锁定,这些概念和API在很大程度上抽象了底层功能和协议。特别是在以下方面:


  • 特定于平台的部署方法和技术
  • 特定于平台的身份管理模式
  • 多租户的开通/关闭和租户隔离
  • 同步协议,如REST、OData或GraphQL
  • 异步通道和代理,如SAP Event Mesh、MQ或Kafka
  • 包括SQL和NoSQL在内的不同数据库技术

     


这些抽象使我们能够在不影响应用程序代码的前提下迅速适应新技术,从而保护投资。

 

CAP是开放的 → 无绑定

这听起来可能矛盾,但并非如此:虽然CAP在不牺牲开放性和灵活性的情况下提供最佳实践,但您仍然可以自由选择技术栈,或者选择以下的技术架构。

 

抽象,避免和底层锁定的高级概念和API :所有抽象都遵循玻璃箱模式,允许访问底层事物

开箱即用的最佳实践,为许多重复任务提供通用解决方案:您始终可以使用 custom handlers 来用自己的方式处理事务,例如决定是否采用读写分离或事件溯源开发框架,CAP做的只是减少您的工作量。

对SAP Fiori和SAP HANA的开箱即用支持:您也可以选择其他数据库和其他前端技术,如Vue.js等。

在SAP Business Application Studio、Visual Studio Code或Eclipse中提供的专用工具支持:CAP不依赖于这些工具。在CAP中可以使用@sap/cds-dk CLI脚手架和任何。

 

 

关键概念和范式

以下部分突出了CAP的关键概念,这些概念基于两个主要范式:


  • 使用CDS捕获有关问题域知识的声明性范式,
  • 以服务为中心的范式,其具有服务、事件和查询的普遍概念。

     


 

2.专注于业务,由CDS支持


CAP专注于业务知识和意图,而非代码本身 — 意味着关注“什么”,而不是“如何” — 从而促进:


  • 开发人员和领域专家在领域建模中的紧密合作。
  • 最佳实践和重复任务的开箱即用实现。
  • 平台无关的方法以避免锁定,从而保护投资。

     


下图说明了常见的CDS数据模型(在左侧),这些模型为CAP服务运行时或数据库提供动力。


 

核心数据服务(CDS) :

CDS是我们的通用建模语言,以概念上、简洁且可理解的方式来描述静态和动态属性,它是CAP的支柱。

CDS中的Model:

 

entity Books : cuid {title  : localized String;author : Association to Authors;
}entity Orders : cuid, managed {descr : String;Items : Composition of many {book : Association to Books;quantity : Integer;}
}


 

 

Domain Models描述静态属性方面,类似实体关系ER模型。

Associations 描述关系。Compositions 扩展了Association,帮助我们轻松建模文档结构。

Annotations 允许使用额外的元数据来丰富模型,例如用于UI、验证、输入验证或授权的元数据。

 

CDS Aspects

extend Books with @restrict: [ { grant:'WRITE', to:'admin' } ];extend Books with { ISBN : String };extend Orders with { customer_specific : String };


 

 

Aspects 允许灵活扩展模型。此外还能分离标准内容和自定义内容。

 

3.开箱即用的最佳实践


Node.js和Java中的CAP运行时从SAP应用程序中提炼并提供了许多通用的实现,加速开发,减少样板代码,提高代码质量。

以下是通用功能的摘录:

自动提供请求


  • 提供CRUD请求
  • 提供嵌套文档
  • 提供媒体数据
  • 提供草稿编排

     


处理重复任务


  • 隐式分页
  • 输入验证
  • 身份验证
  • 授权
  • 本地化/i18n
  • 并发控制

     


企业最佳实践


  • 常见的重用类型和方面
  • 托管数据
  • 本地化数据
  • 时间数据
  • 垂直化和可扩展性

     


 

4.动态查询和视图


CAP中所有数据访问都是动态的,基于实时数据的方法与对象关系映射ORM形成鲜明对比

 

核心查询语言(CQL)

CQL是CDS的高级查询语言。它使用元素轻松查询深度嵌套的对象图和文档结构。例如,这是CQL中的一个查询:

sql SELECT ID, addresses.country.name from Employees


相同语义的纯SQL:

sql SELECT Employees.ID, Countries.name FROM EmployeesLEFT JOIN Addresses ON Addresses.emp_ID=Employees.IDLEFT JOIN Countries AS Countries ON Addresses.country_ID = Countries.ID


 

Queries(CQN)

orders = await SELECT.from (Orders, o=>{o.ID, o.descr, o.Items (oi=>{oi.book.title, oi.quantity})})// 通过OdataGET .../Orders?$select=ID,descr$expand=Items($select=book/title,quantity)


 

Queries可以使用CQN作为纯对象符号直接发送给本地服务,通过诸如OData或GraphQL的协议发送给远程服务,或者发送给将其转换为本机数据库查询以进行优化执行的数据库服务。

 

设计态的Projection

// CDS中的Projectionservice OrdersService {define entity OrderDetailsas select from Orders {ID, descr, Items}}


 

我们还在CDS中使用CQL声明底层模型的非规范化视图,例如在定制服务API中。

 

5.服务和事件


CAP中的所有行为都是基于服务和事件的概念,就像此清单中表达的:

所有活动的事物都是服务 — 本地的、远程的,以及数据库

服务在CDS中声明 — 反映并在通用服务提供者中使用

服务提供统一的API — 被其他服务或前端使用

服务对事件作出响应 — 包括同步和异步API

服务消费其他服务 — 在事件处理程序实现中

所有数据都是被动的 — 即没有自己的行为,遵循REST

CAP中的服务都是无状态且具有最小功能范围的,这使您可以将解决方案模块化为微服务或函数即服务。

 

CAP的六边形架构


 

CDS中的服务定义

 

// CDS中的服务定义

service OrdersService{ entity Orders as projection on my.Orders;action cancelOrder (ID:Orders.ID);event orderCanceled : { ID:Orders.ID }}


 

服务在CDS模型中声明,用于自动提供能力。它们以entities、actions和events的形式来描述模型的行为。

 

统一消费

// JavaScript中的服务消费let srv = cds.connect.to('OrdersService')let { Orders } = srv.entitiesorder = await SELECT.one.from (Orders).where({ ID:4711 })srv.cancelOrder (order.ID)// 通过REST API进行消费GET /orders/Orders/4711POST /orders/cancelOrder/4711


 

CAP中的所有动态的事务都是服务,包括本地服务或远程服务 — 即使数据库也是服务的一部分。

所有服务都为编程式消费提供统一的API。因此代码和底层协议完成了解耦。

 

普遍事件

// 服务实现cds.service.impl (function(){this.on ('UPDATE','Orders', (req)=>{})this.on ('cancelOrder', (req)=>{})})// 发送事件// 例如,在this.on ('cancelOrder', ...) 中let { ID } = req.datathis.emit ('orderCancelled', {ID})// 订阅事件let srv = cds.connect.to('OrdersService')srv.on ('orderCancelled', (msg)=>{})


在CAP中,一切都是对事件的响应。CAP具有普遍的事件概念,表示通过同步API进入的请求以及异步事件消息。

我们在event handlers中添加自定义逻辑,用于实现服务操作。同样,我们可以订阅由其他服务发出的异步事件。

 

6.环境准备及特性展示


部分工具依赖源自nodejs,所以请先下载安装nodejs,我这里选择的是18.15LTS版本,安装好之后再命令行执行node -v检查版本

接下来借助nodejs的npm工具安装cds CLI:npm add -g @sap/cds-dk

再安装Git,执行git version检查安装是否成功

安装sqlite,下载Precompiled Binaries for Windows下的 sqlite-dll和sqlite-tools,解压到文件夹后将路径添加到PATH即可,执行sqlite3检查安装

如果希望基于JAVA开发,还需要安装JAVA和Maven

 

快速启动Hello World项目


CAP框架借助CDS CLI提供了大量工具,如果希望基于nodejs开发的话,执行cds init bookshop就可以初始化框架代码,基于JAVA开发的话则是执行cds init bookshop --add java即可。

框架代码大致结构如下:

bookshop/       ├─ app/          # UI-related content├─ srv/          # Service-related content├─ db/           # Domain models and database-related content├─ package.json  # Configuration for cds + cds-dk└─ readme.md     # A readme placeholder


遵循“约定大于配置”准则,CAP的很多配置都有默认选项,但也可以自行定义,例如你可以重新定义项目的默认结构

{ ..."cds": {"folders": {"db": "database/","srv": "services/","app": "uis/"}}}


 

启动项目


只需要一个命令即可在本地启动项目,无需编译部署,在项目代码有变动时,变动的内容也会实时的体现出来

基于Nodejs的项目执行:cds watch

基于Java的项目执行:cd srv && mvn cds:watch

 

模拟平台服务


CAP运行时为常见服务提供”本地替身”,实现了快速开发体验,例如本地使用SQLite代替HANA Cloud, Mocked Authentication Strategy代替IAS身份服务,File-based Messaging代替Kafka等消息队列,Console-based Logger代替审计日志服务

 

模拟远程服务


我们只需要CDS service definition即可模拟Odata服务,包括数据库访问。这也允许我们在服务集成场景中模拟远程服务。

例如,假设我们希望从S/4集成业务合作伙伴,我们只需要导入服务API即可实现,例如,从SAP Business Accelerator Hub导入EDMX,并使用cds import来其转换为CDS service definition。由于我们现在有了service definition,我们可以模拟该API,而不必使用真实后端服务。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2814610.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【appium】App类型、页面元素|UiAutomator与appium|App元素定位

目录 一、App前端基础知识 1、App类型划分 2、App类型对比 3、App页面元素 App页面元素分为布局和控件两种 常见布局: 常见控件:定位软件:appium和sdk自带的uiautomatorviewer都可以定位 二、App元素定位 1、id定位 2、text定位 3…

CGI程序与ShellShock漏洞

CGI是什么? CGI(通用网关接口,Common Gateway Interface)程序是一种用于在Web服务器上执行动态内容的技术。与服务器上普通的后端代码相比,CGI程序有几个区别: 执行环境: CGI程序在服务器上作为…

Keras 3.0发布:全面拥抱 PyTorch!

Keras 3.0 介绍 https://keras.io/keras_3/ Keras 3.0 升级是对 Keras 的全面重写,引入了一系列令人振奋的新特性,为深度学习领域带来了全新的可能性。 多框架支持 Keras 3.0 的最大亮点之一是支持多框架。Keras 3 实现了完整的 Keras API,…

2.27数据结构

1.链队 //link_que.c #include "link_que.h"//创建链队 Q_p create_que() {Q_p q (Q_p)malloc(sizeof(Q));if(qNULL){printf("空间申请失败\n");return NULL;}node_p L(node_p)malloc(sizeof(node));if(LNULL){printf("申请空间失败\n");return…

分布式存储 ZBS 的 RoCE 技术支持与大数据应用场景性能评测

作者:深耕行业的 SmartX 金融团队 闫海涛 在《解决 SAN 交换机“卡脖子”并升级存储架构?一文解析 RoCE 与相关存储方案趋势》文章中,我们分析了如何利用支持 RoCE 技术的分布式存储,同步实现 IT 基础架构的信创转型与架构升级&a…

【架构笔记1】剃刀思维-如无必要,勿增实体

欢迎来到文思源想的架构空间,前段时间博主做了一个工作经历复盘,10年开发路,走了不少弯路,也算积累了不少软件开发、架构设计的经验和心得,确实有必要好好盘一盘,作为个人的总结,同时也留给有缘…

Django项目使用vue打包前端页面使用教程

一、vue打包: 一般使用 npm run build 进行打包,打包完成后会生成一个dist文件夹 二、修改vue.config.js配置 vue.config..js配置里面增加: assetsDir: static 三、修改Django项目 将Django的static文件夹删除,移动di…

【Go 快速入门】协程 | 通道 | select 多路复用 | sync 包

文章目录 前言协程goroutine 调度使用 goroutine 通道无缓冲通道有缓冲通道单向通道 select 多路复用syncsync.WaitGroupsync.Mutexsync.RWMutexsync.Oncesync.Map 项目代码地址:05-GoroutineChannelSync 前言 Go 1.22 版本于不久前推出,更新的新特性可…

雾锁王国服务器配置怎么选择?阿里云和腾讯云

雾锁王国/Enshrouded服务器CPU内存配置如何选择?阿里云服务器网aliyunfuwuqi.com建议选择8核32G配置,支持4人玩家畅玩,自带10M公网带宽,1个月90元,3个月271元,幻兽帕鲁服务器申请页面 https://t.aliyun.com…

Firefox Focus,一个 “专注“ 的浏览器

近期才开始使用 Firefox Focus,虽然使用频率其实并不高,基本上只有想到了才去用,但每次使用的体验都很不错。 Firefox Focus 这款浏览器大约在 2015 年首次发布,不同于一般版本的 Firefox,它主打“自动删除浏览记录”…

Python请求示例获取淘宝商品详情数据API接口,item_get-获得淘宝商品详情(按关键词搜索商品列表)

请求示例,API接口接入Anzexi58 item_get-获得淘宝商品详情 公共参数 名称类型必须描述keyString是调用key(必须以GET方式拼接在URL中)secretString是调用密钥WeChat18305163218api_nameString是API接口名称(包括在请求地址中&am…

阅读笔记——《GANFuzz: A GAN-based industrial network protocol fuzzing framework》

【参考文献】Hu Z, Shi J, Huang Y H, et al. GANFuzz: a GAN-based industrial network protocol fuzzing framework[C]//Proceedings of the 15th ACM International Conference on Computing Frontiers. 2018: 138-145.【注】本文仅为作者个人学习笔记,如有冒犯&…

66-ES6:var,let,const,函数的声明方式,函数参数,剩余函数,延展操作符,严格模式

1.JavaScript语言的执行流程 编译阶段:构建执行函数;执行阶段:代码依次执行 2.代码块:{ } 3.变量声明方式var 有声明提升,允许重复声明,声明函数级作用域 访问:声明后访问都是正常的&…

ElasticSearch之找到乔丹的空中大灌篮电影

写在前面 本文看一个搜索的实际例子,找到篮球之神乔丹的电影Space Jam,即空中大灌篮。 正式开始之前先来看下要查询的目标文档,以及查询的text: 要查询的目标文档 {..."title": "Space Jam",..."ove…

密码学系列(四)——对称密码2

一、RC4 RC4(Rivest Cipher 4)是一种对称流密码算法,由Ron Rivest于1987年设计。它以其简单性和高速性而闻名,并广泛应用于网络通信和安全协议中。下面是对RC4的详细介绍: 密钥长度: RC4的密钥长度可变&am…

数据结构:栈和队列与栈实现队列(C语言版)

目录 前言 1.栈 1.1 栈的概念及结构 1.2 栈的底层数据结构选择 1.2 数据结构设计代码(栈的实现) 1.3 接口函数实现代码 (1)初始化栈 (2)销毁栈 (3)压栈 (4&…

Unity(第九部)物体类

拿到物体的某些数据 using System.Collections; using System.Collections.Generic; using UnityEngine;public class game : MonoBehaviour {// Start is called before the first frame updatevoid Start(){//拿到当前脚本所挂载的游戏物体//GameObject go this.gameObject;…

踩坑wow.js 和animate.css一起使用没有效果

踩坑wow.js 和animate.css一起使用没有效果 问题及解决方法一、电脑系统配置问题二、版本问题 问题及解决方法 一、电脑系统配置问题 在系统属性里面把窗口内的动画和元素勾选 二、版本问题 使用wow加animate4.4.1也就是最新本,打开网页没有任何动画效果 但是把…

CSS——PostCSS简介

文章目录 PostCSS是什么postCSS的优点补充:polyfill补充:Stylelint PostCSS架构概述工作流程PostCSS解析方法PostCSS解析流程 PostCSS插件插件的使用控制类插件包类插件未来的CSS语法相关插件后备措施相关插件语言扩展相关插件颜色相关组件图片和字体相关…

45、上海大学:轻量级多特征神经网络M-FANet,用于MI-BCI解码

本文由上海大学机电工程与自动化学院于2024.1.9日发表于《IEEE Transactions on Neural Systems and Rehabilitation Engineering》(SCI中科院分区二区,IF:4.9) 论文链接:M-FANet: Multi-Feature Attention Convolutional Neural Network fo…