色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

數據庫的中間件有啥用?

數據分析與開發 ? 來源:Coder的技術之路 ? 作者:Coder的技術之路 ? 2021-06-21 16:16 ? 次閱讀

Part1 數據庫中間件有啥用

有一天,你去三亞玩耍,就想玩個沖浪,即時你不差錢,難道還要自己采買快艇、滑板等等裝備來滿足這為數不多的心血來潮么。租一個就行了嘛。這其實就是連接池的作用。

數據庫中間件可以理解為是一種具有連接池功能,但比連接池更高級的、帶很多附加功能的輔助組件,不僅可以租沖浪板,還可以提供地點推薦、上保險等等各類服務。

從網上的資料看,zdal應該算是半開源的,好像是之前開源過,但后續沒有準備維護,然后就刪除了,不過github被fork下來好多,隨便一搜就是一片,當前,只是老的版本。目前螞蟻內部的zdal好像已經更新到zdal5了吧,那咱可就看不到了。

越復雜的系統,數據庫中間件的作用越大。就拿zdal來說,它提供分庫分表,結果集合并,sql解析,數據庫failover動態切換等數據訪問層統一解決方案。下面就一起來看下,其內部實現是怎么樣的。

Part2 架構剖析之高屋建瓴

c87433b8-d145-11eb-9e57-12bb97331649.png

2.1 整體概述

如上圖所示,zdal有四個重要的組成部分:

價值體現--客戶端Client包。對外暴露基本操作接口,用于業務層簡單黑盒的操作數據源;業務只和client交互,動態切換/路由等邏輯只需要進行規則配置,相關邏輯由zdal實現。

核心功能--連接管理datasource包。最核心的能力,提供多種類型數據庫的連接管理;不管功能多花哨,最終目的還是為了解決數據庫連接的問題。

關鍵能力--SQL解析parser包。基礎SQL解析能力;解析sql類型、字段名稱、數據庫等等,配合規則進行路由

擴展能力--庫表路由rule包。根據parser解析出的字段確定邏輯庫表和物理庫表。

2.2 組件圖看架構

組件圖對整體架構和各組件及相互聯系的理解可以起到很好的幫助。一個簡版的組件圖畫了好久,還有不少錯,不過大概是這么個意思,哎,基本功要丟~

c8833368-d145-11eb-9e57-12bb97331649.png

對照上圖可以比較清晰的看到:

Client包對應用層暴露的數據源、負責監聽配置動態變更的監聽組件、負責加載組織各部分的配置組件、負責加載spring bean 和庫表規則的配置組件;

Client中加載了規則組件,實現邏輯表和數據庫的路由規則。

Client中的庫表配置調用datasource中的數據源管理服務并構建連接池的連接池;

Client中的SqlDispatcher服務調用SQL解析組件實現SQL解析。

Part3 細節剖析之一葉知秋

3.1 配置加載和bean初始化

大部分情況下,我們使用如mybatis這樣的ORM框架來進行數據庫操作,其實不管是ORM還是其他方式,應用層都需要對數據源進行配置。

所以,client對外暴露了一個符合JDBC標準的datasource數據源,用來滿足應用層ORM等框架配置數據源的要求--ZdalDataSource

c89b1afa-d145-11eb-9e57-12bb97331649.png

//只提供了一個init方法,這也是spring啟動時時,必須要調用的初始化方法,所有功能,都從這里開始
public class ZdalDataSource extends AbstractZdalDataSource implements DataSource{
    public void init() {
        try {
            super.initZdalDataSource();
        } catch (Exception e) {
            CONFIG_LOGGER.error("...");
            throw new ZdalClientException(e);
        }
    }

ZdalDataSource#init()方法即為配置加載的核心入口,init中負責加載spring配置,根據配置初始化數據源,并創建連接池,同時,將邏輯表和物理庫的對應關系都維護起來供后續路由調用。

/*父類的init方法*/
protected void initZdalDataSource() {
    /*用FileSystemXmlApplicationContext方式加載配置文件中的數據源和規則,轉化成zdalConfig對象*/
    this.zdalConfig = ZdalConfigurationLoader.getInstance().getZdalConfiguration(appName,dbmode, appDsName, configPath);
    this.dbConfigType = zdalConfig.getDataSourceConfigType();
   this.dbType = zdalConfig.getDbType();
   //初始化數據源
   this.initDataSources(zdalConfig);
   this.inited.set(true);
    }
}

從上面的類圖和這里的兩個入口方法大概了解到zdal配置加載的啟動流程。下面我們就來詳細看一下,讀寫分離和分庫分表的規則是怎么被加載,怎么起作用的。

3.2 細說讀寫分離

讀寫分離配置的加載

首先,我們需要有數據源的相關配置,如下圖:

