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

news2025/2/22 8:10:26

文章目录

  • 一、新建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');

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用 Python 进行测试(1)测试基础

原文 总结 我们将从unittest开始&#xff0c;尽管它并不那么好用&#xff0c;但它是Python标准库中的测试工具。 使用unittest编写测试看起来像这样&#xff1a; import unittest# 需要测试的代码 def add(a, b):return a b# The tests class TestAddFunction(unittest.Test…

MySQL之优化服务器设置(三)

优化服务器设置 InnoDB表空间 InnoDB把数据保存在表空间内&#xff0c;本质上是一个由一个或多个磁盘文件组成的虚拟文件系统。InnoDB用表空间实现很多功能&#xff0c;并不只是存储表和索引。它还保存了回滚日志(旧版本行)、插入缓冲(Insert Buffer)、双写缓冲(Doublewrite …

大模型企业落地:制造业可以选择的应用场景

前言 在当今制造业快速发展的背景下&#xff0c;设备稳定运行对于企业的发展至关重要。然而&#xff0c;传统的设备维修模式已无法满足现代企业的需求。为此&#xff0c;引入智能化、数字化的设备维修解决方案成为必然趋势。本文将探讨如何利用大模型技术&#xff0c;构建企业…

《2023-2024中国数据资产发展研究报告》

中国电子信息产业发展研究院发布《2023-2024中国数据资产发展研究报告》&#xff08;下称《报告》&#xff09;&#xff0c;紧跟国家战略部署&#xff0c;调研国内数据资产发展现状&#xff0c;掌握数据价值实现路径&#xff0c;助力释放数字经济新动能。 《报告》从数据资产相…

北京活动会议通常会邀约哪些媒体参会报道?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 北京作为我国的首都和文化中心&#xff0c;各类活动会议资源丰富&#xff0c;吸引了众多媒体的关注。以下是一些通常会被邀约参会报道的重要媒体类型&#xff1a; 国家级新闻机构&#x…

探索AI的魔力:这5款AI应用让你全面感受人工智能的魅力

“ AI 的出现就像燃气机和蒸汽机一样&#xff0c;极大地提高了生产力。” 01、—chatGPT ChatGPT 是由 OpenAI 公司开发的一种大型语言模型。 OpenAI 公司成立于 2015年&#xff0c;早期马斯克是该公司的创始人之一。 自 2018 年推出 GTP-1 以来&#xff0c;OpenAI 已经推出…

关于Linux ping 不通外网

网关为第三段为137那么子网ip第三段必须为137且IPaddr必须为137 将主机虚拟适配器连接到此网络必须勾上&#xff0c;不然vmnet适配器在windows将找不到 ping www.baidu.com不行的话试着勾上桥接模式应该是不行在勾上取消勾上桥接模式最后勾上nat模式

C语言小例程20/100

题目&#xff1a;一个数如果恰好等于它的因子之和&#xff0c;这个数就称为"完数"。例如61&#xff0b;2&#xff0b;3.编程找出1000以内的所有完数。 #include<stdio.h> #define N 1000 int main() {int i,j,k,n,sum;int a[256];for(i2;i<N;i){suma[0]1;k…

Transformer系列:图文详解Decoder解码器原理

从本节开始本系列将对Transformer的Decoder解码器进行深入分析。 内容摘要 Encoder-Decoder框架简介shifted right移位训练解码器的并行训练和串行预测解码器自注意力层和掩码解码器交互注意力层和掩码解码器输出和损失函数 Encoder-Decoder框架简介 在原论文中Transformer用…

视频转换器在线哪个好?让视频播放不受格式限制

在日常的视频观看中&#xff0c;我们可能会遇到视频格式与设备不兼容的问题&#xff0c;导致无法顺畅播放。这就像是缺少了播放的钥匙&#xff0c;让人无法享受视频内容。 面对视频格式不兼容的挑战&#xff0c;选择合适的转换工具至关重要。但不用担心&#xff0c;本文将分享…

