Sharding核心配置主要如下(官网):
分片规则
分片规则配置的总入口。包含数据源配置、表配置、绑定表配置以及读写分离配置等
数据源配置
真实数据源列表
表配置
逻辑表名称、数据节点与分表规则的配置
数据节点配置
用于配置逻辑表与真实表的映射关系。可分为均匀分布和自定义分布两种形式;这两种形式通过人为自行配置
分片策略配置
对于分片策略存有数据源分片策略和表分片策略两种维度
数据源分片策略:
对应于DatabaseShardingStrategy。用于配置数据被分配的目标数据源
表分片策略
对应于TableShardingStrategy。用于配置数据被分配的目标表,该目标表存在与该数据的目标数据源内。故表分片策略是依赖与数据源分片策略的结果的自增主键生成策略
通过在客户端生成自增主键替换以数据库原生自增主键的方式,做到分布式主键无重复。
接下来对各个核心配置进行分析:
1.以多主多从读写分离、表分片为例
public final class ShardingMasterSlaveConfigurationPrecise implements ExampleConfiguration {@Overridepublic DataSource getDataSource() throws SQLException {ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();//分片表规则配置shardingRuleConfig.getTableRuleConfigs().add(getOrderTableRuleConfiguration());shardingRuleConfig.getTableRuleConfigs().add(getOrderItemTableRuleConfiguration());shardingRuleConfig.getBindingTableGroups().add("t_order, t_order_item");//设置默认数据源分片策略shardingRuleConfig.setDefaultDatabaseShardingStrategyConfig(new StandardShardingStrategyConfiguration("user_id", new PreciseModuloShardingDatabaseAlgorithm()));//设置默认表分片策略shardingRuleConfig.setDefaultTableShardingStrategyConfig(new StandardShardingStrategyConfiguration("order_id", new PreciseModuloShardingTableAlgorithm()));//主从配置,支持多主多从shardingRuleConfig.setMasterSlaveRuleConfigs(getMasterSlaveRuleConfigurations());//创建ShardingDataSource数据源return ShardingDataSourceFactory.createDataSource(createDataSourceMap(), shardingRuleConfig, new Properties());}private static TableRuleConfiguration getOrderTableRuleConfiguration() {//分片表配置TableRuleConfiguration result = new TableRuleConfiguration(/*逻辑表*/"t_order", /*数据源名.真实表*/"ds_${0..1}.t_order_${[0, 1]}");//自定义主键生成配置result.setKeyGeneratorConfig(new KeyGeneratorConfiguration("SNOWFLAKE", "order_id", getProperties()));return result;}private static TableRuleConfiguration getOrderItemTableRuleConfiguration() {TableRuleConfiguration result = new TableRuleConfiguration("t_order_item", "ds_${0..1}.t_order_item_${[0, 1]}");result.setKeyGeneratorConfig(new KeyGeneratorConfiguration("SNOWFLAKE", "order_item_id", getProperties()));return result;}private static List<MasterSlaveRuleConfiguration> getMasterSlaveRuleConfigurations() {MasterSlaveRuleConfiguration masterSlaveRuleConfig1 = new MasterSlaveRuleConfiguration("ds_0", "demo_ds_master_0", Arrays.asList("demo_ds_master_0_slave_0", "demo_ds_master_0_slave_1"));MasterSlaveRuleConfiguration masterSlaveRuleConfig2 = new MasterSlaveRuleConfiguration("ds_1", "demo_ds_master_1", Arrays.asList("demo_ds_master_1_slave_0", "demo_ds_master_1_slave_1"));return Lists.newArrayList(masterSlaveRuleConfig1, masterSlaveRuleConfig2);}private static Map<String, DataSource> createDataSourceMap() {final Map<String, DataSource> result = new HashMap<>();result.put("demo_ds_master_0", DataSourceUtil.createDataSource("demo_ds_master_0"));result.put("demo_ds_master_0_slave_0", DataSourceUtil.createDataSource("demo_ds_master_0_slave_0"));result.put("demo_ds_master_0_slave_1", DataSourceUtil.createDataSource("demo_ds_master_0_slave_1"));result.put("demo_ds_master_1", DataSourceUtil.createDataSource("demo_ds_master_1"));result.put("demo_ds_master_1_slave_0", DataSourceUtil.createDataSource("demo_ds_master_1_slave_0"));result.put("demo_ds_master_1_slave_1", DataSourceUtil.createDataSource("demo_ds_master_1_slave_1"));return result;}private static Properties getProperties() {Properties result = new Properties();result.setProperty("worker.id", "123");return result;}}
2.ShardingRuleConfiguration分片规则核心配置
@Getter@Setterpublic final class ShardingRuleConfiguration implements RuleConfiguration {//表规则配置private Collection<TableRuleConfiguration> tableRuleConfigs = new LinkedList<>();//绑定表配置private Collection<String> bindingTableGroups = new LinkedList<>();//广播表配置private Collection<String> broadcastTables = new LinkedList<>();//默认数据源名称private String defaultDataSourceName;//默认分库策略private ShardingStrategyConfiguration defaultDatabaseShardingStrategyConfig;//默认分片策略private ShardingStrategyConfiguration defaultTableShardingStrategyConfig;//默认主键生成工具类private KeyGeneratorConfiguration defaultKeyGeneratorConfig;//主从规则配置private Collection<MasterSlaveRuleConfiguration> masterSlaveRuleConfigs = new LinkedList<>();//数据脱敏规则配置private EncryptRuleConfiguration encryptRuleConfig;}
3.分析ShardingDataSourceFactory#createDataSource中的ShardingRule配置
/*** Sharding data source factory.** @author zhangliang*/@NoArgsConstructor(access = AccessLevel.PRIVATE)public final class ShardingDataSourceFactory {/*** Create sharding data source.** @param dataSourceMap data source map* @param shardingRuleConfig rule configuration for databases and tables sharding* @param props properties for data source* @return sharding data source* @throws SQLException SQL exception*/public static DataSource createDataSource(final Map<String, DataSource> dataSourceMap, final ShardingRuleConfiguration shardingRuleConfig, final Properties props) throws SQLException {//创建ShardingDataSource数据源,同时创建sharding rule配置return new ShardingDataSource(dataSourceMap, new ShardingRule(shardingRuleConfig, dataSourceMap.keySet()), props);}}
4.ShardingRule分片规则
public ShardingRule(final ShardingRuleConfiguration shardingRuleConfig, final Collection<String> dataSourceNames) {Preconditions.checkArgument(null != shardingRuleConfig, "ShardingRuleConfig cannot be null.");Preconditions.checkArgument(null != dataSourceNames && !dataSourceNames.isEmpty(), "Data sources cannot be empty.");this.shardingRuleConfig = shardingRuleConfig;//sharding数据源名称shardingDataSourceNames = new ShardingDataSourceNames(shardingRuleConfig, dataSourceNames);//创建表规则集合tableRules = createTableRules(shardingRuleConfig);//创建分组绑定表//1.从tableRules查找//2.是否广播表,如果是广播表,dataSourceNames.size() == 1 ? dataSourceNames.iterator().next() : shardingRuleConfig.getDefaultDataSourceName();//3.已上两种情况都不满足,则使用默认数据源创建tableRulebindingTableRules = createBindingTableRules(shardingRuleConfig.getBindingTableGroups());//广播表broadcastTables = shardingRuleConfig.getBroadcastTables();//默认分库策略defaultDatabaseShardingStrategy = createDefaultShardingStrategy(shardingRuleConfig.getDefaultDatabaseShardingStrategyConfig());//默认表分片策略defaultTableShardingStrategy = createDefaultShardingStrategy(shardingRuleConfig.getDefaultTableShardingStrategyConfig());//默认主键生成工具类defaultShardingKeyGenerator = createDefaultKeyGenerator(shardingRuleConfig.getDefaultKeyGeneratorConfig());//创建主从规则masterSlaveRules = createMasterSlaveRules(shardingRuleConfig.getMasterSlaveRuleConfigs());//数据脱敏规则encryptRule = createEncryptRule(shardingRuleConfig.getEncryptRuleConfig());}
5.TableRule表规则
public TableRule(final TableRuleConfiguration tableRuleConfig, final ShardingDataSourceNames shardingDataSourceNames, final String defaultGenerateKeyColumn) {//获取逻辑表logicTable = tableRuleConfig.getLogicTable().toLowerCase();//inline表达式解析出真实表,比如:ds_${0..1}.t_order_${[0, 1]}//解析出来为://ds_0.t_order_0//ds_0.t_order_1//ds_1.t_order_0//ds_1.t_order_1List<String> dataNodes = new InlineExpressionParser(tableRuleConfig.getActualDataNodes()).splitAndEvaluate();dataNodeIndexMap = new HashMap<>(dataNodes.size(), 1);//真实表数据节点//1.如果没有配置真实表,则根据逻辑表、数据源来生成对应真实表数据节点//2.否则根据inline表达式解析出来的真实表来生成真实数据节点actualDataNodes = isEmptyDataNodes(dataNodes)? generateDataNodes(tableRuleConfig.getLogicTable(), shardingDataSourceNames.getDataSourceNames()) : generateDataNodes(dataNodes, shardingDataSourceNames.getDataSourceNames());//真实表actualTables = getActualTables();//数据源->分片策略databaseShardingStrategy = null == tableRuleConfig.getDatabaseShardingStrategyConfig() ? null : ShardingStrategyFactory.newInstance(tableRuleConfig.getDatabaseShardingStrategyConfig());//表->分片策略tableShardingStrategy = null == tableRuleConfig.getTableShardingStrategyConfig() ? null : ShardingStrategyFactory.newInstance(tableRuleConfig.getTableShardingStrategyConfig());//主键字段generateKeyColumn = getGenerateKeyColumn(tableRuleConfig.getKeyGeneratorConfig(), defaultGenerateKeyColumn);//生成主键工具类,比如SNOWFLAKEshardingKeyGenerator = containsKeyGeneratorConfiguration(tableRuleConfig)? new ShardingKeyGeneratorServiceLoader().newService(tableRuleConfig.getKeyGeneratorConfig().getType(), tableRuleConfig.getKeyGeneratorConfig().getProperties()) : null;}
文章转载自帽爹的技术轮子,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




