当前位置: 首页 > news >正文

探索云原生数据库技术:构建高效可靠的云原生应用

数据库是应用开发中非常重要的组成部分,可以进行数据的存储和管理。随着企业业务向数字化、在线化和智能化的演进过程中,面对指数级递增的海量存储需求和挑战以及业务带来的更多的热点事件、突发流量的挑战,传统的数据库已经很难满足和响应快速变化和持续增长所带来的业务诉求。伴随云原生理技术的不断普及,在数据库这个维度上也带来了巨大的变化。那就是云原生数据库技术的出现和被普及。

云原生数据库是一种通过云平台进行构建、部署并交付给用户的云服务,它专门为云环境设计的数据库,它可以自动扩展和缩减资源,提供高可用性和数据安全性,同时支持多种数据模型和编程语言。相对于传统数据库,它最大的不同就是以云原生的形式进行交付,它具备传统数据库所不具备的直接访问性和运行时的可伸缩性,属于 DBaaS 平台(DataBase as a Service)。

1、云原生关系型数据库

关系型数据库在当前软件研发领域一致都是最主流的数据库类型,而云原生关系型数据库在其架构上有着非常大的优势,具体体现在:

资源池化、大容量、高性价比

传统关系型数据库需要自行适配硬件,如果要扩展,需要购买设备。而云原生数据库从一开始就充分享受了云平台的各种技术优势,资源共享池化,可以存储海量的数据,同时提升了资源的利用率,让小公司也可以享受到像 BAT 这些大公司才能使用的先进硬件及部署环境。所使用的资源可以按需付费,只需要对使用的部分买单即可,降低了成本。

提供极致弹性

云原生数据库可以实现计算和存储分离,CPU、内存和存储这些都可以独立弹性,支持独立扩展,变配速度快,可以满足不断变化的多种业务需求,实现完全 Serverless 化。

强大的容灾能力和可靠性

云原生数据库充分利用强大的云基础设施,提供跨节点容灾支持。

云原生数据库充分利用新技术新硬件,比如,利用 RDMA(Remote Direct Memory Access,远程直接数据读取)技术实现分布式共享存储,通过数据的多副本技术提升容灾能力。

云原生数据库充分提升跨区域的复制能力,提升高可用能力,保证用户业务的可用性。

完全托管

云原生数据库完全托管给云平台,用户无须负责硬件的购买和部署、软件错误的修复、实例参数的配置、监控的开发、数据的备份和管理等工作。

智能化和自动化的管控平台

云原生数据库将机器学习、人工智能技术与数据库内核相结合,使得数据库更加智能化和自动化,实现自感知、自决策、自恢复和自优化。

2、云原生数据库技术分析

云原生数据库一致持续进行着技术演进。在硬件资源方面,CPU/内存/存储的独立资源化对资源间的互联提出了很高的要求,各个节点之间,包括存储节点、计算节点甚至内存池节点的互联,都需要高性能 RDMA 网络甚至其他新总线的支持。在软件方面,因为资源的池化并不能在操作系统层面实现完全透明,数据库需要对功能模块进行拆分和重构,以实现不同的组件通过高速网络在不同的物理机的互连和运行,从而实现性能的最大化。

OLTP 数据库作为一个整体,需要在资源分离的情况下,对外保证 ACID(原子性、一致性、隔离性和持久性)和外部一致性,因此需要高效的分布式缓存、分布式锁和分布式事务机制来保证读写的快速弹性和整体的高性能。另外,在保证正确性的前提下,需要减少节点之间数据日志的通信量。

基于阿里的 PolarDB 对云原生数据库的核心技术进行分析如下:

计算存储分离技术

云原生时代要求数据库具备海量的计算能力和数据存储能力。在这样的场景下,传统数据库的计算和存储耦合架构的缺点逐渐暴露,

  • 资源浪费:计算能力、存储能力达到瓶颈,虽然这两种情况往往不会同时发生,但单纯增加机器必然导致资源浪费
  • 扩展麻烦:在计算和存储耦合的模式下,如果单纯增加设备,总会或多或少衍生出数据迁移和系统重新配置的问题,扩展能力弹性不足

计算和存储耦合架构在云原生时代暴露出了缺乏弹性的严重问题。而在云原生数据库中已经实现了存储资源的独立扩展。基于分布式存储的云原生数据库 PolarDB 就已经实现了存储资源的池化及独立扩展。

