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 分片名*/@Overridepublic 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 返回多个分片名*/@Overridepublic Collection<String> doSharding(Collection<String> collection, RangeShardingValue<String> rangeShardingValue) {//这里返回所有的集合,也就是会到所有的表里执行语句return collection;}@Overridepublic 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.mzph.cn/web/27810.shtml

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

相关文章

英语复习之英语同音词总结(六)

之前的五个部分是总结的形近词&#xff0c;接下来开始总结同音词。 单词 (发音) 释义 例句 sight [saɪt] n. 视力&#xff1b;视野&#xff1b;景象 1. She has perfect sight. (她视力很好。) 2. The view from the top of the mountain is a breathtaking sight. (从山…

湘潭大学信息与网络安全复习笔记2(总览)

前面的实验和作业反正已经结束了&#xff0c;现在就是集中火力把剩下的内容复习一遍&#xff0c;这一篇博客的内容主要是参考教学大纲和教学日历 文章目录 教学日历教学大纲 教学日历 总共 12 次课&#xff0c;第一次课是概述&#xff0c;第二次和第三次课是密码学基础&#x…

[渗透测试学习] Runner-HackTheBox

Runner-HackTheBox 信息搜集 nmap扫描端口 nmap -sV -v 10.10.11.13扫描结果如下 PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 8.9p1 Ubuntu 3ubuntu0.6 (Ubuntu Linux; protocol 2.0) 80/tcp open http nginx 1.18.0 (Ubuntu) 8000…

严格锁和乐观锁

严格锁和乐观锁 严格锁 含义&#xff1a; 当一个开发者正在编辑某个文件时&#xff0c;其他开发者将无法同时对该文件进行编辑。确保在某一时刻只有一个开发者能够访问和修改该文件严格锁机制通常用于那些需要高度一致性和准确性的场景&#xff0c;例如配置文件、数据库脚本…

中小制造业工厂要不要上MES系统

MES系统的主要功能包括制造数据管理、计划排产管理、生产调度管理、库存管理、质量管理、人力资源管理、工作中心/设备管理、工具工装管理、采购管理、成本管理、项目看板管理、生产过程控制、底层数据集成分析、上层数据集成分解等。通过这些模块&#xff0c;MES为企业打造一个…

mysql容器问题mbind: Operation not permitted

我使用阿里云的服务器用docker创建一个mysql容器时&#xff0c;本来运行着好好的&#xff0c;突然容器就停掉了&#xff0c;上线查看MySQL容器日志&#xff0c;显示 2024-06-08 18:25:4008:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.27-1debian10 start…

基于springboot实现农产品直卖平台系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现农产品直卖平台系统的设计演示 摘要 计算机网络发展到现在已经好几十年了&#xff0c;在理论上面已经有了很丰富的基础&#xff0c;并且在现实生活中也到处都在使用&#xff0c;可以说&#xff0c;经过几十年的发展&#xff0c;互联网技术已经把地域信息的隔…

java List remove方法

在 Java 中&#xff0c;List 接口提供的 remove 方法有两个重载版本&#xff0c;一个是按索引移除元素&#xff0c;另一个是按对象移除元素。具体来说&#xff1a; 按索引移除元素&#xff1a;remove(int index) 按对象移除元素&#xff1a;remove(Object o) 按索引移除元素 …

快速构建本地RAG聊天机器人:使用LangFlow和Ollama实现无代码开发

基于LangChain的快速RAG应用原型制作方法 还记得构建智能聊天机器人需要数月编码的日子吗&#xff1f; LangChain这样的框架确实简化了开发流程&#xff0c;但对非程序员来说&#xff0c;数百行代码仍然是一道门槛。 有没有更简单的方法呢&#xff1f; 图片由 Ravi Palwe 在…

适用于 macOS 的最佳免费数据恢复软件

升级到 macOS 后&#xff0c;它可以帮助您从 HDD、SSD、存储卡、USB 闪存驱动器、数码相机或其他存储介质设备中完全恢复已删除、格式化或无法访问的数据。 当 macOS Monterey 用户寻找数据恢复解决方案时&#xff0c;免费数据恢复软件始终是一个不错的选择。实际上&#xff0…

Linux基础命令[29]-chown

文章目录 1. chown 命令说明2. chown 命令语法3. chown 命令示例3.1 修改属主3.2 修改属组3.3 修改属主和属组3.4 修改文件夹所属 4. 总结 1. chown 命令说明 chown&#xff1a;更改文件的用户或用户组&#xff0c;需要 root 用户或 sudo 权限的用户执行该命令。基本信息如下&…

后仿真中的门级仿真类型有哪些及门级仿真目的

目录 一 门级仿真分类 二 门级仿真目标 一 门级仿真分类 后仿即门级仿真&#xff08;gate level&#xff09;&#xff0c;是和RTL&#xff08;register transfer level&#xff09;相对应的。 所谓网表&#xff08;netlist&#xff09;&#xff0c;就是一堆基础单元&#x…

react学习-redux快速体验

1.redux是用于和react搭配使用的状态管理工具&#xff0c;类似于vue的vuex。redux可以不和任何框架绑定&#xff0c;独立使用 2.使用步骤 &#xff08;1&#xff09;定义一个reducer函数&#xff08;根据当前想要做的修改返回一个新的状态&#xff09; &#xff08;2&#xff0…

Mac M3 Pro 部署Spark-2.3.2 On Hive-3.1.3

mac的配置如下 1、下载安装包 官网 Apache Projects Releases 在search中搜索hadoop、hive spark &#xff1a; Index of /dist/spark/spark-2.3.2 网盘 Hadoop https://pan.baidu.com/s/1p4BXq2mvby2B76lmpiEjnA?pwdr62r 提取码: r62r Hive https://pan.baidu.com/s/…

el-table表头修改文字或者背景颜色,通过header-row-style设置样式

方式一 <el-table :header-cell-style"{text-align: center}" />方式二 <template><el-table :header-cell-style"tableHeaderColor" /> </template> <script> export default {methods: {tableHeaderColor ({row, column…

孪生网络(Siamese Networks)和对比学习(Contrastive Learning)

目录 孪生网络&#xff08;Siamese Networks&#xff09; 对比学习&#xff08;Contrastive Learning&#xff09; 区别 SimCLR (A Simple Framework for Contrastive Learning of Visual Representations) MoCo (Momentum Contrast for Unsupervised Visual Representati…

Android 应用程序 ANR 问题分析总结

ANR (Application Not Responding) 应用程序无响应。如果应用程序在UI线程被阻塞太长时间&#xff0c;就会出现ANR&#xff0c;通常出现ANR&#xff0c;系统会弹出一个提示提示框&#xff0c;让用户知道&#xff0c;该程序正在被阻塞&#xff0c;是否继续等待还是关闭。 1、AN…

解决了这个报错:ReferenceError: Cannot access ‘img‘ before initialization

这个错误信息 ReferenceError: Cannot access img before initialization 指的是在你的JavaScript代码中&#xff0c;你试图在一个变量img被声明之前就访问它。这通常发生在以下情况之一&#xff1a; 变量提升&#xff08;Variable Hoisting&#xff09;&#xff1a;在JavaScr…

RabbitMQ实践——交换器(Exchange)绑定交换器

在《RabbitMQ实践——交换器&#xff08;Exchange&#xff09;和绑定&#xff08;Banding&#xff09;》一文中&#xff0c;我们实验了各种交换器。我们可以把交换器看成消息发布的入口&#xff0c;而消息路由规则则是由“绑定关系”&#xff08;Banding&#xff09;来定义&…

小分子水半幅宽检测 低氘水同位素氘检测 富氢水检测

小分子水半幅宽检测 低氘水同位素氘检测 富氢水检测 检测范围: 矿泉水等饮用水 检测概述 小分子团水活化性很强&#xff0c;具有强渗透力&#xff0c;强溶解力&#xff0c;强扩散力。水的含氧量高&#xff0c;能给人体内的组织细胞带来更多的氧。长自来水大分子团核磁共振测得…