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

簡(jiǎn)書 慢黑八
轉(zhuǎn)載請(qǐng)注明原創(chuàng)出處,謝謝榕订!
如果讀完覺(jué)得有收獲的話,歡迎點(diǎn)贊加關(guān)注

自Sharding JDBC進(jìn)入apache孵化之后(目前已經(jīng)正式更名為Sharding Sphere贩幻,本文中簡(jiǎn)稱SS)两嘴,使用SS進(jìn)行分庫(kù)分表操作的小伙伴日益增加,由于新舊版本在配置上差異比較大趣些,且資料較少贰您,本文主要講述如何在springboot下整合ss分表+zookeeper+druid的相關(guān)配置。

一舶替、配置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

## 多個(gè)ds杠园,用逗號(hào)分隔分別配置,例如:sharding.jdbc.datasource.names=ds1玲昧,ds2
##DataSourceUtil負(fù)責(zé)加載
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

##如果有關(guān)聯(lián)表沒(méi)配置綁定有可能會(huì)出現(xiàn)笛卡爾積
sharding.jdbc.config.sharding.binding-tables[0]=t_order,t_order_item
sharding.jdbc.config.sharding.props.sql.show=true

##zk配置相關(guān)信息
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中四個(gè)關(guān)鍵配置類

  1. starter啟動(dòng)配置類:OrchestrationSpringBootConfiguration
  2. datasource配置類:DataSourceUtil
  3. 分表策略配置類:SpringBootShardingRuleConfigurationProperties
  4. orche公共配置類:SpringBootOrchestrationConfigurationProperties
sharding-sphere 配置類

1尘应、OrchestrationSpringBootConfiguration這個(gè)類為sharding-jdbc-orchestration-spring-boot-starter配置自動(dòng)加載類吼虎,聚合類各項(xiàng)配置,可以看到這里的setDataSourceMap方法加載的都是sharding.jdbc.datasource.names開(kāi)頭的配置

@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數(shù)據(jù)源配置類,這個(gè)類中最關(guān)鍵的一個(gè)方法是使用callSetterMethod方法洒疚,反射調(diào)用屬性的set方法進(jìn)行賦值操作坯屿。因?yàn)槲覀兪褂玫氖莄om.alibaba.druid.pool.DruidDataSource领跛,所以直接使用DruidDataSource屬性進(jìn)行配置即可撤奸。需要額外注意的是,這里面存在配置屬性轉(zhuǎn)換胧瓜,min-idle這種配置對(duì)應(yīng)的是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分庫(kù)分表配置類(sharding.jdbc.config.sharding開(kāi)頭的配置),具體的配置信息取決于YamlShardingRuleConfiguration類中的成員變量幻妓。

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

4劫拢、SpringBootOrchestrationConfigurationProperties公共信息配置類(sharding.jdbc.config.orchestration開(kāi)頭的配置),具體的配置信息取決于YamlOrchestrationConfiguration類中的成員變量强胰。

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

清楚了以上4個(gè)配置類后偶洋,小伙伴們是不是就知道應(yīng)該如何配置sharding sphere了呢?小伙伴們可以根據(jù)配置類舉一反三玄窝,反推分庫(kù)分表的配置信息。

三帽氓、附錄

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末俩块,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子势腮,更是在濱河造成了極大的恐慌漫仆,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件署照,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡藤树,警方通過(guò)查閱死者的電腦和手機(jī)岁钓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)屡限,“玉大人,你說(shuō)我怎么就攤上這事翰撑“⊙耄” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵逝撬,是天一觀的道長(zhǎng)乓土。 經(jīng)常有香客問(wèn)我,道長(zhǎng)狡相,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任尽棕,我火速辦了婚禮彬伦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘氧敢。我一直安慰自己询张,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布唯袄。 她就那樣靜靜地躺著,像睡著了一般恋拷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上宴偿,一...
    開(kāi)封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天诀豁,我揣著相機(jī)與錄音,去河邊找鬼娩践。 笑死烹骨,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的沮焕。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼空入!你這毒婦竟也來(lái)了族檬?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤埋凯,失蹤者是張志新(化名)和其女友劉穎扫尖,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體换怖,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年悦污,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了钉蒲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡踏枣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出椰于,到底是詐尸還是另有隱情仪搔,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布偏陪,位于F島的核電站煮嫌,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏昌阿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一灶轰、第九天 我趴在偏房一處隱蔽的房頂上張望刷钢。 院中可真熱鬧,春花似錦内地、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)并蝗。三九已至秸妥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間粥惧,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工起惕, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留咏删,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓嘀粱,卻偏偏與公主長(zhǎng)得像辰狡,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子宛篇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345