c8b7a6b6-d145-11eb-9e57-12bb97331649.png

此XML配置會在init方法被調用時,被初始化,解析成ZdalConfig類的屬性,ZdalConfig類的主要成員見下面代碼:

public class ZdalConfig {
    /** key=dsName;value=DataSourceParameter 所有物理數據源的配置項,比如用戶名,密碼,庫名等 */
    private Map dataSourceParameters = new ConcurrentHashMap();
    /** 邏輯數據源和物理數據源的對應關系:key=logicDsName,value=physicDsName */
    private Map              logicPhysicsDsNames  = new ConcurrentHashMap();
    /** 數據源的讀寫規則,比如只讀,或讀寫等配置*/
    private Map              groupRules           = new ConcurrentHashMap();
    /** 異常轉移的數據源規則*/
    private Map              failoverRules        = new ConcurrentHashMap();
    //一份完整的讀寫分離和分庫分表規則配置
    private AppRule                          appRootRule;

可以看到,xml中的規則,被解析到xxxRules里。這里以groupRules為例,failover同理。

下一步則是通過解析得到的zdalConfig 來初始化數據源:

protected final void initDataSources(ZdalConfig zdalConfig) {
    //DataSourceParameter中存的是數據源參數,如用戶名密碼,最大最小連接數等
    for (Entry entry : zdalConfig.getDataSourceParameters().entrySet()) {
        try {
           //初始化連接池
           ZDataSource zDataSource = new ZDataSource(/*設置最大最小連接數*/createDataSourceDO(entry.getValue(),zdalConfig.getDbType(), appDsName + "." + entry.getKey()));
           this.dataSourcesMap.put(entry.getKey(), zDataSource);
        } catch (Exception e) {
            //...
        }
   }
  //其他分支略,只看最簡單的分組模式
  if (dbConfigType.isGroup()) {
       //讀寫配置賦值
       this.rwDataSourcePoolConfig = zdalConfig.getGroupRules();
       //初始化多份讀庫下的負載均衡
       this.initForLoadBalance(zdalConfig.getDbType());
  }
  //注冊監聽:為了滿足動態切換
  this.initConfigListener();
}

initForLoadBalance的方法如下:

private void initForLoadBalance(DBType dbType) {
    Map dsSelectors = this.buildRwDbSelectors(this.rwDataSourcePoolConfig);
    this.runtimeConfigHolder.set(new ZdalRuntime(dsSelectors));
    this.setDbTypeForDBSelector(dbType);
}

可以看到,首先構建出了DB選擇器,然后賦值給了runtimeConfigHolder供運行時獲取。而構建DB選擇器的時候,其實是按讀寫兩個維度,把所有數據源都構建了一遍,即group_r和group_w下都包含5個數據源,只不過各自的權重不一樣:

//比如按上面的配置寫庫只有一個,但是也會包含全數據源

group_0_w_0 :< bean:read0DataSource , writeWeight:0>
group_0_w_1 :< bean:writeDataSource , writeWeight:10>
group_0_w_2 :< bean:read1DataSource , writeWeight:0>
group_0_w_3 :< bean:read2DataSource , writeWeight:0>
group_0_w_4 :< bean:read3DataSource , writeWeight:0>

//上述就是寫相關的DBSelecter的內容。

讀寫分離怎么起作用

以delete為例,更新刪除是要操作寫庫的

 public void delete(ZdalDataSource dataSource) {
     String deleteSql = "delete from test";
     Connection conn = null;
     PreparedStatement pst = null;
     try {
        conn = dataSource.getConnection();
        pst = conn.prepareStatement(deleteSql);
        pst.execute();
     } catch (Exception e) {
            //...
     } finally {
           //資源關閉
     }
 }

getConnection會從上文中提到的runtimeConfigHolder中獲取DBSelecter,然后執行execute方法

