Github地址:https://github.com/apache/shardingsphere
官方文档:https://shardingsphere.apache.org/document/legacy/3.x/document/cn/overview/
官方文档写的太简单了,对于上手没有太多帮助;

初始化数据库

  1. # 创建两个库
  2. create schema test0 collate utf8_general_ci;
  3. create schema test1 collate utf8_general_ci;
  4. # 创建7个测试用户表(第一个用于代码生成,不存储数据)
  5. create table test0.user
  6. (
  7. id bigint primary key,
  8. name varchar(20) not null,
  9. age int not null,
  10. email varchar(100) not null
  11. ) comment '用户表';
  12. create table test0.user0
  13. (
  14. id bigint primary key,
  15. name varchar(20) not null,
  16. age int not null,
  17. email varchar(100) not null
  18. ) comment '用户表';
  19. create table test0.user1
  20. (
  21. id bigint primary key,
  22. name varchar(20) not null,
  23. age int not null,
  24. email varchar(100) not null
  25. ) comment '用户表';
  26. create table test0.user2
  27. (
  28. id bigint primary key,
  29. name varchar(20) not null,
  30. age int not null,
  31. email varchar(100) not null
  32. ) comment '用户表';
  33. create table test1.user0
  34. (
  35. id bigint primary key,
  36. name varchar(20) not null,
  37. age int not null,
  38. email varchar(100) not null
  39. ) comment '用户表';
  40. create table test1.user1
  41. (
  42. id bigint primary key,
  43. name varchar(20) not null,
  44. age int not null,
  45. email varchar(100) not null
  46. ) comment '用户表';
  47. create table test1.user2
  48. (
  49. id bigint primary key,
  50. name varchar(20) not null,
  51. age int not null,
  52. email varchar(100) not null
  53. ) comment '用户表';
  1. # 初始化 ETH 区块表
  2. create table test0.t_eth_block
  3. (
  4. hash varchar(72) not null comment '哈希'
  5. primary key,
  6. number bigint not null comment '区块高度',
  7. miner varchar(72) not null default '' comment '矿工地址'
  8. )
  9. comment 'ETH区块表';
  10. create table test0.t_eth_block0
  11. (
  12. hash varchar(72) not null comment '哈希'
  13. primary key,
  14. number bigint not null comment '区块高度',
  15. miner varchar(72) not null default '' comment '矿工地址'
  16. )
  17. comment 'ETH区块表';
  18. create table test0.t_eth_block1
  19. (
  20. hash varchar(72) not null comment '哈希'
  21. primary key,
  22. number bigint not null comment '区块高度',
  23. miner varchar(72) not null default '' comment '矿工地址'
  24. )
  25. comment 'ETH区块表';
  26. create table test0.t_eth_block2
  27. (
  28. hash varchar(72) not null comment '哈希'
  29. primary key,
  30. number bigint not null comment '区块高度',
  31. miner varchar(72) not null default '' comment '矿工地址'
  32. )
  33. comment 'ETH区块表';

初始化 SpringBoot+Mybatis 项目

通过IDEA->New ->Project SpringBoot initializr 初始化项目,
或者 集成进现有 SpringBoot+Mybatis 项目。
image.png

集成 sharding-jdbc

通过官方的 starter 集成:

  1. <dependency>
  2. <groupId>org.apache.shardingsphere</groupId>
  3. <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
  4. <version>4.1.1</version>
  5. </dependency>

sharding-jdbc 配置

通过 yml 配置文件配置:

spring:
  shardingsphere:
    datasource:
      names: test0,test1                                        # 数据源,这里为了方便直接使用库名的名称
      test0:
        type: com.alibaba.druid.pool.DruidDataSource            # Druid连接池
        url: jdbc:mysql://192.168.1.104:3306/test0              # 连接test0的url
        username: root
        password: pass
      test1:
        type: com.alibaba.druid.pool.DruidDataSource            # Druid连接池
        url: jdbc:mysql://192.168.1.104:3306/test1              # 连接test1的url
        username: root
        password: pass
    sharding:
      default-database-strategy:                                # 默认分库策略
        inline:
          sharding-column: age                                  # 表示根据age列进行分库
          algorithm-expression: test$->{age % 2}                # 根据age对2的模进行分库,模为0表示test0库,模为1表示test1库
      tables:
        user:
          actual-data-nodes: test$->{0..1}.user$->{0..2}        # 表的名字,test$->{0..1}可以表示test0、test1两个库 user$->{0..2}表示user0、user1、user2三个库
          table-strategy:                                       # 分表策略
            inline:
              sharding-column: id                               # 根据哪一列进行分表,id表示根据列名为"id"的列分表
              algorithm-expression: user$->{id%3}               # 分表规则为id对3取模,id%3为0表示分到user0表 id%3为1表示分到user1表,id%3为2表示分到user2表
        t_eth_block:
          actual-data-nodes: test$->{0}.t_eth_block$->{0..2}    # 不分库,只分表
          table-strategy:
             inline:
               sharding-column: number
               algorithm-expression: t_eth_block$->{ (number/5000000) as int} 
               # 分表规则为 number 对 5_000_000 取整,eg 一条数据 number=12_700_000 会被分到 t_eth_block2表
    props:
      sql:
        show:
          true                                                  # 打印sql

通过 mybatis-plus 生成代码

示例生成 EthBlock 相关代码:

import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

public class MyBatisPlusGenerator {
    public static void main(String[] args) {
        final AutoGenerator generator = new AutoGenerator();
        DataSourceConfig dataSourceConfig = new DataSourceConfig();
        dataSourceConfig.setUrl("jdbc:mysql://localhost:3306/test0");
        dataSourceConfig.setDriverName("com.mysql.jdbc.Driver");
        dataSourceConfig.setUsername("root");
        dataSourceConfig.setPassword("test123");

        String projectPath = System.getProperty("user.dir");

        StrategyConfig strategyConfig = new StrategyConfig();
        strategyConfig.setInclude("t_eth_block");
        strategyConfig.setNaming(NamingStrategy.underline_to_camel);


        GlobalConfig globalConfig = new GlobalConfig();
        globalConfig.setOutputDir(projectPath + "/src/main/java");
        globalConfig.setOpen(false);
        globalConfig.setAuthor("Paradise");

        PackageConfig packageConfig = new PackageConfig();
        packageConfig.setModuleName("eth");
        packageConfig.setParent("com.paradise.sharding");
        packageConfig.setServiceImpl("service");

        generator.setDataSource(dataSourceConfig);
        generator.setStrategy(strategyConfig);
        generator.setGlobalConfig(globalConfig);
        generator.setPackageInfo(packageConfig);

        generator.execute();
    }
}

编写测试接口代码

package com.paradise.sharding.eth.controller;


import com.paradise.sharding.eth.entity.TEthBlock;
import com.paradise.sharding.eth.service.TEthBlockServiceImpl;
import io.swagger.annotations.Api;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * <p>
 * ETH区块表 前端控制器
 * </p>
 *
 * @author Paradise
 * @since 2021-07-12
 */
@Api(tags = "block")
@RestController
@RequestMapping("/eth/block")
@AllArgsConstructor
public class TEthBlockController {

    private final TEthBlockServiceImpl blockService;

    @GetMapping
    public List<TEthBlock> ethBlockList() {
        return blockService.list();
    }

    @PutMapping
    public boolean insert(@RequestBody TEthBlock block) {
        blockService.save(block);
        return true;
    }

}

测试

录入最新的区块数据进行测试:
image.png
image.png

Demo项目地址

https://gitee.com/paradis3/sharding-demo