ShardingSphere 使用 ShardingJdbc 與 mybatis plus實現分庫分表及讀寫分離


 本文為博主原創,未經允許不得轉載:

目錄:

  一. 官網及git 地址

  二. Apache ShardingSphere 簡介

  三.spring boot + mybaits plus +sharding jdbc 實現分庫分表及讀寫分離

一. 官網及git 地址

  官網:https://shardingsphere.apache.org/

  git: https://github.com/apache/shardingsphere

  分庫分表,分庫不分表及分表不分庫,讀寫分離等 應用 gitee demohttps://gitee.com/xiangbaxiang/sharding-jdbc

 

二. Apache ShardingSphere 簡介

  Apache ShardingSphere 是一套開源的分布式數據庫解決方案組成的生態圈,它由 JDBC、Proxy 和 Sidecar(規划中)這 3 款既能夠獨立部署,又支持混合部署配合使用的產品組成。 它們均提供標准化的數據水平擴展、分布式事務和分布式治理等功能,可適用於如 Java 同構、異構語言、雲原生等各種多樣化的應用場景。

  Apache ShardingSphere 旨在充分合理地在分布式的場景下利用關系型數據庫的計算和存儲能力,而並非實現一個全新的關系型數據庫。 關系型數據庫當今依然占有巨大市場份額,是企業核心系統的基石,未來也難於撼動,我們更加注重在原有基礎上提供增量,而非顛覆。

  Apache ShardingSphere 5.x 版本開始致力於可插拔架構,項目的功能組件能夠靈活的以可插拔的方式進行擴展。 目前,數據分片、讀寫分離、數據加密、影子庫壓測等功能,以及 MySQL、PostgreSQL、SQLServer、Oracle 等 SQL 與協議的支持,均通過插件的方式織入項目。 開發者能夠像使用積木一樣定制屬於自己的獨特系統。Apache ShardingSphere 目前已提供數十個 SPI 作為系統的擴展點,仍在不斷增加中。

  ShardingSphere 已於2020年4月16日成為 Apache 軟件基金會的頂級項目。

  ShardingSphere-JDBC :定位為輕量級 Java 框架,在 Java 的 JDBC 層提供的額外服務。 它使用客戶端直連數據庫,以 jar 包形式提供服務,無需額外部署和依賴,可理解為增強版的 JDBC 驅動,完全兼容 JDBC 和各種 ORM 框架。

  ShardingSphere-Proxy :定位為透明化的數據庫代理端,提供封裝了數據庫二進制協議的服務端版本,用於完成對異構語言的支持。 目前提供 MySQL 和 PostgreSQL(兼容 openGauss 等基於 PostgreSQL 的數據庫)版本,它可以使用任何兼容 MySQL/PostgreSQL 協議的訪問客戶端

三.spring boot + mybaits plus +sharding jdbc 實現分庫分表及讀寫分離

  3.1 創建spring 項目,並修改pom 文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>sharding-jdbc</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.3.RELEASE</version>
        <relativePath/>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!--mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <!--Mybatis-Plus-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.1.1</version>
        </dependency>
        <!--shardingsphere start-->
        <!-- for spring boot -->
        <dependency>
            <groupId>io.shardingsphere</groupId>
            <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
            <version>3.1.0</version>
        </dependency>
        <!-- for spring namespace -->
        <dependency>
            <groupId>io.shardingsphere</groupId>
            <artifactId>sharding-jdbc-spring-namespace</artifactId>
            <version>3.1.0</version>
        </dependency>
        <!--shardingsphere end-->
        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.8</version>
        </dependency>
    </dependencies>


    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>2.3.2</version>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                        <encoding>utf8</encoding>
                        <compilerArgument>-XDignore.symbol.file=true -Xlint</compilerArgument>
                        <testCompilerArgument>-XDignore.symbol.file=true -Xlint</testCompilerArgument>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <version>2.1.0.RELEASE</version>
                    <executions>
                        <execution>
                            <goals>
                                <goal>repackage</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>

