ShardingSphere-proxy添加自定义分片规则(踩坑日记)

文章目录

版本环境

mysql 5.7.40

shardingsphere-proxy 5.5.0

一、新建spring boot项目

注意这里要建立一个空的spring boot项目。我这里采用maven创建项目。而不是用spring init去创建。

用这个创建

创建完成后,自己增加pom文件内容。

b 复制代码
<?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>sd-sample</artifactId>
    <version>1.0-SNAPSHOT</version>

    <parent>
        <artifactId>spring-boot-starter-parent</artifactId>
        <groupId>org.springframework.boot</groupId>
        <version>2.7.14</version>
    </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>
        </dependency>
        <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>shardingsphere-sharding-api</artifactId>
            <version>5.4.0</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>compile</scope>
        </dependency>
    </dependencies>

</project>

要注意,我用的是shardingproxy5.5.0的版本。但是api用了5.4.0版本,不能用5.1.0版本。否则编译出来的程序会报错。用5.4.0的是因为我的pom拉不下5.5.0,没时间去调整maven

二、编写代码

(1) 新建一个类

这个类要实现rg.apache.shardingsphere.sharding.api.sharding.standard.StandardShardingAlgorithm

(2) doSharding方法详解

程序主要根据自己的逻辑实现doSharding方法。

(3) 实际例子

这里代码,要特别注意以下几点

这里代码,要特别注意以下几点

这里代码,要特别注意以下几点

1.有两个doSharding方法需要实现,一个是当条件语句是=,in的时候使用的分片算法。另外一个是<>,between的时候使用的算法。

2.getType方法中返回的是这个算法的名称,自己定义。yaml中要用到的。

b 复制代码
package com.demo.order_sharding;

import lombok.extern.slf4j.Slf4j;
import org.apache.shardingsphere.sharding.api.sharding.standard.PreciseShardingValue;
import org.apache.shardingsphere.sharding.api.sharding.standard.RangeShardingValue;
import org.apache.shardingsphere.sharding.api.sharding.standard.StandardShardingAlgorithm;

import java.util.Collection;

@Slf4j
public class ShardingDatabaseModuloAlgorithm implements StandardShardingAlgorithm<String> {

    /**
     * 精确查询分片执行接口(对应的sql是where ??=值)
     * @param collection: 可用的分片名集合(分库就是库名,分表就是表名)
     * @param preciseShardingValue: 分片键
     * @return 分片名
     */
    @Override
    public String doSharding(Collection<String> collection, PreciseShardingValue<String> preciseShardingValue) {
        String  logicTableName=preciseShardingValue.getLogicTableName();        //得到逻辑表名,就是sql语句的逻辑表
        //log.info("{}",logicTableName);

        String busCode=preciseShardingValue.getValue(); //得到分片字段的值,这里分片用的是bus_code字段,系统会把这个字段传过来。

        //根据bus_code进行分片的后缀名称
        String busType="0";
        if(busCode.startsWith("Z0A")){
            busType="1";
        }else if(busCode.startsWith("S2Y")){
            busType="2";
        }else {
            busType="0";
        }

        //返回实际表或者库
        String target=logicTableName+"_"+busType;
        if(collection.contains(target)){
            return target;
        }

        throw new UnsupportedOperationException("route: " + busCode + " is not supported, please check your config");
        //return null;
    }

    /***
     * 范围分片规则(对应的是where ??>='XXX' and ??<='XXX')
     * 范围查询分片算法(分片键涉及区间查询时会进入该方法进行分片计算)
     * @param collection
     * @param rangeShardingValue
     * @return 返回多个分片名
     */
    @Override
    public Collection<String> doSharding(Collection<String> collection, RangeShardingValue<String> rangeShardingValue) {
        //这里返回所有的集合,也就是会到所有的表里执行语句
        return collection;
    }


    @Override
    public String getType() {
        return "SHARD_BUS_TYPE"; //算法名称,可以自己定义。注意yaml中要用这个名字
    }
}

三、增加spi文件(很关键)

如下图

  • 在resources中添加META-INFO/services目录
  • 在目录中添加文件org.apache...(如上图)
  • 文件中写上你的类名称:com.demo.order_sharding.ShardingDatabaseModuloAlgorithm(如下图)

四、打包

mvn package

五、把生成的文件放到ext-lib中

生成的文件放到shardingsphere-proxy的ext-lib中。

六、yaml配置(怎么用)


  • 分表规则填写要的字段bus_code
  • 分表名称填写好,在对应的规则里只要填写SHARD_BUS_TYPE.

这个SHARD_BUS_TYPE是哪里来的?

看这个代码:

七、测试

这里不多说了,用navcate连上去,执行就好了。

b 复制代码
CREATE TABLE `t_bus_type` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `bus_code` varchar(30) DEFAULT NULL,
  `user_id` bigint(20) DEFAULT NULL,
  `amount` decimal(10,2) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=779468255126355969 DEFAULT CHARSET=utf8mb4;


insert into t_bus_type(bus_code) values('S2Y-0002');

最后还有一个写的也比较好的帖子,这里 分享一下

相关推荐
Little-Hu44 分钟前
QML TextEdit组件
java·服务器·数据库
暗影八度1 小时前
Spark流水线数据质量检查组件
大数据·分布式·spark
CodeWithMe2 小时前
【Note】《Kafka: The Definitive Guide》 第5章:深入 Kafka 内部结构,理解分布式日志系统的核心奥秘
分布式·kafka
CodeWithMe2 小时前
【Note】《Kafka: The Definitive Guide》第一章:Meet Kafka
分布式·kafka
CodeWithMe2 小时前
【Note】《Kafka: The Definitive Guide》 第二章 Installing Kafka:Kafka 安装与运行
分布式·kafka
保持学习ing3 小时前
day1--项目搭建and内容管理模块
java·数据库·后端·docker·虚拟机
发仔1233 小时前
Oracle与MySQL核心差异对比
mysql·oracle
宇钶宇夕3 小时前
EPLAN 电气制图:建立自己的部件库,添加部件-加SQL Server安装教程(三)上
运维·服务器·数据库·程序人生·自动化
爱可生开源社区4 小时前
SQLShift 重磅更新:支持 SQL Server 存储过程转换至 GaussDB!
数据库
贾修行4 小时前
SQL Server 空间函数从入门到精通:原理、实战与多数据库性能对比
数据库·sqlserver