Sharding Sphere3.0.0下的springboot+druid+分表配置详解

简书 慢黑八
转载请注明原创出处,谢谢!
如果读完觉得有收获的话,欢迎点赞加关注

自Sharding JDBC进入apache孵化之后(目前已经正式更名为Sharding Sphere,本文中简称SS),使用SS进行分库分表操作的小伙伴日益增加,由于新旧版本在配置上差异比较大,且资料较少,本文主要讲述如何在springboot下整合ss分表+zookeeper+druid的相关配置。

一、配置maven与application.properties

maven 配置

<!-- sharding-jdbc-orchestration-spring-boot-starter -->
<!-- for spring boot -->
<dependency>
    <groupId>io.shardingsphere</groupId>
    <artifactId>sharding-jdbc-orchestration-spring-boot-starter</artifactId>
    <version>3.0.0</version>
<dependency>
    <groupId>io.shardingsphere</groupId>
    <artifactId>sharding-orchestration-reg-zookeeper-curator</artifactId>
    <version>3.0.0</version>
</dependency>

application.properties/application-[dev|test|prod].properties

## 多个ds,用逗号分隔分别配置,例如:sharding.jdbc.datasource.names=ds1,ds2
##DataSourceUtil负责加载
sharding.jdbc.datasource.names=ds

sharding.jdbc.datasource.ds.type=com.alibaba.druid.pool.DruidDataSource
sharding.jdbc.datasource.ds.driver-class-name=com.mysql.jdbc.Driver
sharding.jdbc.datasource.ds.url=jdbc:mysql://localhost:3306/xxxx
sharding.jdbc.datasource.ds.username=root
sharding.jdbc.datasource.ds.password=

sharding.jdbc.datasource.ds.initial-size=8
sharding.jdbc.datasource.ds.min-idle=5
sharding.jdbc.datasource.ds.max-active=10
sharding.jdbc.datasource.ds.query-timeout=6000
sharding.jdbc.datasource.ds.transaction-query-timeout=6000
sharding.jdbc.datasource.ds.remove-abandoned-timeout=1800
sharding.jdbc.datasource.ds.filter-class-names=stat
sharding.jdbc.datasource.ds.filters=stat,config
sharding.jdbc.datasource.ds.testOnBorrow=false
## 以下为分表配置
sharding.jdbc.config.sharding.tables.t_order.actual-data-nodes=ds.t_order_$->{0..1}
sharding.jdbc.config.sharding.tables.t_order.table-strategy.inline.sharding-column=order_id
sharding.jdbc.config.sharding.tables.t_order.table-strategy.inline.algorithm-expression=t_order_$->{order_id.hashCode()  % 2}

sharding.jdbc.config.sharding.tables.t_order_item.actual-data-nodes=ds.t_order_item_$->{0..1}
sharding.jdbc.config.sharding.tables.t_order_item.table-strategy.inline.sharding-column=order_id
sharding.jdbc.config.sharding.tables.t_order_item.table-strategy.inline.algorithm-expression=t_order_item_$->{order_id.hashCode() % 2}
sharding.jdbc.config.sharding.tables.t_order_item.key-generator-column-name=order_item_id

##如果有关联表没配置绑定有可能会出现笛卡尔积
sharding.jdbc.config.sharding.binding-tables[0]=t_order,t_order_item
sharding.jdbc.config.sharding.props.sql.show=true

##zk配置相关信息
sharding.jdbc.config.orchestration.name=sharding-sample-service
sharding.jdbc.config.orchestration.overwrite=true
sharding.jdbc.config.orchestration.registry.namespace=sharding-sample-service
sharding.jdbc.config.orchestration.registry.server-lists=localhost:2181

二、sharding-jdbc-orchestration-spring-boot-starter中四个关键配置类

  1. starter启动配置类:OrchestrationSpringBootConfiguration
  2. datasource配置类:DataSourceUtil
  3. 分表策略配置类:SpringBootShardingRuleConfigurationProperties
  4. orche公共配置类:SpringBootOrchestrationConfigurationProperties
sharding-sphere 配置类

