Logo
异构双写

背景信息 #

异构双写 Java API 规则配置允许用户直接通过编写 Java 代码的方式,完成对象的创建,Java API 的配置方式非常灵活,不需要依赖额外的 jar 包 就能够集成各种类型的业务系统。

参数解释 #

配置入口 #

类名称:com.sphereex.dbplusengine.dualwrite.config.DualWriteRuleConfiguration

可配置属性:

名称数据类型说明默认值
dataSources (+)Collection<DualWriteDataSourceRuleConfiguration>双写数据源配置
interceptors (+)Map<String, AlgorithmConfiguration>拦截器算法名称和配置
loadBalancers (+)Map<String, AlgorithmConfiguration>负载均衡算法名称和配置
keyGenerateStrategies (+)Map<String, KeyGenerateStrategiesConfiguration>主键生成策略名称和配置
keyGenerators (+)Map<String, AlgorithmConfiguration>主键生成算法名称和配置

DualWriteDataSourceRuleConfiguration #

类名称:com.sphereex.dbplusengine.dualwrite.config.rule.DualWriteDataSourceRuleConfiguration

可配置属性:

名称数据类型说明默认值
nameString双写数据源逻辑名称
primaryDataSourceNameString主数据源(双写退化后以主数据为准,单写单读)
writeDataSourceNamesList写数据源
readDataSourceNamesList读数据源
interceptorNameString读流量拦截器,拦截的流量进行读负载均衡默认拦截全部读流量
loadBalancerNameString读流量负载均衡算法默认为 ROUND_ROBIN

ColumnKeyGenerateStrategiesRuleConfiguration #

类名称:org.apache.shardingsphere.infra.config.keygen.impl.ColumnKeyGenerateStrategiesRuleConfiguration

可配置属性:

名称数据类型说明默认值
keyGeneratorNameString主键生成算法名称
logicTableString逻辑表名称
keyGenerateColumnString主键生成列名称

SequenceKeyGenerateStrategiesRuleConfiguration #

类名称:org.apache.shardingsphere.infra.config.keygen.impl.SequenceKeyGenerateStrategiesRuleConfiguration

可配置属性:

名称数据类型说明默认值
keyGeneratorNameString主键生成算法名称
keyGenerateSequenceString序列名称

算法类型的详情,请参见内置算法 - 异构双写拦截器算法内置算法 - 负载均衡算法 以及 内置算法 - 分布式序列算法

操作步骤 #

  1. 创建真实数据源映射关系,key 为数据源逻辑名称,value 为 DataSource 对象;
  2. 创建异构双写规则对象 DualWriteRuleConfiguration,并初始化对象中的双写数据源配置 DualWriteDataSourceRuleConfiguration、主键生成策略配置 ColumnKeyGenerateStrategiesRuleConfigurationSequenceKeyGenerateStrategiesRuleConfiguration 及拦截器算法、负载均衡算法、主键生成算法等参数;

配置示例 #

import com.sphereex.dbplusengine.dualwrite.config.DualWriteRuleConfiguration;
import com.sphereex.dbplusengine.dualwrite.config.rule.DualWriteDataSourceRuleConfiguration;
import org.apache.shardingsphere.infra.algorithm.core.config.AlgorithmConfiguration;
import org.apache.shardingsphere.infra.config.keygen.KeyGenerateStrategiesConfiguration;
import org.apache.shardingsphere.infra.config.keygen.impl.ColumnKeyGenerateStrategiesRuleConfiguration;

import java.sql.SQLException;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Properties;

public final class DualWriteConfigurationExample implements ExampleConfiguration {
    
    @Override
    public DataSource getDataSource() {
        Map<String, AlgorithmConfiguration> loadBalancers = new LinkedHashMap<>();
        loadBalancers.put("random", new AlgorithmConfiguration("RANDOM", new Properties()));
        Map<String, KeyGenerateStrategiesConfiguration> keyGenerateStrategies = new LinkedHashMap<>();
        keyGenerateStrategies.put("t_order", new ColumnKeyGenerateStrategiesRuleConfiguration("snowflake", "t_order", "order_id"));
        Map<String, AlgorithmConfiguration> keyGenerators = new LinkedHashMap<>();
        keyGenerators.put("snowflake", new AlgorithmConfiguration("SNOWFLAKE", new Properties()));
        DualWriteRuleConfiguration ruleConfig = new DualWriteRuleConfiguration(
                Collections.singleton(new DualWriteDataSourceRuleConfiguration(
                        "dual_write_ds", "oracle_ds", Collections.singletonList("oracle_ds"), Collections.singletonList("oracle_ds"), null, "random")),
                Collections.emptyMap(), loadBalancers, keyGenerateStrategies, keyGenerators);
        try {
            return ShardingSphereDataSourceFactory.createDataSource(DataSourceUtil.createDataSource("dual_write_db"), Collections.singleton(ruleConfig), new Properties());
        } catch (final SQLException ex) {
            ex.printStackTrace();
            return null;
        }
    }
}