</project>

  3.2 增加實體類:

package com.sharding.entity;

import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("user")
public class User extends Model<User> {

    /**
     * 主鍵Id
     */
    private int id;

    /**
     * 名稱
     */
    private String name;

    /**
     * 年齡
     */
    private int age;
}

  3.3 mapper層

package com.sharding.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.sharding.entity.User;

public interface UserMapper extends BaseMapper<User> {
}

  3.4 service層

package com.sharding.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.sharding.entity.User;

import java.util.List;

public interface UserService extends IService<User> {
    /**
     * 保存用戶信息
     * @param entity
     * @return
     */
    @Override
    boolean save(User entity);

    /**
     * 查詢全部用戶信息
     * @return
     */
    List<User> getUserList()
}

  3.5 service層實現類

package com.sharding.service.impl;

import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.sharding.entity.User;
import com.sharding.mapper.UserMapper;
import com.sharding.service.UserService;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    @Override
    public boolean save(User entity) {
        return super.save(entity);
    }

    @Override
    public List<User> getUserList() {
        return baseMapper.selectList(Wrappers.<User>lambdaQuery());
    }

}

  3.6 controller 層:

package com.sharding.controller;

import com.sharding.entity.User;
import com.sharding.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/select")
    public List<User> select() {
        return userService.getUserList();
    }

    @GetMapping("/insert")
    public Boolean insert(User user) {
        return userService.save(user);
    }
}

  3.7 創建分片數據庫

CREATE DATABASE IF NOT EXISTS `ds1`;

USE `ds1`;
SET NAMES utf8mb4;

SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for user_0 --
-------------------------- --
DROP TABLE
IF EXISTS `user_0`;

