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

 

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