Sharding-JDBC(ShardingSphere)作为分布式数据库中间件,在Java的JDBC层提供的额外服务。它使用客户端直连数据库,以jar包形式提供服务。引入sharding-jdbc-spring-boot-starter
可以快速完成与springboot的集成; 但是默认情况下只能支持到一个数据库,如果支持多数据库,需要做部分扩展;本文记录支持多数据库所做的扩展。
引入依赖
1 | <dependency> |
扩展部分
实现
EnvironmentAware
接口 ,在方法setEnvironment
解析properties配置可以获取所有配置信息获取以
spring.ydal
为前缀的所有数据库配置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
14Map<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
13public 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