文章目录
- [一、新建spring boot项目](#一、新建spring boot项目)
- 二、编写代码
-
- [(1) 新建一个类](#(1) 新建一个类)
- [(2) doSharding方法详解](#(2) doSharding方法详解)
- [(3) 实际例子](#(3) 实际例子)
- 三、增加spi文件(很关键)
- 四、打包
- 五、把生成的文件放到ext-lib中
- 六、yaml配置(怎么用)
- 七、测试
版本环境
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');
最后还有一个写的也比较好的帖子,这里 分享一下