1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        SpringBoot + ShardingSphere 秒級(jí)分庫(kù)分表!

        共 5318字,需瀏覽 11分鐘

         ·

        2022-01-21 03:56

        Spring Boot 作為主流微服務(wù)框架,擁有成熟的社區(qū)生態(tài)。市場(chǎng)應(yīng)用廣泛,為了方便大家,整理了一個(gè)基于spring boot的常用中間件快速集成入門(mén)系列手冊(cè),涉及RPC、緩存、消息隊(duì)列、分庫(kù)分表、注冊(cè)中心、分布式配置等常用開(kāi)源組件,大概有幾十篇文章,陸續(xù)會(huì)開(kāi)放出來(lái),感興趣同學(xué)請(qǐng)?zhí)崆瓣P(guān)注&收藏

        互聯(lián)網(wǎng)高速發(fā)展,同時(shí)也帶來(lái)的海量數(shù)據(jù)存儲(chǔ)問(wèn)題。傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)的單庫(kù)單表已經(jīng)很難支撐,如何高效存儲(chǔ)和訪(fǎng)問(wèn)這些數(shù)據(jù),成為業(yè)內(nèi)急需解決的問(wèn)題。解決思路有兩個(gè)方向:

        • NoSQL數(shù)據(jù)庫(kù),非關(guān)系型數(shù)據(jù)庫(kù),天然集成了類(lèi)似分布式分片的功能,支持海量數(shù)據(jù)存儲(chǔ),但是不具備事務(wù)管理
        • 分庫(kù)分表,對(duì)多個(gè)單庫(kù)單表資源整合,并配備資源調(diào)度模塊,從而形成一個(gè)具有海量數(shù)據(jù)儲(chǔ)存的邏輯表。

        今天我們主要介紹,如何基于Springboot快速集成分庫(kù)分表框架,盡量做到開(kāi)箱即用

        當(dāng)然除了ShardingSphere之外,還有其他分庫(kù)分表框架,如:CobarMyCat

        ShardingSphere介紹

        ShardingSphere 是一套開(kāi)源的分布式數(shù)據(jù)庫(kù)中間件解決方案組成的生態(tài)圈,它由 3 款相互獨(dú)立,卻又能夠混合部署配合使用的產(chǎn)品組成。它們均提供標(biāo)準(zhǔn)化的數(shù)據(jù)分片、分布式事務(wù)和數(shù)據(jù)庫(kù)治理功能

        ShardingSphere 由三個(gè)子項(xiàng)目組成,形成一個(gè)完整的數(shù)據(jù)庫(kù)解決方案。

        1、ShardingSphere-JDBC:定位為輕量級(jí) Java 框架,在 Java 的 JDBC 層提供額外服務(wù)。它使用客戶(hù)端直連數(shù)據(jù)庫(kù),以 jar 包形式提供服務(wù),無(wú)需額外部署和依賴(lài),可理解為增強(qiáng)版的 JDBC 驅(qū)動(dòng),完全兼容 JDBC 和各種 ORM 框架。

        適用于任何基于Java的ORM框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template或直接使用JDBC?;谌魏蔚谌降臄?shù)據(jù)庫(kù)連接池,如:DBCP, C3P0, BoneCP, Druid, HikariCP等。支持任意實(shí)現(xiàn)JDBC規(guī)范的數(shù)據(jù)庫(kù)。目前支持MySQL,Oracle,SQLServer和PostgreSQL。

        2、ShardingSphere-Proxy:定位為透明化的數(shù)據(jù)庫(kù)代理端,提供封裝了數(shù)據(jù)庫(kù)二進(jìn)制協(xié)議的服務(wù)端版本,用于完成對(duì)異構(gòu)語(yǔ)言的支持。目前提供 MySQL/PostgreSQL 版本,它可以使用任何兼容 MySQL/PostgreSQL 協(xié)議的訪(fǎng)問(wèn)客戶(hù)端操作數(shù)據(jù),對(duì) DBA 更加友好。

        3、ShardingSphere-Sidecar(規(guī)劃中):定位為 Kubernetes 的云原生數(shù)據(jù)庫(kù)代理,以 Sidecar 的形式代理所有對(duì)數(shù)據(jù)庫(kù)的訪(fǎng)問(wèn)。通過(guò)無(wú)中心、零侵入的方案提供與數(shù)據(jù)庫(kù)交互的的嚙合層,即 Database Mesh,又可稱(chēng)數(shù)據(jù)網(wǎng)格。

        優(yōu)勢(shì):

        • 解決方案完備性,它集客戶(hù)端分片、代理服務(wù)器,以及分布式數(shù)據(jù)庫(kù)的核心功能于一身。

        • 開(kāi)發(fā)友好性,提供了友好的集成方式,業(yè)務(wù)開(kāi)發(fā)人員只需要引入一個(gè) JAR 包就能在業(yè)務(wù)代碼中嵌入數(shù)據(jù)分片、讀寫(xiě)分離、分布式事務(wù)、數(shù)據(jù)庫(kù)治理等一系列功能。

        • 可插拔的系統(tǒng)擴(kuò)展性:它的很多核心功能均通過(guò)插件的形式提供,供開(kāi)發(fā)者排列組合來(lái)定制屬于自己的獨(dú)特系統(tǒng)。

        項(xiàng)目示例

        首先,新建一個(gè)工程spring-boot-bulking-sharding-sphere,在pom.xml 文件中添加分庫(kù)分表的 starter 依賴(lài)包


        ????org.apache.shardingsphere
        ????sharding-jdbc-spring-boot-starter
        ????4.0.0-RC1

        數(shù)據(jù)環(huán)境準(zhǔn)備

        分別創(chuàng)建兩個(gè)數(shù)據(jù)庫(kù)ds0、ds1,在ds0數(shù)據(jù)庫(kù)中創(chuàng)建 user_0、user_2兩張用戶(hù)表

        CREATE?TABLE?`user_0`?(
        ??`id`?bigint(20)?NOT?NULL?AUTO_INCREMENT,
        ??`user_name`?varchar(128)?NOT?NULL?DEFAULT?''?COMMENT?'用戶(hù)名',
        ??`age`?int(11)?NOT?NULL??COMMENT?'年齡',
        ??`address`?varchar(128)?COMMENT?'地址',
        ???PRIMARY?KEY?(`id`)
        )?ENGINE=InnoDB??DEFAULT?CHARSET=utf8mb4?COMMENT='用戶(hù)表';

        CREATE?TABLE?`user_2`?(
        ??`id`?bigint(20)?NOT?NULL?AUTO_INCREMENT,
        ??`user_name`?varchar(128)?NOT?NULL?DEFAULT?''?COMMENT?'用戶(hù)名',
        ??`age`?int(11)?NOT?NULL??COMMENT?'年齡',
        ??`address`?varchar(128)?COMMENT?'地址',
        ???PRIMARY?KEY?(`id`)
        )?ENGINE=InnoDB??DEFAULT?CHARSET=utf8mb4?COMMENT='用戶(hù)表';

        在ds1數(shù)據(jù)庫(kù)中創(chuàng)建 user_1user_3兩張用戶(hù)表

        CREATE?TABLE?`user_1`?(
        ??`id`?bigint(20)?NOT?NULL?AUTO_INCREMENT,
        ??`user_name`?varchar(128)?NOT?NULL?DEFAULT?''?COMMENT?'用戶(hù)名',
        ??`age`?int(11)?NOT?NULL??COMMENT?'年齡',
        ??`address`?varchar(128)?COMMENT?'地址',
        ???PRIMARY?KEY?(`id`)
        )?ENGINE=InnoDB??DEFAULT?CHARSET=utf8mb4?COMMENT='用戶(hù)表';

        CREATE?TABLE?`user_3`?(
        ??`id`?bigint(20)?NOT?NULL?AUTO_INCREMENT,
        ??`user_name`?varchar(128)?NOT?NULL?DEFAULT?''?COMMENT?'用戶(hù)名',
        ??`age`?int(11)?NOT?NULL??COMMENT?'年齡',
        ??`address`?varchar(128)?COMMENT?'地址',
        ???PRIMARY?KEY?(`id`)
        )?ENGINE=InnoDB??DEFAULT?CHARSET=utf8mb4?COMMENT='用戶(hù)表';

        我們采用Mybatis作為ORM框架,遵循Mybatis的開(kāi)發(fā)流程,首先需要定義業(yè)務(wù)實(shí)體類(lèi)User,Mapper接口類(lèi)文件,以及對(duì)應(yīng)的sql語(yǔ)句的xml文件。

        @Mapper
        public?interface?UserMapper?{

        ????Long?addUser(User?user);

        ????List?queryAllUser();

        ????User?queryUserById(Long?id);

        ????Page?querUserByPage();
        }

        Spring boot 框架最為閃亮的設(shè)計(jì)就是約定勝于配置,廢棄了之前繁瑣的xml形式定義Bean實(shí)例,將一系列框架的配置項(xiàng)遷移到 application.properties 中,借助 EnableAutoConfiguration自動(dòng)完成裝載,并實(shí)例化相應(yīng)的Bean實(shí)例到 spring 容器中,IOC統(tǒng)一管理。

        針對(duì)兩個(gè)數(shù)據(jù)庫(kù)初始化兩個(gè)DataSource對(duì)象,這兩個(gè) DataSource 對(duì)象將組成一個(gè) Map 并傳遞給ShardingDataSourceFactory 工廠(chǎng)類(lèi),application.properties 配置文件:

        server.port=8090
        application.name=spring-boot-bulking-sharding-sphere
        mybatis.config-location=classpath:config/mybatis-config.xml
        spring.shardingsphere.datasource.names=ds0,ds1

        #?數(shù)據(jù)源
        spring.shardingsphere.datasource.ds0.type=com.alibaba.druid.pool.DruidDataSource
        spring.shardingsphere.datasource.ds0.driver-class-name=com.mysql.jdbc.Driver
        spring.shardingsphere.datasource.ds0.url=jdbc:mysql://localhost:3306/ds0?characterEncoding=utf-8
        spring.shardingsphere.datasource.ds0.username=root
        spring.shardingsphere.datasource.ds0.password=111111
        spring.shardingsphere.datasource.ds1.type=com.alibaba.druid.pool.DruidDataSource
        spring.shardingsphere.datasource.ds1.driver-class-name=com.mysql.jdbc.Driver
        spring.shardingsphere.datasource.ds1.url=jdbc:mysql://localhost:3306/ds1?characterEncoding=utf-8
        spring.shardingsphere.datasource.ds1.username=root
        spring.shardingsphere.datasource.ds1.password=111111

        搞定數(shù)據(jù)源后,接下來(lái)我們需要設(shè)置分庫(kù)、分表策略。

        #?不分表(application.properties沒(méi)有為表單獨(dú)配置),默認(rèn)數(shù)據(jù)源策略
        spring.shardingsphere.sharding.default-data-source-name=ds1

        #?user表的分表配置
        spring.shardingsphere.sharding.tables.user.actual-data-nodes=ds0.user_$->{[0,2]},ds1.user_$->{[1,3]}
        #?user庫(kù)策略(也可以采用默認(rèn)的)
        spring.shardingsphere.sharding.tables.user.database-strategy.inline.sharding-column=id
        spring.shardingsphere.sharding.tables.user.database-strategy.inline.algorithm-expression=ds$->{id?%?2}
        #?user表策略
        spring.shardingsphere.sharding.tables.user.table-strategy.inline.sharding-column=id
        spring.shardingsphere.sharding.tables.user.table-strategy.inline.algorithm-expression=user_$->{id?%?4}
        #spring.shardingsphere.sharding.tables.user.key-generator.column=id
        #spring.shardingsphere.sharding.tables.user.key-generator.type=SNOWFLAKE

        在 ShardingSphere 中存在一組 ShardingStrategyConfiguration,這里使用的是基于行表達(dá)式的 InlineShardingStrategyConfiguration。

        InlineShardingStrategyConfiguration包含兩個(gè)參數(shù),一個(gè)是指定分片列名稱(chēng)的 shardingColumn,另一個(gè)是指定分片算法行表達(dá)式的 algorithmExpression。上面的示例,將基于 id 列對(duì) 2 的取模值來(lái)確定數(shù)據(jù)應(yīng)該存儲(chǔ)在哪一個(gè)數(shù)據(jù)庫(kù)中

        我們對(duì)user表做了分庫(kù)分表,拆分成4個(gè)表,并分別歸屬到兩個(gè)庫(kù)中。分表鍵是id字段。

        通過(guò)單元測(cè)試,插入 10條用戶(hù)記錄,驗(yàn)收下數(shù)據(jù)的插入情況~

        @Test
        public?void?addUser()?{
        ????for?(long?i?=?1;?i?????????User?user?=?User.builder().id(i).userName("TomGE").age(29).address("杭州").build();
        ????????userMapper.addUser(user);
        ????????System.out.println("插入用戶(hù)成功,uid="?+?user.getId());
        ????}

        }

        其中id=4,id=8 兩條記錄,插入到ds0庫(kù)的user_0表中。

        項(xiàng)目源碼

        https://github.com/aalansehaiyang/spring-boot-bulking??

        模塊:spring-boot-bulking-sharding-sphere


        熱衷于收集高并發(fā)、系統(tǒng)架構(gòu)、微服務(wù)、消息中間件、 RPC框架、高性能緩存、搜索、分布式數(shù)據(jù)框架、分布式協(xié)同服務(wù)、分布式配置中心、中臺(tái)架構(gòu)、領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)、系統(tǒng)監(jiān)控、系統(tǒng)穩(wěn)定性等技術(shù)知識(shí)。

        瀏覽 102
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            我把护士日出水90分视频 | 天天干精品 | 高潮太爽日本产无人区 | 97日逼| 久久99网站 | 中文字幕一区二区人妻电影 | 色综合激情 | 伊人成人在线视频观看 | 91丨豆花丨国产极品 | 亚洲精品AA|