计算和存储分离架构为云原生数据库带来了计算和存储上的实时水平扩展能力,实现了计算能力上的极致弹性。由于单个数据库实例的计算能力有限,传统做法往往是通过搭建多个数据库副本分担压力,从而提供数据库扩展能力。然而这种做法需要存储多份全量数据,日志数据频繁同步造成了过高的网络开销成本。同时,在传统数据库集群上,增加副本需要同步所有增量数据,这又带来了同步延迟上涨问题。所以,PolarDB 采用了共享存储集群的数据架构,实现多个计算节点可以挂载同一份存储。计算节点可以单独扩展,支持一写多读集群的部署,且提供读扩展能力,支持在分钟级扩展到15个读节点。

PolarDB 的系统架构图如下:

(图片来自于网络)

计算内存分离技术

计算和存储分离的云原生架构虽然实现了计算和存储资源的独立弹性,但计算节点仍然包含 CPU 和内存,无法实现这两者的秒级弹性扩容收缩。与此同时,在很多业务场景下,这两者的业务需求很不一样,所以云原生数据库也在尝试计算和内存的分离技术。

具体实现的核心点一般包括:

  • 缓冲区通过单独进程进行管理,允许页面缓存独立于数据库。在出现数据库故障时,页面缓存将保留在内存中,确保数据库重启时不用重新加载数据,而是直接使用最新状态预热缓冲池
  • 保留数据库实例崩溃前的数据内存状态
  • 数据库崩溃重启时不必再执行“故障恢复”的过程(即回放日志以保障数据的一致性)

除了独立缓存技术,PolarDB 在 CPU 和内存分离方面有一些它独特的创新技术:

  • 数据库实例的 CPU 和内存资源可以部署在不同的物理机上,并通过 RDMA 高速互联。因此,CPU 和内存资源占比不再固定,而是可以根据业务负载动态变化。所有 CPU 和内存资源都可以在集群资源池的维度进行分配,利用业务的错峰和水位,有效提升资源的利用率,降低整体成本
  • 引入了独立的分布式共享内存池。在此架构下,同一个数据库实例的内存可以由位于不同内存节点上的多块内存组成。因此,缓冲区的大小不再受物理机限制
  • 在 CPU 和内存分离后,PolarDB 的计算进程不再包含大量内存,而是只有少量高速缓存。这使得计算进程变成了无状态的节点,从而实现了快速的跨物理机弹性

高可用及数据的一致性

高可用率和灾难恢复能力是数据库的重要考量因素。云原生数据库通过多副本技术确保数据的可靠性。

PolarDB 通过 PolarFS 分布式文件系统实现了数据多副本及一致性。PolarFS 是国内首款面向 DB 应用设计的、采用了全用户空间 I/O 栈的低延迟高性能分布式存储系统。PolarFS 对 Raft 协议进行了优化,实现了 Parallel-Raft 算法,大幅提高了数据同步保证一致性的能力,以分布式集群的方式提供了优异的存储容量与存储性能的扩展能力。在一个主集群三个副本的基础上,PolarDB 还包含了一个跨机房的备节点,以提供多机房容灾能力。

(图片来自于网络)

PolarDB 在存储层(PolarStore)提供了三个副本的同时,还通过自研的 x-Paxos 库提供了跨节点、跨机房的数据同步,以此提供跨 AZ 级别的容灾、RPO=0 的解决方案。这个方案利用 PolarDB 自主物理复制能力,提供更可靠、更低延迟的复制。相比 RDS 和 MySQL 的逻辑日志复制,PolarDB 在节点切换时,受大事务、DDL 的影响更小,且可以保证 RTO 小于一分钟。PolarDB 三个节点分别用于部署 Leader、Follower 和 Log 节点。其中,Log 节点只记录日志,不参与选主,不存储数据,部署成本相比现在的架构多了 Active Redo Log,但成本增加很少。

(图片来自于网络)

数据及日志的复制技术

PolarDB 为代表的云原生数据是基于 MySQL 发展而来的,MySQL 数据库多采用逻辑日志和并行回放技术以提升备节点的性能。然而,逻辑日志只能在事务提交时产生,备节点也只能在主节点完成提交后才能在本地状态机中回放出主节点的状态。一旦遇到较大的事务,这种主备之间的延迟将会非常明显。另一方面,虽然 MySQL 具备并行回放能力,但由于回放的并行粒度较大,因此常受限于实际的使用场景。如在单表更新频繁的场景中,实际上备节点只能做到串行回放。同时,采用共享存储架构,虽然多个节点是读取同一份存储数据,但各个计算节点的 in-memory 数据仍需要保持一致,这个“物理”的数据一致性是逻辑复制无法做到的。所以,要想从根本上解决该问题,势必需要将逻辑日志复制演进为物理日志复制。物理日志即在数据库更新时产生的写前日志,这种日志一般针对数据库页面修改而产生,每个页面的修改对应于一条或者多条日志项。如果复制物理日志并在备节点上回放,那么数据库就具备了复制内容少、备节点上可执行更细粒度的并行回放(可以页面为粒度进行并行回放)等优势。

