官方文檔:官方文檔

分片算法
類圖:

分片算法.png
所有的分片算法都有一個共同的方法(doSharding),因為參數(shù)不同,所以并沒有在ShardingAlgorithm中體現(xiàn)。代碼如下:
public interface ShardingAlgorithm {
}
public interface HintShardingAlgorithm extends ShardingAlgorithm {
Collection<String> doSharding(Collection<String> availableTargetNames, ShardingValue shardingValue);
}
public interface ComplexKeysShardingAlgorithm extends ShardingAlgorithm {
Collection<String> doSharding(Collection<String> availableTargetNames, Collection<ShardingValue> shardingValues);
}
public interface PreciseShardingAlgorithm<T extends Comparable<?>> extends ShardingAlgorithm {
String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<T> shardingValue);
}
public interface RangeShardingAlgorithm<T extends Comparable<?>> extends ShardingAlgorithm {
Collection<String> doSharding(Collection<String> availableTargetNames, RangeShardingValue<T> shardingValue);
}

分片策略

分片策略.png
分片策略主要有兩個方法,一個是獲取分片項,一個是分片,分片主要是依賴于分片算法做分片,具體代碼如下:
public interface ShardingStrategy {
//獲取分片項
Collection<String> getShardingColumns();
//做分片
Collection<String> doSharding(Collection<String> availableTargetNames, Collection<ShardingValue> shardingValues);
}
復(fù)合分片算法實現(xiàn)如下:
public final class ComplexShardingStrategy implements ShardingStrategy {
//分片項
@Getter
private final Collection<String> shardingColumns;
//分片算法
private final ComplexKeysShardingAlgorithm shardingAlgorithm;
public ComplexShardingStrategy(final ComplexShardingStrategyConfiguration complexShardingStrategyConfig) {
shardingColumns = new TreeSet<>(String.CASE_INSENSITIVE_ORDER);
//分片配置中獲取所有的分片項,保存在shardingColumns中。
shardingColumns.addAll(StringUtil.splitWithComma(complexShardingStrategyConfig.getShardingColumns()));
//初始化分片算法
shardingAlgorithm = complexShardingStrategyConfig.getShardingAlgorithm();
}
@Override
public Collection<String> doSharding(final Collection<String> availableTargetNames, final Collection<ShardingValue> shardingValues) {
//調(diào)用分片算法做分片
Collection<String> shardingResult = shardingAlgorithm.doSharding(availableTargetNames, shardingValues);
Collection<String> result = new TreeSet<>(String.CASE_INSENSITIVE_ORDER);
//組裝分片結(jié)果并返回
result.addAll(shardingResult);
return result;
}
}
其他分片策略類似。
分片策略的初始化,是按照不同的分片策略配置,分片策略配置如下:

分片配置.png
代碼很簡單,就不列出來了。
分片策略是如何被初始化的?
工廠模式,按照不同的策略配置類型初始化不同的策略。
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class ShardingStrategyFactory {
public static ShardingStrategy newInstance(final ShardingStrategyConfiguration shardingStrategyConfig) {
if (shardingStrategyConfig instanceof StandardShardingStrategyConfiguration) {
return new StandardShardingStrategy((StandardShardingStrategyConfiguration) shardingStrategyConfig);
}
if (shardingStrategyConfig instanceof InlineShardingStrategyConfiguration) {
return new InlineShardingStrategy((InlineShardingStrategyConfiguration) shardingStrategyConfig);
}
if (shardingStrategyConfig instanceof ComplexShardingStrategyConfiguration) {
return new ComplexShardingStrategy((ComplexShardingStrategyConfiguration) shardingStrategyConfig);
}
if (shardingStrategyConfig instanceof HintShardingStrategyConfiguration) {
return new HintShardingStrategy((HintShardingStrategyConfiguration) shardingStrategyConfig);
}
return new NoneShardingStrategy();
}
}
the end。