Skip to content

Commit 9972dc2

Browse files
committed
ApiBoot DataSource Switch 集成.
1 parent 839f7dc commit 9972dc2

File tree

24 files changed

+1002
-3
lines changed

24 files changed

+1002
-3
lines changed

api-boot-project/api-boot-autoconfigure/pom.xml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,5 +118,22 @@
118118
<optional>true</optional>
119119
</dependency>
120120

121+
<!--ApiBoot DataSource Switch-->
122+
<dependency>
123+
<groupId>com.zaxxer</groupId>
124+
<artifactId>HikariCP</artifactId>
125+
<optional>true</optional>
126+
</dependency>
127+
<dependency>
128+
<groupId>com.alibaba</groupId>
129+
<artifactId>druid</artifactId>
130+
<optional>true</optional>
131+
</dependency>
132+
<dependency>
133+
<groupId>org.minbox.framework</groupId>
134+
<artifactId>api-boot-plugin-datasource-switch</artifactId>
135+
<optional>true</optional>
136+
</dependency>
137+
121138
</dependencies>
122139
</project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
package org.minbox.framework.api.boot.autoconfigure.datasource;
2+
3+
import org.minbox.framework.api.boot.plugin.datasource.ApiBootDataSource;
4+
import org.minbox.framework.api.boot.plugin.datasource.ApiBootDataSourceFactoryBean;
5+
import org.minbox.framework.api.boot.plugin.datasource.aop.interceptor.ApiBootDataSourceSwitchAnnotationInterceptor;
6+
import org.minbox.framework.api.boot.plugin.datasource.aop.advistor.ApiBootDataSourceSwitchAdvisor;
7+
import org.minbox.framework.api.boot.plugin.datasource.config.DataSourceConfig;
8+
import org.minbox.framework.api.boot.plugin.datasource.routing.ApiBootRoutingDataSource;
9+
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
10+
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
11+
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
12+
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
13+
import org.springframework.boot.context.properties.EnableConfigurationProperties;
14+
import org.springframework.context.annotation.Bean;
15+
import org.springframework.context.annotation.Configuration;
16+
17+
import javax.sql.DataSource;
18+
import java.util.HashMap;
19+
import java.util.LinkedList;
20+
import java.util.List;
21+
import java.util.Map;
22+
23+
/**
24+
* ApiBoot DataSource Switch AutoConfiguration
25+
*
26+
* @author:恒宇少年 - 于起宇
27+
* <p>
28+
* DateTime:2019-04-01 22:06
29+
* Blog:http://blog.yuqiyu.com
30+
* WebSite:http://www.jianshu.com/u/092df3f77bca
31+
* Gitee:https://gitee.com/hengboy
32+
* GitHub:https://github.com/hengboy
33+
*/
34+
@Configuration
35+
@ConditionalOnClass(ApiBootDataSource.class)
36+
@EnableConfigurationProperties(ApiBootDataSourceSwitchProperties.class)
37+
@AutoConfigureBefore(DataSourceAutoConfiguration.class)
38+
public class ApiBootDataSourceSwitchAutoConfiguration {
39+
/**
40+
* ApiBoot DataSource Switch Properties
41+
*/
42+
private ApiBootDataSourceSwitchProperties apiBootDataSourceSwitchProperties;
43+
44+
public ApiBootDataSourceSwitchAutoConfiguration(ApiBootDataSourceSwitchProperties apiBootDataSourceSwitchProperties) {
45+
this.apiBootDataSourceSwitchProperties = apiBootDataSourceSwitchProperties;
46+
}
47+
48+
/**
49+
* ApiBoot DataSource FactoryBean
50+
* Used to create datasource
51+
*
52+
* @return ApiBootDataSourceFactoryBean
53+
*/
54+
@Bean
55+
@ConditionalOnMissingBean
56+
public ApiBootDataSourceFactoryBean apiBootDataSourceFactoryBean() {
57+
return new ApiBootDataSourceFactoryBean();
58+
}
59+
60+
/**
61+
* ApiBoot Routing DataSource
62+
* switch use datasource
63+
*
64+
* @param apiBootDataSourceFactoryBean ApiBoot DataSource FactoryBean
65+
* @return
66+
*/
67+
@Bean
68+
@ConditionalOnMissingBean
69+
public DataSource dataSource(ApiBootDataSourceFactoryBean apiBootDataSourceFactoryBean) {
70+
List<DataSourceConfig> dataSourceConfigList = new LinkedList();
71+
Map<String, DataSourceConfig> dataSourceConfigMap = new HashMap(1);
72+
73+
// put druid datasource config to map
74+
dataSourceConfigMap.putAll(apiBootDataSourceSwitchProperties.getDruid());
75+
// put hikari datasource config to map
76+
dataSourceConfigMap.putAll(apiBootDataSourceSwitchProperties.getHikari());
77+
78+
// convert all datasource config
79+
dataSourceConfigMap.keySet().stream().forEach(druidPoolName -> {
80+
DataSourceConfig dataSourceConfig = dataSourceConfigMap.get(druidPoolName);
81+
// set data source pool name
82+
dataSourceConfig.setPoolName(druidPoolName);
83+
// after convert add to data source list
84+
dataSourceConfigList.add(dataSourceConfig);
85+
});
86+
87+
return new ApiBootRoutingDataSource(apiBootDataSourceFactoryBean, apiBootDataSourceSwitchProperties.getPrimary(), dataSourceConfigList);
88+
}
89+
90+
/**
91+
* ApiBoot DataSource Switch Advice Interceptor
92+
*
93+
* @return ApiBootDataSourceSwitchAnnotationInterceptor
94+
*/
95+
@Bean
96+
@ConditionalOnMissingBean
97+
public ApiBootDataSourceSwitchAnnotationInterceptor apiBootDataSourceSwitchAnnotationInterceptor() {
98+
return new ApiBootDataSourceSwitchAnnotationInterceptor();
99+
}
100+
101+
/**
102+
* ApiBoot DataSource Switch Advisor
103+
* Used to get @DataSourceSwitch annotation define
104+
*
105+
* @return ApiBootDataSourceSwitchAdvisor
106+
*/
107+
@Bean
108+
@ConditionalOnMissingBean
109+
public ApiBootDataSourceSwitchAdvisor apiBootDataSourceSwitchAdvisor(ApiBootDataSourceSwitchAnnotationInterceptor apiBootDataSourceSwitchAnnotationInterceptor) {
110+
return new ApiBootDataSourceSwitchAdvisor(apiBootDataSourceSwitchAnnotationInterceptor);
111+
}
112+
113+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package org.minbox.framework.api.boot.autoconfigure.datasource;
2+
3+
import lombok.Data;
4+
import org.minbox.framework.api.boot.plugin.datasource.config.DataSourceDruidConfig;
5+
import org.minbox.framework.api.boot.plugin.datasource.config.DataSourceHikariConfig;
6+
import org.springframework.boot.context.properties.ConfigurationProperties;
7+
import org.springframework.context.annotation.Configuration;
8+
9+
import java.util.HashMap;
10+
import java.util.Map;
11+
12+
import static org.minbox.framework.api.boot.autoconfigure.datasource.ApiBootDataSourceSwitchProperties.API_BOOT_DATASOURCE_SWITCH_PREFIX;
13+
14+
/**
15+
* @author:恒宇少年 - 于起宇
16+
* <p>
17+
* DateTime:2019-04-02 09:48
18+
* Blog:http://blog.yuqiyu.com
19+
* WebSite:http://www.jianshu.com/u/092df3f77bca
20+
* Gitee:https://gitee.com/hengboy
21+
* GitHub:https://github.com/hengboy
22+
*/
23+
@Data
24+
@Configuration
25+
@ConfigurationProperties(prefix = API_BOOT_DATASOURCE_SWITCH_PREFIX)
26+
public class ApiBootDataSourceSwitchProperties {
27+
/**
28+
* ApiBoot DataSource Switch Config Prefix
29+
*/
30+
public static final String API_BOOT_DATASOURCE_SWITCH_PREFIX = "api.boot.datasource";
31+
/**
32+
* primary datasource pool name
33+
* default is master
34+
*/
35+
private String primary = "master";
36+
/**
37+
* config druid type datasource list
38+
*/
39+
public Map<String, DataSourceDruidConfig> druid = new HashMap();
40+
/**
41+
* config hikari type datasource list
42+
*/
43+
public Map<String, DataSourceHikariConfig> hikari = new HashMap();
44+
}

api-boot-project/api-boot-autoconfigure/src/main/resources/META-INF/spring.factories

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,5 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
88
org.minbox.framework.api.boot.autoconfigure.converter.HttpMessageConverterAutoConfiguration,\
99
org.minbox.framework.api.boot.autoconfigure.oss.ApiBootOssAutoConfiguration,\
1010
org.minbox.framework.api.boot.autoconfigure.sms.ApiBootSmsAutoConfiguration,\
11-
org.minbox.framework.api.boot.autoconfigure.quartz.ApiBootQuartzAutoConfiguration
11+
org.minbox.framework.api.boot.autoconfigure.quartz.ApiBootQuartzAutoConfiguration,\
12+
org.minbox.framework.api.boot.autoconfigure.datasource.ApiBootDataSourceSwitchAutoConfiguration

api-boot-project/api-boot-dependencies/pom.xml

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
<spring.boot.version>2.1.3.RELEASE</spring.boot.version>
1818
<mybatis.enhance.version>1.1.0.RELEASE</mybatis.enhance.version>
1919
<mybatis.pageable.version>1.0.6.RELEASE</mybatis.pageable.version>
20+
<druid.version>1.1.14</druid.version>
2021
<druid.starter.version>1.1.14</druid.starter.version>
2122
<fastjson.version>1.2.56</fastjson.version>
2223
<security.oauth2.version>2.3.5.RELEASE</security.oauth2.version>
@@ -73,6 +74,12 @@
7374
<version>${fastjson.version}</version>
7475
</dependency>
7576
<!--druid-->
77+
<dependency>
78+
<groupId>com.alibaba</groupId>
79+
<artifactId>druid</artifactId>
80+
<version>${druid.version}</version>
81+
</dependency>
82+
<!--druid starter-->
7683
<dependency>
7784
<groupId>com.alibaba</groupId>
7885
<artifactId>druid-spring-boot-starter</artifactId>
@@ -222,6 +229,18 @@
222229
<version>${project.version}</version>
223230
</dependency>
224231

232+
<!--ApiBoot DataSource Switch-->
233+
<dependency>
234+
<groupId>org.minbox.framework</groupId>
235+
<artifactId>api-boot-plugin-datasource-switch</artifactId>
236+
<version>${project.version}</version>
237+
</dependency>
238+
<dependency>
239+
<groupId>org.minbox.framework</groupId>
240+
<artifactId>api-boot-starter-datasource-switch</artifactId>
241+
<version>${project.version}</version>
242+
</dependency>
243+
225244
</dependencies>
226245
</dependencyManagement>
227246
</project>
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<parent>
6+
<artifactId>api-boot-plugins</artifactId>
7+
<groupId>org.minbox.framework</groupId>
8+
<version>2.0.3.RC1</version>
9+
</parent>
10+
<modelVersion>4.0.0</modelVersion>
11+
12+
<artifactId>api-boot-plugin-datasource-switch</artifactId>
13+
<description>
14+
ApiBoot DataSource Switch
15+
数据源切换:
16+
1. 多数据源配置
17+
2. 数据源路由器实现
18+
3. 配置使用指定数据源
19+
4. 动态使用指定数据源
20+
5. 动态创建数据源
21+
</description>
22+
<dependencies>
23+
<!--ApiBoot Plugin-->
24+
<dependency>
25+
<groupId>org.minbox.framework</groupId>
26+
<artifactId>api-boot-plugin</artifactId>
27+
</dependency>
28+
<!--HikariCP DataSource-->
29+
<dependency>
30+
<groupId>com.zaxxer</groupId>
31+
<artifactId>HikariCP</artifactId>
32+
<optional>true</optional>
33+
</dependency>
34+
<!--Druid DataSource-->
35+
<dependency>
36+
<groupId>com.alibaba</groupId>
37+
<artifactId>druid</artifactId>
38+
<optional>true</optional>
39+
</dependency>
40+
<dependency>
41+
<groupId>org.springframework.boot</groupId>
42+
<artifactId>spring-boot-starter-jdbc</artifactId>
43+
<optional>true</optional>
44+
</dependency>
45+
46+
</dependencies>
47+
</project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package org.minbox.framework.api.boot.plugin.datasource;
2+
3+
import org.minbox.framework.api.boot.common.exception.ApiBootException;
4+
5+
import javax.sql.DataSource;
6+
7+
/**
8+
* Api Boot DataSource 接口定义
9+
*
10+
* @author:恒宇少年 - 于起宇
11+
* <p>
12+
* DateTime:2019-04-01 14:55
13+
* Blog:http://blog.yuqiyu.com
14+
* WebSite:http://www.jianshu.com/u/092df3f77bca
15+
* Gitee:https://gitee.com/hengboy
16+
* GitHub:https://github.com/hengboy
17+
*/
18+
public interface ApiBootDataSource extends DataSource {
19+
/**
20+
* Create new data source Instance
21+
*
22+
* @return DataSource
23+
* @throws ApiBootException 异常信息
24+
*/
25+
DataSource build() throws ApiBootException;
26+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package org.minbox.framework.api.boot.plugin.datasource;
2+
3+
import org.minbox.framework.api.boot.plugin.datasource.config.DataSourceConfig;
4+
import org.minbox.framework.api.boot.plugin.datasource.config.DataSourceDruidConfig;
5+
import org.minbox.framework.api.boot.plugin.datasource.config.DataSourceHikariConfig;
6+
import org.minbox.framework.api.boot.plugin.datasource.support.ApiBootBasicDataSource;
7+
import org.minbox.framework.api.boot.plugin.datasource.support.ApiBootDruidDataSource;
8+
import org.minbox.framework.api.boot.plugin.datasource.support.ApiBootHikariDataSource;
9+
10+
import javax.sql.DataSource;
11+
12+
/**
13+
* ApiBoot DataSource Switch
14+
* data source factory
15+
*
16+
* @author:恒宇少年 - 于起宇
17+
* <p>
18+
* DateTime:2019-04-01 11:32
19+
* Blog:http://blog.yuqiyu.com
20+
* WebSite:http://www.jianshu.com/u/092df3f77bca
21+
* Gitee:https://gitee.com/hengboy
22+
* GitHub:https://github.com/hengboy
23+
*/
24+
public class ApiBootDataSourceFactoryBean {
25+
/**
26+
* create new dataSource instance
27+
*
28+
* @param config dataSource config
29+
* @return dataSource Instance
30+
*/
31+
public DataSource newDataSource(DataSourceConfig config) {
32+
DataSource dataSource = null;
33+
// not setting data source type class name
34+
if (config.getDataSourceType() == null) {
35+
// use druid data source
36+
if (checkUseAppointDataSource(DataSourceTypeNames.DRUID)) {
37+
dataSource = new ApiBootDruidDataSource((DataSourceDruidConfig) config);
38+
}
39+
// use Hikari data source
40+
else if (checkUseAppointDataSource(DataSourceTypeNames.HIKARI)) {
41+
dataSource = new ApiBootHikariDataSource((DataSourceHikariConfig) config);
42+
}
43+
}
44+
// setting data source type class name
45+
else {
46+
// druid data source
47+
if (DataSourceTypeNames.DRUID.equals(config.getDataSourceType().getName())) {
48+
dataSource = new ApiBootDruidDataSource((DataSourceDruidConfig) config);
49+
}
50+
// Hikari data source
51+
else if (DataSourceTypeNames.HIKARI.equals(config.getDataSourceType().getName())) {
52+
dataSource = new ApiBootHikariDataSource((DataSourceHikariConfig) config);
53+
}
54+
}
55+
// use default basic data source
56+
if (dataSource == null) {
57+
dataSource = new ApiBootBasicDataSource(config);
58+
}
59+
return dataSource;
60+
}
61+
62+
/**
63+
* check project is use appoint data source
64+
*
65+
* @return true/false
66+
*/
67+
private boolean checkUseAppointDataSource(String dataSourceTypeName) {
68+
boolean isUseCheck = true;
69+
try {
70+
Class.forName(dataSourceTypeName);
71+
} catch (ClassNotFoundException e) {
72+
isUseCheck = false;
73+
}
74+
return isUseCheck;
75+
}
76+
}

0 commit comments

Comments
 (0)