PolarDB 从架构设计开始就纳入了物理复制的思路。在代码实现中,PolarDB 在内核层面实现了大量优化,从而可以更好地适配 PolarFS 和 PolarStore。比如,在 Redo Log 中加入一些元数据,以减少日志解析时的 CPU 开销。这个简单优化减少了 60% 的日志解析成本。另外,PolarDB 也重用了一些数据结构,以减少内存分配器的开销。

(图片来自于网络)

跨地域高可用技术

随着数字经济时代的到来,越来越多的商业行为逐渐数字化,这就对互联网基础设施提出了越来越高的要求。数据库作为最基础的服务设施,需要达到数据零丢失、服务零间断等标准才能在最极端的环境下满足业务最苛刻的需求。为满足双零需求,在设计上,数据库架构多采用异地多活的部署模式:将数据库系统跨越一定的物理距离部署在多个地域,要求多个地域内的数据保持一致,并在某个地域发生故障时可以切换到另外一个可用域,且该切换要做到数据不丢失、应用无感知。同城三中心、跨城五副本等架构正逐渐成为业务标配。在这些需求下,云数据库不但要做到地域内的多节点和多副本,更要支持跨区域的多点复制、迁移和服务功能。

为了解决跨地域高可用的强需求,全球跨地域部署的强一致高可用解决方案不断涌现。 PolarDB 推出了全球数据库(PolarDB Global Database Network,PolarDB-GDN)解决方案,目前已覆盖全球 10 余个地域。PolarDB-GDN 主要解决了跨地域的数据读写问题和高网络延迟下的数据同步问题。全球数据库内的主集群与只读集群间采用了高速并行物理复制的技术,所有集群间的数据都保持同步,且在全球范围内的延迟控制在2秒之内,这大大降低了非中心区域应用访问的读取延迟。

Serverless 及多租户技术

云原生数据库的一个特点是能够提供按需分配的资源。随着资源的完全池化,整个数据中心(甚至多个数据中心)相当于现在的一台物理机,上面只有一个多租户的云原生数据库,每个用户都可以不受限制地扩展其读写能力:一个用户可以瞬间使用大量 CPU 或内存资源支撑起业务高峰。因为所有资源的完全池化,CPU、内存、存储使用率均可达到较高水平,所有资源都按量计费,相同的服务器资源可以支撑更多的用户业务,从而提升产品的竞争力。

HTAP

传统的企业数据库系统根据其主要功能和性能不同,可分为 OLTP(OnLine Transaction Processing,联机事物处理)系统和 OLAP(OnLine Analytic Processing,联机分析处理)系统。在传统数据库架构中,OLTP 数据库和 OLAP 数据库是完全分离的。随着新业务需求的不断衍生,OLTP 数据库往往还需要具备执行一些分析类 SQL 查询的能力。对分析需求不高的业务,企业可以节约极大的数据库成本。兼具 OLTP 和 OLAP 能力的 HTAP(Hybrid Transaction/Analytical Processing,混合事务/分析处理)系统已成为数据库发展的重要趋势。目前,越来越多主流的 OLTP 数据库加强了其执行复杂 SQL 的能力。可以预见,OLTP 数据库将持续在执行框架、数据格式、副本形态、软硬件设计等方面加强执行复杂分析 SQL 的能力,成为兼具 OLTP 和 OLAP 能力的 HTAP 数据库。

3、云原生多模数据库

随着业务的不断多样化,应用对于数据的多类型处理能力提出了新的要求,而传统多套系统组合解决方案又具有架构复杂、维护成本高、起步门槛高等痛点,使得企业对于数据库系统提供多模能力的诉求越发凸显。

为了适应不断演进的业务需求,云原生 NoSQL 数据库必须具备多模的能力,成为云原生多模数据库:实现一种数据库服务多种数据模型的能力,并内置数据模型的转化与统一的访问语言。