1、OrchestrationSpringBootConfiguration这个类为sharding-jdbc-orchestration-spring-boot-starter配置自动加载类,聚合类各项配置,可以看到这里的setDataSourceMap方法加载的都是sharding.jdbc.datasource.names开头的配置

@Configuration
@EnableConfigurationProperties({SpringBootShardingRuleConfigurationProperties.class, SpringBootMasterSlaveRuleConfigurationProperties.class, SpringBootOrchestrationConfigurationProperties.class})
public class OrchestrationSpringBootConfiguration implements EnvironmentAware {
    
    private final Map<String, DataSource> dataSourceMap = new LinkedHashMap<>();
    
    @Autowired
    private SpringBootShardingRuleConfigurationProperties shardingProperties;
    
    @Autowired
    private SpringBootMasterSlaveRuleConfigurationProperties masterSlaveProperties;
    
    @Autowired
    private SpringBootOrchestrationConfigurationProperties orchestrationProperties;

    //.......略去一部分源码
    //......................

     @Override
    public final void setEnvironment(final Environment environment) {
        setDataSourceMap(environment);
    }
    
    @SuppressWarnings("unchecked")
    private void setDataSourceMap(final Environment environment) {
        String prefix = "sharding.jdbc.datasource.";
        String dataSources = environment.getProperty(prefix + "names");
        if (StringUtils.isEmpty(dataSources)) {
            return;
        }
        dataSources = dataSources.trim();
        for (String each : dataSources.split(",")) {
            try {
                Map<String, Object> dataSourceProps = PropertyUtil.handle(environment, prefix + each, Map.class);
                Preconditions.checkState(!dataSourceProps.isEmpty(), String.format("Wrong datasource [%s] properties!", each));
                DataSource dataSource = DataSourceUtil.getDataSource(dataSourceProps.get("type").toString(), dataSourceProps);
                dataSourceMap.put(each, dataSource);
            } catch (final ReflectiveOperationException ex) {
                throw new ShardingException("Can't find datasource type!", ex);
            }
        }
    }
}

2、DataSourceUtil数据源配置类,这个类中最关键的一个方法是使用callSetterMethod方法,反射调用属性的set方法进行赋值操作。因为我们使用的是com.alibaba.druid.pool.DruidDataSource,所以直接使用DruidDataSource属性进行配置即可。需要额外注意的是,这里面存在配置属性转换,min-idle这种配置对应的是DruidDataSource类中的minIdle

public static DataSource getDataSource(final String dataSourceClassName, final Map<String, Object> dataSourceProperties) throws ReflectiveOperationException {
    DataSource result = (DataSource) Class.forName(dataSourceClassName).newInstance();
    for (Entry<String, Object> entry : dataSourceProperties.entrySet()) {
        callSetterMethod(result, getSetterMethodName(entry.getKey()), null == entry.getValue() ? null : entry.getValue().toString());
    }
    return result;
}

3、SpringBootShardingRuleConfigurationProperties分库分表配置类(sharding.jdbc.config.sharding开头的配置),具体的配置信息取决于YamlShardingRuleConfiguration类中的成员变量。

@ConfigurationProperties(prefix = "sharding.jdbc.config.sharding")
public class SpringBootShardingRuleConfigurationProperties extends YamlShardingRuleConfiguration {
}

4、SpringBootOrchestrationConfigurationProperties公共信息配置类(sharding.jdbc.config.orchestration开头的配置),具体的配置信息取决于YamlOrchestrationConfiguration类中的成员变量。

@ConfigurationProperties(prefix = "sharding.jdbc.config.orchestration")
public class SpringBootOrchestrationConfigurationProperties extends YamlOrchestrationConfiguration {
}

清楚了以上4个配置类后,小伙伴们是不是就知道应该如何配置sharding sphere了呢?小伙伴们可以根据配置类举一反三,反推分库分表的配置信息。

三、附录

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,179评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,229评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,032评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,533评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,531评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,539评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,916评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,813评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,568评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,654评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,354评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,937评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,918评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,152评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,852评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,378评论 2 342