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');

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

相关推荐
苹果醋31 小时前
React源码02 - 基础知识 React API 一览
java·运维·spring boot·mysql·nginx
了一li2 小时前
Qt中的QProcess与Boost.Interprocess:实现多进程编程
服务器·数据库·qt
码农君莫笑2 小时前
信管通低代码信息管理系统应用平台
linux·数据库·windows·低代码·c#·.net·visual studio
别致的影分身2 小时前
使用C语言连接MySQL
数据库·mysql
过过过呀Glik2 小时前
在 Ubuntu 上安装 MySQL 的详细指南
mysql·ubuntu
zquwei3 小时前
SpringCloudGateway+Nacos注册与转发Netty+WebSocket
java·网络·分布式·后端·websocket·网络协议·spring
京东零售技术4 小时前
“慢”增长时代的企业数据体系建设:超越数据中台
数据库
sdaxue.com4 小时前
帝国CMS:如何去掉帝国CMS登录界面的认证码登录
数据库·github·网站·帝国cms·认证码
o(╥﹏╥)5 小时前
linux(ubuntu )卡死怎么强制重启
linux·数据库·ubuntu·系统安全
阿里嘎多学长5 小时前
docker怎么部署高斯数据库
运维·数据库·docker·容器