摘要:顧名思義,是用于數(shù)據(jù)源選擇切換的框架,這是一款基于切面指定注解實現(xiàn)的,通過簡單的數(shù)據(jù)源注解配置就可以完成訪問時的自動切換,切換過程中是線程安全的。注意事項在使用時需要添加對應(yīng)數(shù)據(jù)庫的依賴如果使用連接池,不要配置使用的依賴,請使用依賴。
ApiBoot是一款基于SpringBoot1.x,2.x的接口服務(wù)集成基礎(chǔ)框架, 內(nèi)部提供了框架的封裝集成、使用擴展、自動化完成配置,讓接口開發(fā)者可以選著性完成開箱即用, 不再為搭建接口框架而犯愁,從而極大的提高開發(fā)效率。
ApiBoot DataSource Switch顧名思義,DataSource Switch是用于數(shù)據(jù)源選擇切換的框架,這是一款基于Spring AOP切面指定注解實現(xiàn)的,通過簡單的數(shù)據(jù)源注解配置就可以完成訪問時的自動切換,DataSource Switch切換過程中是線程安全的。
添加依賴使用DataSource Switch很簡單,在pom.xml配置文件內(nèi)添加如下依賴:
org.minbox.framework api-boot-starter-datasource-switch
ApiBoot所提供的依賴都不需要添加版本號,具體查看ApiBoot版本依賴
集成數(shù)據(jù)源實現(xiàn)目前ApiBoot DataSource Switch集成了Druid、HikariCP兩種數(shù)據(jù)源實現(xiàn)依賴,在使用方面也有一定的差異,因為每一個數(shù)據(jù)源的內(nèi)置參數(shù)不一致。
Druid:參數(shù)配置前綴為api.boot.datasource.druid
HikariCP:參數(shù)配置前綴為api.boot.datasource.hikari
具體使用請查看下面功能配置介紹。
配置參數(shù)參數(shù)名 | 參數(shù)默認值 | 是否必填 | 參數(shù)描述 |
---|---|---|---|
api.boot.datasource.primary | master | 否 | 主數(shù)據(jù)源名稱 |
api.boot.datasource.druid.{poolName}.url | 無 | 是 | 數(shù)據(jù)庫連接字符串 |
api.boot.datasource.druid.{poolName}.username | 無 | 是 | 用戶名 |
api.boot.datasource.druid.{poolName}.password | 無 | 是 | 密碼 |
api.boot.datasource.druid.{poolName}.driver-class-name | com.mysql.cj.jdbc.Driver | 否 | 驅(qū)動類型 |
api.boot.datasource.druid.{poolName}.filters | stat,wall,slf4j | 否 | Druid過濾 |
api.boot.datasource.druid.{poolName}.max-active | 20 | 否 | 最大連接數(shù) |
api.boot.datasource.druid.{poolName}.initial-size | 1 | 否 | 初始化連接數(shù) |
api.boot.datasource.druid.{poolName}.max-wait | 60000 | 否 | 最大等待市場,單位:毫秒 |
api.boot.datasource.druid.{poolName}.validation-query | select 1 from dual | 否 | 檢查sql |
api.boot.datasource.druid.{poolName}.test-while-idle | true | 否 | 建議配置為true,不影響性能,并且保證安全性。申請連接的時候檢測,如果空閑時間大于timeBetweenEvictionRunsMillis,執(zhí)行validationQuery檢測連接是否有效。 |
api.boot.datasource.druid.{poolName}.test-on-borrow | false | 否 | 申請連接時執(zhí)行validationQuery檢測連接是否有效,做了這個配置會降低性能。 |
api.boot.datasource.druid.{poolName}.test-on-return | false | 否 | 歸還連接時執(zhí)行validationQuery檢測連接是否有效,做了這個配置會降低性能。 |
api.boot.datasource.hikari.{poolName}.url | 無 | 是 | 數(shù)據(jù)庫連接字符串 |
api.boot.datasource.hikari.{poolName}.username | 無 | 是 | 用戶名 |
api.boot.datasource.hikari.{poolName}.password | 無 | 是 | 密碼 |
api.boot.datasource.hikari.{poolName}.driver-class-name | com.mysql.cj.jdbc.Driver | 否 | 數(shù)據(jù)庫驅(qū)動類全限定名 |
api.boot.datasource.hikari.{poolName}.property | 無 | 否 | HikariCP屬性配置 |
HikariCP數(shù)據(jù)源是SpringBoot2.x自帶的,配置參數(shù)請訪問HikariCP。
單主配置ApiBoot DataSource Switch支持單主數(shù)據(jù)源的配置,application.yml配置文件如下所示:
api: boot: datasource: # 配置使用hikari數(shù)據(jù)源 hikari: # master datasource config master: url: jdbc:mysql://localhost:3306/test?characterEncoding=utf8&serverTimezone=Asia/Shanghai username: root password: 123456修改主數(shù)據(jù)源名稱
master為默認的主數(shù)據(jù)源的poolName,這里可以進行修改為其他值,不過需要對應(yīng)修改primary參數(shù),如下所示:
api: boot: datasource: # 主數(shù)據(jù)源,默認值為master primary: main # 配置使用hikari數(shù)據(jù)源 hikari: # main datasource config main: url: jdbc:mysql://localhost:3306/test?characterEncoding=utf8&serverTimezone=Asia/Shanghai username: root password: 123456
在上面配置主數(shù)據(jù)源的poolName修改為main。
主從配置如果你的項目內(nèi)存在單主單從、一主多從的配置方式,如下所示:
api: boot: datasource: # 配置使用hikari數(shù)據(jù)源 hikari: # master datasource config master: url: jdbc:mysql://localhost:3306/test?characterEncoding=utf8&serverTimezone=Asia/Shanghai username: root password: 123456 # 默認值為【com.mysql.cj.jdbc.Driver】 #driver-class-name: com.mysql.cj.jdbc.Driver # slave 1 datasource config slave_1: url: jdbc:mysql://localhost:3306/oauth2?characterEncoding=utf8&serverTimezone=Asia/Shanghai username: root password: 123456 # slave 2 datasource config slave_2: url: jdbc:mysql://localhost:3306/resources?characterEncoding=utf8&serverTimezone=Asia/Shanghai username: root password: 123456
在上面是一主多從的配置方式,分別是master、slave_1、slave_2。
多類型數(shù)據(jù)庫配置ApiBoot DataSource Switch提供了一個項目內(nèi)連接多個不同類型的數(shù)據(jù)庫,如:MySQL、Oracle...等,如下所示:
api: boot: # 主數(shù)據(jù)源,默認值為master primary: mysql hikari: mysql: url: jdbc:mysql://localhost:3306/test?characterEncoding=utf8&serverTimezone=Asia/Shanghai username: root password: 123456 oracle: url: jdbc:oracle:thin:@172.16.10.25:1521:torcl username: root password: 123456 driver-class-name: oracle.jdbc.driver.OracleDriver
在上面配置中,master主數(shù)據(jù)源使用的MySQL驅(qū)動連接MySQL數(shù)據(jù)庫,而slave從數(shù)據(jù)源則是使用的Oracle驅(qū)動連接的Oracle數(shù)據(jù)庫。
動態(tài)創(chuàng)建數(shù)據(jù)源ApiBoot DataSource Switch內(nèi)部提供了動態(tài)創(chuàng)建數(shù)據(jù)源的方法,可以通過注入ApiBootDataSourceFactoryBean來進行添加,如下所示:
@Autowired private ApiBootDataSourceFactoryBean factoryBean; public void createNewDataSource() throws Exception { // 創(chuàng)建Hikari數(shù)據(jù)源 // 如果創(chuàng)建Druid數(shù)據(jù)源,使用DataSourceDruidConfig DataSourceHikariConfig config = new DataSourceHikariConfig(); // 數(shù)據(jù)庫連接:必填 config.setUrl("jdbc:mysql://localhost:3306/resources"); // 用戶名:必填 config.setUsername("root"); // 密碼:必填 config.setPassword("123456"); // 數(shù)據(jù)源名稱:必填(用于@DataSourceSwitch注解value值使用) config.setPoolName("dynamic"); // 創(chuàng)建數(shù)據(jù)源 DataSource dataSource = factoryBean.newDataSource(config); Connection connection = dataSource.getConnection(); System.out.println(connection.getCatalog()); connection.close(); }自動切換
ApiBoot DataSource Switch的數(shù)據(jù)源自動切換主要歸功于Spring的AOP,通過切面@DataSourceSwitch注解,獲取注解配置的value值進行設(shè)置當前線程所用的數(shù)據(jù)源名稱,從而通過AbstractRoutingDataSource進行數(shù)據(jù)源的路由切換。
我們沿用上面一主多從的配置進行代碼演示,配置文件application.yml參考上面配置,代碼示例如下:
從數(shù)據(jù)源示例類@Service @DataSourceSwitch("slave") public class SlaveDataSourceSampleService { /** * DataSource Instance */ @Autowired private DataSource dataSource; /** * 演示輸出數(shù)據(jù)源的catalog * * @throws Exception */ public void print() throws Exception { // 獲取鏈接 Connection connection = dataSource.getConnection(); // 輸出catalog System.out.println(this.getClass().getSimpleName() + " ->" + connection.getCatalog()); // 關(guān)閉鏈接 connection.close(); } }主數(shù)據(jù)源示例類
@Service @DataSourceSwitch("master") public class MasterDataSourceSampleService { /** * DataSource Instance */ @Autowired private DataSource dataSource; /** * Slave Sample Service */ @Autowired private SlaveDataSourceSampleService slaveDataSourceSampleService; /** * 演示輸出主數(shù)據(jù)源catalog * 調(diào)用從數(shù)據(jù)源類演示輸出catalog * * @throws Exception */ public void print() throws Exception { Connection connection = dataSource.getConnection(); System.out.println(this.getClass().getSimpleName() + " ->" + connection.getCatalog()); connection.close(); slaveDataSourceSampleService.print(); } }
在主數(shù)據(jù)源的示例類內(nèi),我們通過@DataSourceSwitch("master")注解的value進行定位連接master數(shù)據(jù)源數(shù)據(jù)庫。
同樣在從數(shù)據(jù)庫的示例類內(nèi),我們也可以通過@DataSourceSwitch("slave")注解的value進行定位連接slave數(shù)據(jù)源數(shù)據(jù)庫。
單元測試示例在上面的測試示例中,我們使用交叉的方式進行驗證數(shù)據(jù)源路由是否可以正確的進行切換,可以編寫一個單元測試進行驗證結(jié)果,如下所示:
@Autowired private MasterDataSourceSampleService masterDataSourceSampleService; @Test public void contextLoads() throws Exception { masterDataSourceSampleService.print(); }
運行上面測試方法,結(jié)果如下所示:
MasterDataSourceSampleService ->test 2019-04-04 10:20:45.407 INFO 7295 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-2 - Starting... 2019-04-04 10:20:45.411 INFO 7295 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-2 - Start completed. SlaveDataSourceSampleService ->oauth2
單次執(zhí)行數(shù)據(jù)源切換沒有任何的問題,master數(shù)據(jù)源獲取catalog輸出后,調(diào)用slave示例類進行輸出catalog。
ApiBoot DataSource Switch會在項目啟動時首先初始化master節(jié)點DataSource實例,其他實例會在第一次調(diào)用時進行初始化。壓力性能測試
單次執(zhí)行單線程操作沒有問題,不代表多線程下不會出現(xiàn)問題,在開頭說到過ApiBoot DataSource Switch是線程安全的,所以接下來我們來驗證這一點,我們需要添加壓力測試的依賴,如下所示:
org.databene contiperf 2.3.4 test
接下來把上面的單元測試代碼改造下,如下所示:
// 初始化壓力性能測試對象 @Rule public ContiPerfRule i = new ContiPerfRule(); @Autowired private MasterDataSourceSampleService masterDataSourceSampleService; /** * 開啟500個線程執(zhí)行10000次 */ @Test @PerfTest(invocations = 10000, threads = 500) public void contextLoads() throws Exception { masterDataSourceSampleService.print(); }
測試環(huán)境:注意事項硬件:i7、16G、256SSD
系統(tǒng):OS X
整個過程大約是10秒左右,ApiBoot DataSource Switch并沒有發(fā)生出現(xiàn)切換錯亂的情況。
在使用ApiBoot DataSource Switch時需要添加對應(yīng)數(shù)據(jù)庫的依賴
如果使用Druid連接池,不要配置使用druid-starter的依賴,請使用druid依賴。
配置poolName時不要添加特殊字符、中文、中橫線等。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/74059.html
摘要:重復(fù)任務(wù)循環(huán)任務(wù),當在不傳遞重復(fù)執(zhí)行次數(shù)時,不進行重復(fù)執(zhí)行,僅僅執(zhí)行一次,如下所示參數(shù)恒宇少年每次循環(huán)的間隔時間,單位毫秒循環(huán)次數(shù)開始時間,秒后執(zhí)行任務(wù)類任務(wù)由類進行構(gòu)建。 ApiBoot Quartz ApiBoot內(nèi)部集成了Quartz,提供了數(shù)據(jù)庫方式、內(nèi)存方式的進行任務(wù)的存儲,其中數(shù)據(jù)庫方式提供了分布式集群任務(wù)調(diào)度,任務(wù)自動平滑切換執(zhí)行節(jié)點。 引用ApiBoot Quartz ...
摘要:相關(guān)配置配置參數(shù)參數(shù)介紹默認值是否啟用文檔標題快速集成文檔文檔描述通過自動化配置快速集成文檔,僅需一個注解一個依賴即可。注意通過所獲取的類型都為。 ApiBoot是一款基于SpringBoot1.x,2.x的接口服務(wù)集成基礎(chǔ)框架, 內(nèi)部提供了框架的封裝集成、使用擴展、自動化完成配置,讓接口開發(fā)者可以選著性完成開箱即用, 不再為搭建接口框架而犯愁,從而極大...
摘要:如下所示不配置默認使用自定義是的概念,用于自定義轉(zhuǎn)換實現(xiàn),比如自定義格式化日期自動截取小數(shù)點等。下面提供一個的簡單示例,具體的使用請參考官方文檔。 ApiBoot是一款基于SpringBoot1.x,2.x的接口服務(wù)集成基礎(chǔ)框架, 內(nèi)部提供了框架的封裝集成、使用擴展、自動化完成配置,讓接口開發(fā)者可以選著性完成開箱即用, 不再為搭建接口框架而犯愁,從而極大...
摘要:的短信服務(wù)模塊是由阿里云的國際短信服務(wù)提供的,支持國內(nèi)和國際快速發(fā)送驗證碼短信通知和推廣短信。前提需要到阿里云控制臺申請開通短信服務(wù)。如果在阿里云控制臺定義的短信模板存在多個參數(shù),可以通過方法來進行挨個添加,該方法返回值為本對象。 ApiBoot是一款基于SpringBoot1.x,2.x的接口服務(wù)集成基礎(chǔ)框架, 內(nèi)部提供了框架的封裝集成、使用擴展、自動化完成配置,讓接...
摘要:如果全部使用默認值的情況話不需要做任何配置方式前提項目需要添加數(shù)據(jù)源依賴。獲取通過獲取啟用在使用格式化時非常簡單的,配置如下所示開啟轉(zhuǎn)換轉(zhuǎn)換時所需加密,默認為恒宇少年于起宇默認不啟用,簽名建議進行更換。 ApiBoot是一款基于SpringBoot1.x,2.x的接口服務(wù)集成基礎(chǔ)框架, 內(nèi)部提供了框架的封裝集成、使用擴展、自動化完成配置,讓接口開發(fā)者可以選著性完成開箱即...
閱讀 1388·2021-10-11 10:58
閱讀 1471·2021-09-04 16:41
閱讀 669·2019-08-30 15:55
閱讀 798·2019-08-29 18:46
閱讀 3133·2019-08-29 14:05
閱讀 3524·2019-08-26 14:00
閱讀 2448·2019-08-26 13:53
閱讀 3164·2019-08-26 13:29