背景信息 #
异构双写 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
可配置属性:
| 名称 | 数据类型 | 说明 | 默认值 |
|---|---|---|---|
| name | String | 双写数据源逻辑名称 | |
| primaryDataSourceName | String | 主数据源(双写退化后以主数据为准,单写单读) | |
| writeDataSourceNames | List | 写数据源 | |
| readDataSourceNames | List | 读数据源 | |
| interceptorName | String | 读流量拦截器,拦截的流量进行读负载均衡 | 默认拦截全部读流量 |
| loadBalancerName | String | 读流量负载均衡算法 | 默认为 ROUND_ROBIN |
ColumnKeyGenerateStrategiesRuleConfiguration #
类名称:org.apache.shardingsphere.infra.config.keygen.impl.ColumnKeyGenerateStrategiesRuleConfiguration
可配置属性:
| 名称 | 数据类型 | 说明 | 默认值 |
|---|---|---|---|
| keyGeneratorName | String | 主键生成算法名称 | |
| logicTable | String | 逻辑表名称 | |
| keyGenerateColumn | String | 主键生成列名称 |
SequenceKeyGenerateStrategiesRuleConfiguration #
类名称:org.apache.shardingsphere.infra.config.keygen.impl.SequenceKeyGenerateStrategiesRuleConfiguration
可配置属性:
| 名称 | 数据类型 | 说明 | 默认值 |
|---|---|---|---|
| keyGeneratorName | String | 主键生成算法名称 | |
| keyGenerateSequence | String | 序列名称 |
算法类型的详情,请参见内置算法 - 异构双写拦截器算法、内置算法 - 负载均衡算法 以及 内置算法 - 分布式序列算法。
操作步骤 #
- 创建真实数据源映射关系,key 为数据源逻辑名称,value 为 DataSource 对象;
- 创建异构双写规则对象
DualWriteRuleConfiguration,并初始化对象中的双写数据源配置DualWriteDataSourceRuleConfiguration、主键生成策略配置ColumnKeyGenerateStrategiesRuleConfiguration或SequenceKeyGenerateStrategiesRuleConfiguration及拦截器算法、负载均衡算法、主键生成算法等参数;
配置示例 #
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;
}
}
}