Sharding-JDBC(ShardingSphere)作为分布式数据库中间件,在Java的JDBC层提供的额外服务。它使用客户端直连数据库,以jar包形式提供服务。引入sharding-jdbc-spring-boot-starter可以快速完成与springboot的集成; 但是默认情况下只能支持到一个数据库,如果支持多数据库,需要做部分扩展;本文记录支持多数据库所做的扩展。
引入依赖 1 2 3 4 5 <dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>sharding-jdbc-spring-boot-starter</artifactId> <version>4.0.1</version> </dependency>
扩展部分
1 Map<String, Object> databases = PropertyUtil.handle(environment, "spring.ydal" , Map.class);
构造每个数据库的数据库的MasterSlave数据源
1 2 3 4 5 6 7 8 9 10 11 12 13 14 Map<String, Object> dataSourceProps = PropertyUtil.handle(environment, "spring.eldal." + dataBaseName+"datasource", Map.class); Preconditions.checkState(!dataSourceProps.isEmpty(), "Wrong datasource properties!"); DataSource datasource = DataSourceUtil.getDataSource(dataSourceProps.get("type").toString(), dataSourceProps); Optional<DataSourcePropertiesSetter> dataSourcePropertiesSetter = DataSourcePropertiesSetterHolder.getDataSourcePropertiesSetterByType(dataSourceProps.get("type").toString()); if (dataSourcePropertiesSetter.isPresent()) { dataSourcePropertiesSetter.get().propertiesSet(environment, prefix, dataSourceName, datasource); } masterSlaveRule = PropertyUtil.handle(environment, "spring.eldal." + dataBaseName+".masterslave", YamlMasterSlaveRuleConfiguration.class); MasterSlaveRuleConfiguration msConfig = new MasterSlaveRuleConfigurationYamlSwapper().swap(masterSlaveRule); Properties dsProps = PropertyUtil.handle(environment, "spring.eldal." + dataBaseName+".props", Properties.class); MasterSlaveDataSourceFactory.createDataSource(datasource, msConfig, dsProps)
禁用ShardingSphere的Springboot的自动配置 实现该扩展后以jar包的形式提供出去供多个项目使用,所以我们必须在jar里面禁用ShardingSphere的Springboot的自动配置;可以实现如下接口:
1 2 3 4 5 6 7 8 9 10 11 12 13 public class YdalAutoConfigurationImportFilter implements AutoConfigurationImportFilter { private static final Set<String> SHOULD_SKIP = new HashSet<>( Arrays.asList("org.apache.shardingsphere.shardingjdbc.spring.boot.SpringBootConfiguration")); @Override public boolean[] match(String[] autoConfigurationClasses, AutoConfigurationMetadata autoConfigurationMetadata) { boolean[] matches = new boolean[autoConfigurationClasses.length]; for(int i = 0; i< autoConfigurationClasses.length; i++) { matches[i] = !SHOULD_SKIP.contains(autoConfigurationClasses[i]); } return matches; } }
将YdalAutoConfigurationImportFilter加入META-INF/spring.factories
最后