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 | public class YdalAutoConfigurationImportFilter implements AutoConfigurationImportFilter { |
- 将
YdalAutoConfigurationImportFilter
加入META-INF/spring.factories