 public boolean execute() throws SQLException {
    SqlType sqlType = getSqlType(sql);
    // SELECT相關的就選擇group_r對應的DBSelecter
   if (sqlType == SqlType.SELECT || sqlType == SqlType.SELECT_FOR_UPDATE|| sqlType == SqlType.SELECT_FROM_DUAL) {
     //略
    return true;
    //update/delete相關的就選擇group_w對應的DBSelecter
  } else if (sqlType == SqlType.INSERT || sqlType == SqlType.UPDATE|| sqlType == SqlType.DELETE) {
       if (super.dbConfigType == DataSourceConfigType.GROUP) {
           executeUpdate0();
       } else {
           executeUpdate();
      }
      return false;
  } 
}

如果是讀取相關的,那就選_r的DBSelecter,如果是寫相關的,那就選_W的DBSelecter。那么executeUpdate0中是怎么執行區分讀寫數據源的呢,其實就是把這一組的數據源根據權重篩選一遍。

// WeightRandom#select(int[], java.lang.String[])
private String select(int[] areaEnds, String[] keys) {
   //這里的areaEnds數組,是一個累加范圍值數據
   //比如三個庫權重    10   9   8
   //那么areaEnds就是  10  19  27 是對每個權重的累加,最后一個值是總和
   int sum = areaEnds[areaEnds.length - 1];
   //這樣隨機出來的數,是符合權重分布的
   int rand = random.nextInt(sum);
   for (int i = 0; i < areaEnds.length; i++) {
       if (rand < areaEnds[i]) {
           return keys[i];
   }
   return null;
}

Part4 總結

本篇文章,把阿里數據庫中間件相關的組件和加載流程進行了總結,就一個最基本的分組讀寫分離的流程,對內部實現進行了闡述。說是解析,其實是提供給大家一種閱讀的思路,畢竟篇幅有限,如果對中間件感興趣的同學,可以fork下代碼,按上述邏輯自己閱讀下。

看源碼時,比如dubbo這些中間件其實是比較容易入手的,因為他們都依托于Spring進行JavaBean的裝載,所有,對Spring容器暴露的那些init、load方法,就是很好的切入點。個人思路,希望對大家有所幫助。

責任編輯:lq6

,>,>,>,>,>,>,>,>,>,>
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 中間件
    +關注

    關注

    0

    文章

    65

    瀏覽量

    18282
  • 數據庫
    +關注

    關注

    7

    文章

    3868

    瀏覽量

    65005

原文標題:一款優秀數據庫中間件的不完全解析

文章出處:【微信號:DBDevs,微信公眾號:數據分析與開發】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    中間件全球數據實時同步利器,華為云 EventGrid 事件流重磅發布

    【摘要】 華為云 EventGrid 事件流(簡稱 EG)作為易用、穩定、高效的數據同步管道連接不同的系統與服務,支持中間件數據在線實時同步。事件流圍繞云中間件,降低了中間件之間
    的頭像 發表于 10-31 18:39 ?373次閱讀
    <b class='flag-5'>中間件</b>全球<b class='flag-5'>數據</b>實時同步利器,華為云 EventGrid 事件流重磅發布

    數據庫數據恢復—通過拼接數據庫碎片恢復SQLserver數據庫

    一個運行在存儲上的SQLServer數據庫1000多個文件,大小幾十TB。數據庫每10天生成一個NDF文件,每個NDF幾百GB大小。數據庫包含兩個LDF文件。 存儲損壞,
    的頭像 發表于 10-31 13:21 ?399次閱讀
    <b class='flag-5'>數據庫</b><b class='flag-5'>數據</b>恢復—通過拼接<b class='flag-5'>數據庫</b>碎片恢復SQLserver<b class='flag-5'>數據庫</b>

    數據庫數據恢復—SQL Server數據庫出現823錯誤的數據恢復案例

    SQL Server數據庫故障: SQL Server附加數據庫出現錯誤823,附加數據庫失敗。數據庫沒有備份,無法通過備份恢復數據庫
    的頭像 發表于 09-20 11:46 ?464次閱讀
    <b class='flag-5'>數據庫</b><b class='flag-5'>數據</b>恢復—SQL Server<b class='flag-5'>數據庫</b>出現823錯誤的<b class='flag-5'>數據</b>恢復案例

    軟件系統數據庫的分庫分表設計

    軟件系統數據庫的分庫分表設計 系統讀寫分離、分庫分表技術實現采用MyCat中間件,MyCat 是一款開源(遵循 Apache License 2.0 協議)的大數據庫集群中間件,用于搭
    的頭像 發表于 08-22 11:39 ?413次閱讀
    軟件系統<b class='flag-5'>數據庫</b>的分庫分表設計

    北京靈奧科技基于亞馬遜云科技打造大模型中間件

    助力企業加速應用生成式AI 北京2024年6月27日?/美通社/ --?北京靈奧科技基于亞馬遜云科技的生成式AI、數據庫和容器等云服務,打造大模型中間件,將基礎模型優勢和企業業務數據無縫結合,打通
    的頭像 發表于 06-27 21:21 ?656次閱讀

    求助,關于USB中間件HID的疑問求解

    protocol * - Usage Page : Generic Desktop * - Usage : Joystick * - Collection : Application 我覺得作為中間件文件,是否應該把這里變的更開放,允許用戶自行去選擇HID的用途
    發表于 05-10 07:51

    一文掌握中間件技術基礎

    ? 中間件(MiddleWare)是提供系統軟件和應用軟件之間連接的軟件,以便于軟件各部件之間的溝通,特別是應用軟件對于系統軟件的集中的邏輯,在現代信息技術應用框架如Web服務、面向服務的體系結構等中應用比較廣泛。
    的頭像 發表于 04-23 14:45 ?509次閱讀
    一文掌握<b class='flag-5'>中間件</b>技術基礎

    求助,關于MDK5中間件network靜態ip手動配置問題

    最近在研究MDK5的自帶的Middleware中間件,其中用到NetWork,ipv4及ipv6各項功能均已調通。發現MDK提供的network并沒有提供供用戶手動修改設備Ip地
    發表于 04-22 08:09

    華玉通軟宣布“海鷗”確定性調度中間件(SEAGULL DS)正式商用

    今天,華玉通軟(下稱“華玉”)宣布“海鷗”確定性調度中間件(SEAGULL DS)正式商用。
    的頭像 發表于 03-17 11:01 ?808次閱讀
    華玉通軟宣布“海鷗”確定性調度<b class='flag-5'>中間件</b>(SEAGULL DS)正式商用

    中創股份成功登陸科創板,引領中間件技術創新

    山東中創軟件商用中間件股份有限公司(簡稱“中創股份”)近日在科創板成功上市,標志著其在國內基礎軟件中間件領域的領先地位得到資本市場認可。
    的頭像 發表于 03-15 17:39 ?970次閱讀

    中間件廠商中創股份成功上市

    近日,國內領先的基礎軟件中間件產品與服務提供商——山東中創軟件商用中間件股份有限公司(以下簡稱“中創股份”)在上海證券交易所科創板上市,股票代碼為“688695”。這一里程碑事件標志著中創股份在基礎軟件中間件領域的實力和影響力得
    的頭像 發表于 03-14 15:25 ?1019次閱讀

    中創股份成功登陸科創板,深耕中間件行業

    3月13日,山東中創軟件商用中間件股份有限公司(以下簡稱“中創股份”)在上海證券交易所科創板成功掛牌上市,標志著這家在中間件領域深耕二十余年的企業迎來了新的發展篇章。
    的頭像 發表于 03-13 15:42 ?799次閱讀

    基礎軟件中間件產品與服務提供商中創股份成功上市

    山東中創軟件商用中間件股份有限公司(股票簡稱:中創股份,股票代碼:688695)今日在上海證券交易所科創板成功上市,開啟了公司發展的新篇章。作為中間件技術標準的主要推動者和制定者,中創股份在中間件
    的頭像 發表于 03-13 14:21 ?860次閱讀

    中創股份科創板成功上市,引領中間件技術新篇章

    中間件產品與服務提供商中創股份近日在上交所科創板成功掛牌上市,這一里程碑事件標志著中創股份在基礎軟件中間件領域的領先地位得到了市場的廣泛認可,并為其未來發展打開了新的篇章。
    的頭像 發表于 03-13 14:13 ?877次閱讀

    國產中間件提供商中創股份上市

    近日,國內中間件領域的領軍企業——山東中創軟件商用中間件股份有限公司(簡稱“中創股份”)在科創板成功上市,這一重要事件標志著中創股份在中間件行業深耕多年后,迎來了嶄新的發展階段。
    的頭像 發表于 03-13 13:49 ?851次閱讀
    主站蜘蛛池模板: 久久无码人妻AV精品一区 | 琪琪see色原网色原网站 | 花蝴蝶在线观看免费中文版高清 | 欧美精品华人在线 | 暖暖 免费 高清 日本视频大全 | 丰满少妇69激懒啪啪无码 | 在线超碰免费视频观看 | 第一次处破女高清电影 | 日久精品不卡一区二区 | 妖精视频一区二区免费 | 久久影院毛片一区二区 | 久久精品亚洲牛牛影视 | AV午夜午夜快憣免费观看 | 全黄H全肉禁乱公 | 日本一二三区视频在线 | 网友自拍区视频精品 | 波多结衣一区二区三区 | 欧美一区二区VA毛片视频 | 国产精品久久久久久日本 | 暗卫受被肉到失禁各种PLAY | 最近中文字幕完整版高清 | 国产精品人妻无码久久久蜜桃 | 日日色在线影院 | 国产精品自产拍在线观看网站 | 超碰97超碰在线视频哦 | 午夜国产高清精品一区免费 | 亚洲 欧美 国产 综合 播放 | 97人妻久久久精品系列A片 | 欧美日韩中文在线字幕视频 | 欧美日韩亚洲中字二区 | md2.pud 麻豆传媒官网 | 暖暖日本大全免费观看 | 久久久91精品国产一区二区 | 日本欧美久久久久免费播放网 | 国产亚洲精品久久无码98 | 羞羞影院男女爽爽影院尤物 | 公粗挺进了我的密道在线播放贝壳 | 亚洲AV國產国产久青草 | 网红刘婷hd国产高清 | 亚洲午夜久久久无码精品网红A片 | 苍井空小公主qvod |