文章目录
- 一、新建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');
最后还有一个写的也比较好的帖子,这里 分享一下