1.先从git上拉取源代码
2.编写个性化自定义代码
1.在包package io.mycat.route.function创建自定义类
2.继承AbstractPartitionAlgorithm 实现RuleAlgorithm,实现自定义规则
package io.mycat.route.function;
import io.mycat.config.model.rule.RuleAlgorithm;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @author kittlen
* @version 1.0
* @date 2021/10/29 0029
*/
public class PartitionByKittlenRoute extends AbstractPartitionAlgorithm implements RuleAlgorithm {
private Logger logger = LoggerFactory.getLogger(PartitionByKittlenRoute.class);
/**
* 自定义的参数 需有set方法
*/
private String myParameter;
// 分区数量
private int partitionCount;
public void setPartitionCount(int partitionCount) {
this.partitionCount = partitionCount;
}
public void setMyParameter(String myParameter) {
this.myParameter = myParameter;
}
/**
* mycat启动时执行的代码,会加载rule.xml中的参数配置
*/
@Override
public void init() {
logger.info("kittlen Route init");
logger.info("myParameter :{}", myParameter);
super.init();
}
/**
* 设置分区数
*
* @return
*/
@Override
public int getPartitionNum() {
// return super.getPartitionNum();
return this.partitionCount;
}
/**
* 自定义分片规则
*
* @param columnValue rule.xml中columns设置的sql字段对应的字符
* @return 返回的值为schema.xml中表定义的dataNode序号 由0开始
*/
@Override
public Integer calculate(String columnValue) {
logger.info("传入的columnValue:{}", columnValue);
return columnValue.length() % 2;
}
}
3.编译该java文件为.class文件
本人编译方法为在该项目中创建一个带main方法的文件,调用main,编程软件会将该项目的代码编译成.class文件
3.添加该规则到mycat中
1.将该class复制到mycat目录下lib文件夹里Mycat-server-**-release.jar文件中
使用压缩软件放到io\mycat\route\function目录下
2.配置rule.xml文件与schema.xml文件
schema.xml:
<table name="t_kittlen_route" primaryKey="id" dataNode="dn1,dn2" rule="kittlen_rule" fetchStoreNodeByJdbc="true"/>
rule.xml:
<tableRule name="kittlen_rule">
<rule>
<columns>id</columns>
<algorithm>kittlen_rule-base</algorithm>
</rule>
</tableRule>
<function name="kittlen_rule-base" class="io.mycat.route.function.PartitionByKittlenRoute">
<property name="myParameter">hello</property>
<property name="partitionCount">2</property>
</function>
项目启动
4.数据添加
CREATE TABLE `t_kittlen_route` (
`ID` varchar(128) DEFAULT NULL,
`DB_NAME` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
insert into t_kittlen_route(id,db_name) VALUES ('a',database()),('bb',DATABASE()),('ccc',DATABASE()),('dddd',DATABASE())