框架学习之spring学习笔记(一)

一、框架前言 1-什么是spring框架&#xff0c;有哪些主要模块&#xff1f; Spring 框架是一个专门针对于 Java 应用程序开发&#xff0c;并提供了综合、广泛的基础性支持的轻量级框架。Spring框架使用目的是为了提高开发人员的开发效率以及系统的可维护性。 Spring 是以IoC和A…

html圆盘钟表纯js有解释【搬代码】

结果如图所示&#xff1a; 使用的idear中的html编写 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport…

SpringBoot+Vue实现Excel文档导入和导出

1.准备工作 1.1.前端程序 在前端首先加上批量导出的按钮&#xff0c;如下 <el-button size"small" type"warning" plain click"exportData"> 批量导出 </el-button> 在添加了点击事件之后&#xff0c;在methods中要与之对应的添加上…

Visual Studio Code 的安装教程和配置C语言环境插件推荐

目录 1.vscode简介2.下载安装vs code3.VSCode基础配置VSCode界面简介VSCode设置中文界面VSCode个性化设置VSCode常用设置基本编辑快捷键VSCode常用快捷键 4.下载安装MinGW5.设置vscode里的环境6.插件推荐7.vscode官方文档 1.vscode简介 VSCode是微软出的一款轻量级编辑器&…

第2章 Rust初体验8/8:末尾不带分号的表达式即代码块返回值:更简洁的语法:猜骰子冷热游戏

讲动人的故事,写懂人的代码 2.9 故事7: 玩家输入的数字若越界则继续猜 贾克强:“我们终于要一起写这个游戏的最后一个故事啦!游戏中,你需要猜两个骰子的点数之和,因此你猜的数字应该在2到12之间。我们可以在代码中加入一些判断逻辑,如果你猜的数字超出了这个范围,游戏会…

足底筋膜炎怎么治疗才能彻底除根

现代快节奏的生活中&#xff0c;足底筋膜炎作为一种常见的足部疾病&#xff0c;困扰着越来越多的人。长时间的站立、行走&#xff0c;以及不正确的运动姿势&#xff0c;都可能成为足底筋膜炎的诱因。足底筋膜炎带来的疼痛和不适&#xff0c;严重影响了人们的生活质量和日常工作…

用Rust手把手编写一个Proxy(代理), 开始动工

https://shop.kongfz.com/795263/ 代理端和代理服务端之间可用自有格式来实现多路复用以减少连接的建立断开的开销,目前暂未实现代理服务端。 类结构 proxy.rs 负责代理结构的存储,监听类型,监听地址,是否有父级地址,认证账号密码等。 flag.rs 监听类型的二进制结构,…

网络安全 - DDoS 攻击原理 + 实验

DDoS 攻击 什么是 DDoS 进攻 D D o S \color{cyan}{DDoS} DDoS&#xff08;Distributed Denial of Service&#xff0c;分布式拒绝服务&#xff09;攻击是一种通过多个计算机系统同时向目标系统发送大量请求&#xff0c;消耗其资源&#xff0c;使其无法正常服务的攻击方式。DD…

后端高频面试题分享-用Java判断一个列表是否是另一个列表的顺序子集

问题描述 编写一个函数&#xff0c;该函数接受两个列表作为参数&#xff0c;判断第一个列表是否是第二个列表的顺序子集&#xff0c;返回True或False。 要求 判断一个列表是否是另一个列表的顺序子集&#xff0c;即第一个列表的所有元素在第二个列表需要顺序出现。列表中的元…

Linux常用命令及或g++(或gcc)编辑器运用

一. 实验内容 1&#xff0e;打开VMware Workstation虚拟机进入Ubuntu系统&#xff0c;打开终端。 练习使用常用的Linux命令&#xff0c;主要包括如下命令&#xff1a; mkdir, rmdir, cd, pwd, ls, clear, cat, rm等。&#xff08;其中&#xff0c;cat、rm命令请在下面实验内容3…