sharding proxy自定义分片规则 standard算法

其他的都类似,只不过参数不太一样,重写之后想怎么玩就怎么玩

 

 

首先创建简单maven项目,这里不做说明,自己搞

物理库自行创建,必须有分片列,其他随意。

导入依赖

 <!-- sharding-jdbc依赖 -->
        <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>sharding-jdbc-core</artifactId>
            <version>4.0.0-RC1</version>
        </dependency>

1.preciseAlgorithmClassName 精确(针对  sql中的 =  或者 in 方式)分片属性自定义分片规则

创建自定义的方法,需要实现  ShardingAlgorithm接口或者这个接口的子类,并重写里面的方法(就一个),下面是我的类中的全部代码,根据需要自己改

package com.standard;

import org.apache.shardingsphere.api.sharding.standard.PreciseShardingAlgorithm;
import org.apache.shardingsphere.api.sharding.standard.PreciseShardingValue;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

import static java.lang.System.out;


/**
 * @author :zhangyantao
 * @date : 2020/6/9 18:20
 * standard 分片算法自定义实现
 * 精确分片算法
 **/
public class LocalPreciseShardingAlgorithm implements PreciseShardingAlgorithm<String> {
    /**
     * 数据库前缀
     */
    private static final String PREFIX = "ds_";
    /**
     * 自定义库名配置
     */
    private static Map<String, String> map = new HashMap<String, String>();

     static {
        map.put("420216", "370201");
    }

    /**
     * availableTargetNames 被查到的库列表
     * preciseShardingValue 分片列的值
     */
    @Override
    public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<String> preciseShardingValue) {
        out.println("============================single sharding=============================");
        if (preciseShardingValue != null) {
            String value = preciseShardingValue.getValue();
            for (String name : availableTargetNames) {
                if (null != map.get(value) && map.get(value).trim().length() > 0) {
                    //特定分片值处理
                    value = map.get(value);
                }
                String newName = PREFIX + Integer.parseInt(value) / 10000;
                if (newName.equals(name)) {
                    return name;
                }
            }
            throw new UnsupportedOperationException("没有匹配到可用库");
        } else {
            throw new UnsupportedOperationException("分片列为空");
        }
    }
}

 

写完之后把整个项目打成jar包,然后把jar包导入到sharding  proxy解压目录下的  lib ,然后在分库或分表的分片算法位置使用

      databaseStrategy:
        standard:
          shardingColumn: STR_AREA_CODE
          preciseAlgorithmClassName: com.standard.CustomShardingTest
 
在preciseAlgorithmClassName处调用jar包内的类路径,jar包放在lib下面,启动时自动加载。

2.rangeAlgorithmClassName  范围分片自定义

实现ShardingAlgorithm接口或者其子类,这里做简单规则

package com.standard;

import com.google.common.collect.Range;
import org.apache.shardingsphere.api.sharding.standard.RangeShardingAlgorithm;
import org.apache.shardingsphere.api.sharding.standard.RangeShardingValue;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import static java.lang.System.out;

/**
 * @author :zhangyantao
 * @apiNote :standard 范围分片算法
 * @date : 2020/6/10 14:43
 **/
public class LocalRangeShardingAlgorithm implements RangeShardingAlgorithm<String> {
    /**
     * 数据库前缀
     */
    private static final String PREFIX = "ds_";
    private static List<String> localList = new ArrayList<String>();

    static {
        localList.add("379999");
        localList.add("459999");
    }

    @Override
    public Collection<String> doSharding(Collection<String> targetNames, RangeShardingValue<String> rangeShardingValue) {
        out.println("============================range sharding=============================");
        if (rangeShardingValue != null) {
            List<String> list = new ArrayList<String>();
            Range<String> valueRange = rangeShardingValue.getValueRange();
            for (String name : targetNames) {
                for (String l : localList) {
                    if (valueRange.contains(l)) {
                        String newName = PREFIX + Integer.parseInt(l) / 10000;
                        if (name.equals(newName)) {
                            list.add(name);
                        }
                    }
                }
            }
            if (list.size() > 0) {
                return list;
            }
            throw new UnsupportedOperationException("没有匹配到可用库");
        } else {
            throw new UnsupportedOperationException("分片列为空");
        }
    }
}

可以和其他的自定义规则放到一起,互不影响

使用:

databaseStrategy:
        standard:
          shardingColumn: STR_AREA_CODE
          rangeAlgorithmClassName: com.standard.LocalRangeShardingAlgorithm

 3.两者一起使用也可以

 databaseStrategy:
        standard:
          shardingColumn: STR_AREA_CODE
          preciseAlgorithmClassName: com.standard.LocalPreciseShardingAlgorithm
          rangeAlgorithmClassName: com.standard.LocalRangeShardingAlgorithm

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章