CREATE TABLE `user_0` (
    `id` INT (11) NOT NULL,
    `name` VARCHAR (255) DEFAULT NULL,
    `age` INT (11) DEFAULT NULL,
    PRIMARY KEY (`id`)
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4;

-- ----------------------------
-- Table structure for user_1 --
-------------------------- --
DROP TABLE IF EXISTS `user_1`;

CREATE TABLE `user_1` (
    `id` INT (11) NOT NULL,
    `name` VARCHAR (255) DEFAULT NULL,
    `age` INT (11) DEFAULT NULL,
    PRIMARY KEY (`id`)
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4;


SET FOREIGN_KEY_CHECKS = 1;

CREATE DATABASE IF NOT EXISTS `ds0` ;

USE `ds0`;

SET NAMES utf8mb4;

SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for user_0 --
-------------------------- --
DROP TABLE
IF EXISTS `user_0`;

CREATE TABLE `user_0` (
    `id` INT (11) NOT NULL,
    `name` VARCHAR (255) DEFAULT NULL,
    `age` INT (11) DEFAULT NULL,
    PRIMARY KEY (`id`)
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4;

-- ----------------------------
-- Table structure for user_1 --
-------------------------- --
DROP TABLE
IF EXISTS `user_1`;

CREATE TABLE `user_1` (
    `id` INT (11) NOT NULL,
    `name` VARCHAR (255) DEFAULT NULL,
    `age` INT (11) DEFAULT NULL,
    PRIMARY KEY (`id`)
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4;

  3.8 增加分庫分表配置文件

# 數據源 ds0,ds1
sharding.jdbc.datasource.names=ds0,ds1
# 第一個數據庫
sharding.jdbc.datasource.ds0.type=com.zaxxer.hikari.HikariDataSource
sharding.jdbc.datasource.ds0.driver-class-name=com.mysql.cj.jdbc.Driver
sharding.jdbc.datasource.ds0.jdbc-url=jdbc:mysql://localhost:3306/ds0?characterEncoding=utf-8&&serverTimezone=GMT%2B8
sharding.jdbc.datasource.ds0.username=root
sharding.jdbc.datasource.ds0.password=zengjian

# 第二個數據庫
sharding.jdbc.datasource.ds1.type=com.zaxxer.hikari.HikariDataSource
sharding.jdbc.datasource.ds1.driver-class-name=com.mysql.cj.jdbc.Driver
sharding.jdbc.datasource.ds1.jdbc-url=jdbc:mysql://localhost:3306/ds1?characterEncoding=utf-8&&serverTimezone=GMT%2B8
sharding.jdbc.datasource.ds1.username=root
sharding.jdbc.datasource.ds1.password=zengjian

# 水平拆分的數據庫(表) 配置分庫 + 分表策略 行表達式分片策略
# 分庫策略
sharding.jdbc.config.sharding.default-database-strategy.inline.sharding-column=id
sharding.jdbc.config.sharding.default-database-strategy.inline.algorithm-expression=ds$->{id % 2}

# 分表策略 其中user為邏輯表 分表主要取決於age行
sharding.jdbc.config.sharding.tables.user.actual-data-nodes=ds$->{0..1}.user_$->{0..1}
sharding.jdbc.config.sharding.tables.user.table-strategy.inline.sharding-column=age
# 分片算法表達式
sharding.jdbc.config.sharding.tables.user.table-strategy.inline.algorithm-expression=user_$->{age % 2}

# 主鍵 UUID 18位數 如果是分布式還要進行一個設置 防止主鍵重復
#sharding.jdbc.config.sharding.tables.user.key-generator-column-name=id

# 打印執行的數據庫以及語句
sharding.jdbc.config.props..sql.show=true
spring.main.allow-bean-definition-overriding=true

  

  3.9 讀寫分離配置

#shardingsphere 讀寫分離,master-slave,可以一主多從
sharding.jdbc.datasource.names=ds-master,ds-slave0
#主庫
sharding.jdbc.datasource.ds-master.type=com.zaxxer.hikari.HikariDataSource
sharding.jdbc.datasource.ds-master.driver-class-name=com.mysql.cj.jdbc.Driver
sharding.jdbc.datasource.ds-master.jdbc-url=jdbc:mysql://112.125.26.67:3306/shop_ds_master?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8
sharding.jdbc.datasource.ds0.username=root
sharding.jdbc.datasource.ds0.password=zengjian
#從庫0
sharding.jdbc.datasource.ds-slave0.type=com.zaxxer.hikari.HikariDataSource
sharding.jdbc.datasource.ds-slave0.driver-class-name=com.mysql.cj.jdbc.Driver
sharding.jdbc.datasource.ds-slave0.jdbc-url=jdbc:mysql://112.125.26.66:3306/shop_ds_master?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8
sharding.jdbc.datasource.ds-slave0.username=root
sharding.jdbc.datasource.ds-slave0.password=zengjian
#從庫1
#spring.shardingsphere.datasource.ds-slave1.type=com.zaxxer.hikari.HikariDataSource
#spring.shardingsphere.datasource.ds-slave1.driver-class-name=com.mysql.cj.jdbc.Driver
#spring.shardingsphere.datasource.ds-slave1.jdbc-url=jdbc:mysql://112.125.26.68:3306/shop_ds_slave1?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8
#spring.shardingsphere.datasource.ds-slave1.username=root
#spring.shardingsphere.datasource.ds-slave1.password=root

#讀寫分離主從規則設置,當有2個以上從庫時,從庫讀采用輪詢的負載均衡機制
sharding.jdbc.config.masterslave.load-balance-algorithm-type=round_robin
sharding.jdbc.config.masterslave.name=ms
sharding.jdbc.config.masterslave.master-data-source-name=ds-master
sharding.jdbc.config.masterslave.slave-data-source-names=ds-slave0

 

  分庫分表,分庫不分表及分表不分庫,讀寫分離等 應用 gitee demohttps://gitee.com/xiangbaxiang/sharding-jdbc  

    如果對你有幫助,希望走過路過的,高抬貴手點個贊          


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM