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

文章目录

  • 一、新建spring boot项目
  • 二、编写代码
    • (1) 新建一个类
    • (2) doSharding方法详解
    • (3) 实际例子
  • 三、增加spi文件(很关键)
  • 四、打包
  • 五、把生成的文件放到ext-lib中
  • 六、yaml配置(怎么用)
  • 七、测试

版本环境
mysql 5.7.40
shardingsphere-proxy 5.5.0

一、新建spring boot项目

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

用这个创建
在这里插入图片描述
创建完成后,自己增加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>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中要用到的。


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连上去,执行就好了。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/711635.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在VMware中安装CentOS7(超详细的图文教程)

1、CentOS7的下载 官网下载地址&#xff1a;Download。 进入CentOS下载官网&#xff0c;找到64位的CentOS7版本。 点进来后&#xff0c;发现它给我们列出了所在区域可用镜像源&#xff08;可以说是非常的良心的&#xff09;&#xff0c;我们随便选择一个&#xff0c;这里以阿…

随笔-来了,安了

依照领导定的规矩&#xff0c;周五又去了分公司&#xff0c;赋能一线去了。到了地方就是开会->现场解决问题->干饭->开会过需求、提供解决方案&#xff0c;充实得厉害。强度也不小&#xff0c;中午干的一大碗饭&#xff0c;到五点就饿了。 六点带着分公司催着上线的需…

浔川身份证号码查询——浔川python科技社

Python获取身份证信息 公民身份号码是每个公民唯一的、终身不变的身份代码&#xff0c;由公安机关按照公民身份号码国家标准编制。每一个居民只能拥有一个唯一的身份证&#xff0c;它是用于证明持有人身份的一种法定证件。 身份证包含了个人的一些重要信息&#xff0c;比如&am…

「计算机网络」初识http协议

前言 HTTP协议——互联网发展的基石&#xff0c;从一个最简单的“helloworld”网页&#xff0c;到现在博客平台、视频网站都离不开HTTP协议的存在。随着互联网的发展&#xff0c;Web网页的设计也越发复杂&#xff0c;前后端开发的分工也越发明确&#xff0c;HTTP作为连接前后端…

conda添加镜像源与channels

文章目录 一、conda下添加国内镜像源&#xff08;window下&#xff09;二、pip配置国内镜像源&#xff08;window下&#xff0c;临时修改&#xff09;三、conda源的定义 一、conda下添加国内镜像源&#xff08;window下&#xff09; 1、为【channels】配置清华镜像通道 直接在…

英伟达开源 3400 亿巨兽:98% 合成数据训出最强开源通用模型,性能对标 GPT-4o

NVIDIA 最近开源了其大型语言模型 Nemotron-4 340B&#xff0c;这是一个具有划时代意义的模型&#xff0c;它使用了高达 98% 的合成数据进行训练&#xff0c;并且在性能上与 GPT-4 相当。Nemotron-4 340B 包括基础模型、指令模型和奖励模型&#xff0c;支持 4K 上下文窗口、50 …

配置完eslint没有用?

当你使用 npx eslint --init 生成配置文件后 你也配置好了.prettierrc 当你在代码写一点小问题的时候 发现eslint没有进行检查 原因是你生成的 .eslintrc.js中没有加上这个配置 extends: [.....plugin:prettier/recommended],加上以后重启vscode你会发现

BUUCTF---[MRCTF2020]你能看懂音符吗

1、下载附件&#xff0c;是一个压缩包&#xff0c;解压&#xff0c;发现解压失败 2、用winhex分析文件&#xff0c;发现文件头不对 3、将文件头改为&#xff1a;52617221&#xff0c;保存 4、解压得到word 5、在文档发现下面内容 6、根据题目的描述&#xff0c;将音乐字符解码…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 停车场车位统计(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 📎在线评测链接 停车场车位统计(100分) 🌍 评测功能需要订阅专栏后私信联…

邮件钓鱼--前置-攻击防范 7 看

目录 1、什么是 SPF&#xff1a; 2、如何判断 SPF&#xff1a; 3.邮件钓鱼防范&#xff1a;7 看 1、什么是 SPF&#xff1a; SPF 记录&#xff1a;原理、语法及配置方法简介 (zhetao.com) SPF记录详解_spf写法-CSDN博客 发件人策略框架&#xff08;Sender Policy Frame…

Vue45-分析脚手架结构

一、脚手架项目结构一览 二、src、public文件夹外的文件 2-1、babel.config.js文件 详细的配置规格&#xff1a;babel官网。 2-2、package.json包的说明书 build命令&#xff1a;代码写完了&#xff0c;最后使用build命名构建整个工程&#xff0c;将其变成浏览器能够运行的项…

【数据结构】第十六弹---C语言实现希尔排序

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1、希尔排序( 缩小增量排序 ) 1.1、预排序实现 1.2、希尔排序代码实现 1.3、代码测试 1.4、时空复杂度分析 1.5、性能比较 总结 上一弹我们…

统计信号处理基础 习题解答10-17

题目&#xff1a; 在选择不含信息的或者不假设任何先验知识的先验PDF时,我们需要从数据中得到最大的信息量。在这种方式下,数据是了解未知参数的主要贡献者。利用习题10.15的结果,这种方法可以通过选择使I最大的来实现。对于例10.1的高斯先验PDF,该如何选择和2使得 是不含信息…

玄机平台应急响应—MySQL应急

前言 这个是比较简单的&#xff0c;其实和MySQL没啥太大的关系&#xff0c;没涉及太多MySQL的知识。看一下它的flag要求吧。 flag1 它说黑客写入的shell&#xff0c;那我们就去它的网站目录去看看&#xff0c;果然有一个叫sh.php的文件。 flag1{ccfda79e-7aa1-4275-bc26-a61…

【深度学习】CICIDS 2019,入侵检测,SVM支持向量机,随机森林,DNN训练,混淆矩阵

文章目录 数据集介绍Python环境随机森林训练结果SVM支持向量机训练结果DNN训练结果所有代码下载 数据集介绍 下载&#xff1a;https://www.kaggle.com/datasets/tarundhamor/cicids-2019-dataset 数据个数&#xff1a; # 删除label中是WebDDoS的数据df df[df[Label] ! WebDD…

简单的心电图信号分割方法

代码很简单&#xff0c;很容易看懂。 import pandas as pdimport matplotlib.pyplot as plt #headers [Name, Age, Marks]df pd.read_csv(samples-folder/samples2.csv) dfdf.drop(0)dfdf.drop(1)# print(df) if(len(df.columns) 3): df.columns [sample interval, sig…

linux中安装jdk

1.查看jdk是否安装 java -version 2.搜索java yum -y list java* 3. 安装 yum install -y java-1.8.0-openjdk.x86_64 安装完成 验证

2024年实体门店和企业怎么做短视频矩阵?一文带你了解清楚

不知道大家有没有刷到过这个直播间&#xff0c;潮汕一位做牛丸的大哥&#xff0c;看起来直播间内容平平无奇&#xff0c;也就几十个人的直播间观看&#xff0c;但是他通过短视频矩阵的方式卖了150万单牛丸你敢信&#xff1f; 那你猜猜他通过短视频矩阵发了多少条视频&#xff…

python-求f(x,n)

[题目描述] 输入&#xff1a; 输入 &#x1d465;和 &#x1d45b;。输出&#xff1a; 函数值&#xff0c;保留两位小数。样例输入1 4.2 10 样例输出1 3.68 来源/分类&#xff08;难度系数&#xff1a;一星&#xff09; 完整代码如下&#xff1a; x,nmap(eval,input().split(…

记周末百度云防御CC攻击事件

今天一早&#xff0c;收到百度智能云短信提醒&#xff0c;一位客户的网站遭遇了CC攻击。 主机吧赶紧登陆客户网站查看&#xff0c;是否正常&#xff0c;看是否需要通知客户。 结果打开正常&#xff0c;看情况并没什么影响&#xff0c;那就等攻击结果了再看吧。 下午的时候&am…