主流 NoSQL 多模数据库的实现方式通常是先将数据模型抽象为 KV 数据,再由 KV 数据通过存储引擎存储于硬件介质之上。以 KV 数据抽象为基础实现多模能力,工程复杂度低,但对于时序或者图这类具备显著数据特征的数据模型来说,却不能最大程度地发挥其能力优势。

4、数据库安全

数据安全是企业的生命线,而数据库又是对最核心数据进行计算和存储的部分,所以数据库在企业中通常处于最核心的位置。从机房、网络、服务器、数据交换设备、操作系统、应用程序到数据库自身,数据库所处的环境异常复杂,安全隐患非常多。在传统线下环境中,要想完整建设如此多环节的安全体系,从成本、可运维性、稳定性角度而言,所面临的挑战非常大。同时,安全能力的迭代和运营也需要持续进行,稍有不慎就会导致数据泄露和数据破坏的问题发生。

随着云原生数据库的普及,数据库安全机制云原生化的需求日益强烈。相比传统云下数据中心,云原生安全体系具有开箱即用、可弹性伸缩、自动进化与修复的能力。从安全漏洞、数据破坏等角度出发,云原生保护能力比传统线下基于边界的安全形态更有优势。云原生数据库在敏感数据加密能力上提供了全链路端到端的加密手段,以针对服务面和控制面的内外部人员操作进行全面的访问授权、审计和监测,对审计日志提供基于区块链技术的防篡改能力,使云原生数据库更加安全与可信。

相关文章:

探索云原生数据库技术:构建高效可靠的云原生应用

数据库是应用开发中非常重要的组成部分,可以进行数据的存储和管理。随着企业业务向数字化、在线化和智能化的演进过程中,面对指数级递增的海量存储需求和挑战以及业务带来的更多的热点事件、突发流量的挑战,传统的数据库已经很难满足和响应快…...

Jmeter+Ant+Git/SVN+Jenkins实现持续集成接口测试,一文精通(一)

前言 Jmeter,Postman一些基本大家相比都懂。那么真实在项目中去使用,又是如何使用的呢?本文将一文详解jmeter接口测试 一、接口测试分类 二、目前接口架构设计 三、市面上的接口测试工具 四、Jmeter简介,安装,环境…...

CSAPP Malloc lab

CSAPP Malloc Lab 目标 实现一个简单的动态存储分配器。 评分标准 空间利用率应当减少internal 和 external fragmentation. memory utilization memory utilization payload / heap size fragmentation internal fragmentation external fragmentation throughput T 越接…...

(黑马出品_06)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式

(黑马出品_06)SpringCloudRabbitMQDockerRedis搜索分布式 微服务技术ES搜索和数据分析 今日目标1. 查询文档1.1.DSL查询分类1.2.全文检索查询1.2.1.使用场景1.2.2.基本语法1.2.3.示例 1.3.精准查询1.3.1.term查询1.3.2.ran…...

算法学习之动态规划DP——背包问题

一、01背包问题 (一)题目 有 N 件物品和一个容量是 V的背包。每件物品只能使用一次。 第i件物品的体积是 vi,价值是 wi。 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。 输出最大价值…...

LeetCode刷题日志-17.电话号码的字母组合

纯暴力解法&#xff0c;digits有多长&#xff0c;就循环多少次进行字母组合 class Solution {public List<String> letterCombinations(String digits) {List<String> reslut new ArrayList<>();if(digits.equals(""))return reslut;Map<Inte…...

选修-单片机作业第1/2次

第一次作业 第二次作业 1、51 系列单片机片内由哪几个部分组成&#xff1f;各个部件的最主要功能是什么&#xff1f; 51系列单片机的内部主要由以下几个部分组成&#xff0c;每个部件的主要功能如下&#xff1a; 1. **中央处理器&#xff08;CPU&#xff09;**&#xff1a;这是…...

微信小程序开发系列(十七)·事件传参·mark-自定义数据

目录 步骤一&#xff1a;按钮的创建 步骤二&#xff1a;按钮属性配置 步骤三&#xff1a;添加点击事件 步骤四&#xff1a;参数传递 步骤五&#xff1a;打印数据 步骤六&#xff1a;获取数据 步骤七&#xff1a;父进程验证 总结&#xff1a;data-*自定义数据和mark-自定…...

企业战略管理 找准定位 方向 使命 边界 要干什么事 要做多大的生意 资源配置投入

AI突破千行百业&#xff0c;也难打破护城河 作为每个企业或个人的立命生存之本&#xff0c;有的企业在某个领域长期努力筑起了高高的护城河。 战略是什么&#xff1f;用处&#xff0c;具体内容 企业战略是指企业为了实现长期目标&#xff0c;制定的总体规划和长远发展方向。…...

记录西门子:IO隔离SCL编程

在PLC变量中创建IO输入输出 在PLC类型中创建输入和输出&#xff0c;并将PLC变量的输入输出名称复制过来 创建一个FC块或者FB块 创建一个DB块 MAIN主程序中&#xff1a;...

微信小程序如何实现下拉刷新

1.首先在你需要实现下拉刷新页面的json文件中写入"enablePullDownRefresh": true。 2.在js文件的onPullDownRefresh() 事件中实现下拉刷新。 实现代码 onPullDownRefresh() {console.log(开始下拉刷新)wx.showNavigationBarLoading()//在标题栏中显示加载图标this.d…...

React-useEffect

1.概念 说明&#xff1a;用于在React组件中创建不是由事件引起而是由渲染本身引起的操作&#xff0c;比如发送 A列AX请求&#xff0c;更改DOM等。 2.案例 // useEffect用于组件不是由事件引起的而是由渲染本身引起的操作&#xff0c;如ajax,更改Dom等。 import { useEffect,…...

web蓝桥杯真题:展开你的扇子

代码&#xff1a; /*TODO&#xff1a;请补充 CSS 代码*/#box:hover #item7 {transform: rotate(10deg); } #box:hover #item6 {transform: rotate(-10deg); } #box:hover #item8 {transform: rotate(20deg); } #box:hover #item5 {transform: rotate(-20deg); } #box:hover #i…...

阿里P9大佬分享:如何让代码更加灵活

面试官: 你好&#xff0c;今天我们要讨论的是命令模式。首先&#xff0c;你能解释一下什么是命令模式吗&#xff1f; 求职者: 当然可以。命令模式是一种行为设计模式&#xff0c;它将一个请求封装成一个对象&#xff0c;从而让你使用不同的请求、队列或者日志请求来参数化其他…...

SpringBoot中加载配置文件的优先级

在Spring Boot中&#xff0c;加载配置文件的优先级按照以下顺序进行&#xff0c;后续的配置会覆盖之前的配置&#xff1a; 默认属性&#xff1a;这些属性在Spring Boot本身中定义&#xff0c;并且通常是不可变的。它们作为后备值。 应用程序属性&#xff1a;这些属性在应用程序…...

Mysql命令行客户端

命令行客户端 操作数据库操作数据表 操作数据库 mysql> create database mike charsetutf8; Query OK, 1 row affected (0.01 sec) mysql> show databases; -------------------- | Database | -------------------- | information_schema | | mike …...

开源的python 游戏开发库介绍

本文将为您详细讲解开源的 Python 游戏开发库&#xff0c;以及它们的特点、区别和应用场景。Python 社区提供了多种游戏开发库&#xff0c;这些库可以帮助您在 Python 应用程序中实现游戏逻辑、图形渲染、声音处理等功能。 1. Pygame 特点 - 基于 Python 的游戏开发库。…...

批量提取PDF指定区域内容到 Excel 以及根据PDF里面第一页的标题来批量重命名-附思路和代码实现

首先说明下&#xff0c;PDF需要是电子版本的&#xff0c;不能是图片或者无法选中的那种。 需求1&#xff1a;假如我有一批数量比较多的同样格式的PDF电子文档&#xff0c;需要把特定多个区域的数字或者文字提取出来 需求2&#xff1a;我有一批PDF文档&#xff0c;但是文件的名…...

PCM会重塑汽车OTA格局吗(1)

目录 1.汽车OTA概述 2.ST如何考虑OTA&#xff1f; 2.1 Stellar四大亮点 2.2 PCM技术视角下的OTA 3.小结 1.汽车OTA概述 随着智能网联汽车的飞速发展&#xff0c;汽车OTA也越来越盛行&#xff1b; 目前来讲OTA分为FOTA和SOTA(Software-over-the-air)两种&#xff0c;区别…...

Intel® Extension for PyTorch*详细安装教程

最近在研究Intel的pytorch的加速拓展Intel Extension for PyTorch*,但是发现官网的文档全是英文的&#xff0c;不太好找安装教程。所以特此分享Intel Extension for PyTorch*的详细安装教程。 文章目录 一、安装所需系统要求1.1 硬件需求1.2 软件需求 二、准备2.1 安装驱动程序…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...