Spring Cloud Config 高可用
Spring Cloud Config 高可用
高可用配置
當要將配置中心部署到生產環境中時,與服務註冊中心一樣,我們也希望它是一個高可用的應用。SpringCloudCoiifig實現服務端的高可用非常簡單,主要有以下兩種方式。
- 傳統模式:不需要為這些服務端做任何額外的配置,只需要遵守一個配置規則,將所有的Config Server都指向同一個Git倉庫,這樣所有的配置內容就通過統一的共享檔案系統來維護。而客戶端在指定Config Server位置時,只需要配置Config Server上層的負載均衡裝置地址即可,就如下圖所示的結構:
- 服務模式:除了上面這種傳統的實現模式之外,我們也可以將Config Server作為一個普通的微服務應用,納入Eureka的服務治理體系中。這樣我們的微服務應用就可以通過配置中心的服務名來獲取配置資訊,這種方式比起傳統的實現模式來說更加有利於維護,因為對於服務端的負載均衡配置和客戶端的配置中心指定都通過服務治理機制一併解決了,既實現了高可用,也實現了自維護。由於這部分的實現需要客戶端的配合,具體示例讀者可詳細閱讀“客戶端詳解”一節中的“服務化配置中心”小節
客戶端詳解
在學習了關於Spring Cloud Config 服務端的大量配置和使用細節之後,接下來我們將通過下面的內容繼續學習Spring Cloud Config客戶端的使用與配置。
URI指定配置中心
Spring Cloud Config 的客戶端在啟動的時候,預設從工程的classpath中載入配置資訊並啟動應用,只有當我們配置spring.cloud .config.uri的時候,客戶端應用才會嘗試連線Spring Cloud Config的服務端來獲取遠端配置資訊並初始化Spring環境配置。同時,我們必須將該引數配置在bootstrap.propertie、環境變數或是其他優先順序高於應用Jar包內的配置資訊中,才能正確載入到遠端配置。若不指定spring.cloud.config.uri引數的話,Spring Cloud Config的客戶端會預設嘗試連線http://10.0.45.103:8080。
專案github地址:[email protected]:13849141963/spring-cloud.git
【Dalston版】
在之前的快速入門示例中,我們就是以這種方式實現的,就如下面的配置,其中spring.application.name和spring.cloud.config.profile用於定位配置資訊。
spring.application.name=springcloud-config-client
# 指明遠端倉庫的分支
spring.cloud.config.label=master
# dev開發環境配置檔案 test測試環境 pro正式環境
spring.cloud.config.profile=dev
# 配置中心config-server的地址
#spring.cloud.config.uri=http://10.0.45.103:8080/
服務化配置中心
在前幾篇部落格中,我們己經學會了如何構建服務註冊中心、如何發現與註冊服務。那麼Config Server是否也能以服務的方式註冊到服務中心,並被其他應用所發現來實現配置資訊的獲取呢?答案是肯定的。在Spring Cloud中,我們也可以把Config Server視為微服務架構中與其他業務服務一樣的一個基本單元。
下面,我們就來詳細介紹如何將Config Server註冊到服務中心,並通過服務發現來訪問Config Server並獲取Git倉庫中的配置資訊。下面的內容將基於快速入門中實現的 springcloud-config-server和springcloud-config-client工程來進行改造實現。
服務端配置
1、在springcloud-config-server 的 pom.xml 中增加spring-cloud-starter-eureka,spring-cloud-config-server依賴,以實現將分散式配置中心加入Eureka的服務治理體系。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.13.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<!--分散式配置中心-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<!--Eureka服務註冊中心-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.RC1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2、在application.properties配置檔案中配置引數eureka.client.service-url.defaultZone已指定服務註冊中心的位置,詳細內容如下:
spring.application.name=springcloud-config-server
server.port=8080
# 配置git倉庫地址
spring.cloud.config.server.git.uri=https://github.com/13849141963/spring-config-file/
# 配置倉庫的分支
spring.cloud.config.label=master
# 配置倉庫路下的相對搜尋位置.可以配置多個
spring.cloud.config.server.git.search-paths=respoitory
# 訪問git倉庫的使用者名稱
spring.cloud.config.server.git.username=13849141963
# 訪問git倉庫的使用者密碼 如果Git倉庫為公開倉庫,可以不填寫使用者名稱和密碼,如果是私有倉庫需要填寫
spring.cloud.config.server.git.password=********
#將分散式配置中心交給eureka叢集註冊中心來管理
eureka.client.service-url.defaultZone=http://peer1:1111/eureka/,http://peer3:3333/eureka/,http://peer2:2222/eureka/
#雖然SpringCloudConfig提供這樣的功能,但是為了支援更好的內容管理和版本控制等強大功能,還是推薦使用Git倉庫的方式
#不使用git倉庫或者svn倉庫的儲存方式 configSever會預設從應用的src/main/resources目錄下搜尋檔案
#spring.profiles.active=native
#如果需要指定搜尋配置檔案的路徑,通過這個屬性來指定具體的配置檔案位置
#spring.cloud.config.server.native.search-locations=檔案位置
3、在應用主類中,新增@EnableDiscoveryClient註解,用來將springcloud-config-server應用註冊到上面的服務註冊中心上去。
//分散式配置中心註解
@EnableConfigServer
//發現註冊中心
@EnableEurekaClient
@SpringBootApplication
public class SpringcloudConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(SpringcloudConfigServerApplication.class, args);
}
}
4、啟動該應用,並訪問eureka叢集http://10.0.45.103:1111,http://10.0.45.103:2222,http://10.0.45.103:3333,可以在Eureka Server的資訊面板中看到springcloud-config-server已經被註冊了。
客戶端配置
1、在springcloud-config-client的pom.xml中新增spring-cloud-starter-eureka依賴,以實現客戶端發現springcloud-config-server服務,具體配置如下:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.13.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<!--分散式配置中心-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<!--Eureka服務註冊中心-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.RC1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2、在bootstrap.properties檔案中,按如下配置:
spring.application.name=springcloud-config-client
# 指明遠端倉庫的分支
spring.cloud.config.label=master
# dev開發環境配置檔案 test測試環境 pro正式環境
spring.cloud.config.profile=dev
# 配置中心config-server的地址 在configServer分散式配置中心沒有在eureka註冊中心註冊時,指定該ConfigServer的伺服器地址通過訪問Controller
# 來測試客戶端獲取git倉庫的某個檔案內容,之後ConfigServer在註冊中心進行註冊就可以使用service-id屬性來指定分散式服務的名稱,直接使用分散式服務
#spring.cloud.config.uri=http://10.0.45.103:8080/
#埠
server.port=7001
#開啟通過服務來訪問ConfigServer的功能
spring.cloud.config.discovery.enabled=true
#指定分散式配置中心服務名稱
spring.cloud.config.discovery.service-id=springcloud-config-server
#將分散式配置中心交給eureka叢集註冊中心來管理
eureka.client.service-url.defaultZone=http://peer1:1111/eureka/,http://peer3:3333/eureka/,http://peer2:2222/eureka/
#關閉重新整理安全認證
management.security.enabled=false
#和重試機制相關的配置有如下四個:
# 配置重試次數,預設為6
spring.cloud.config.retry.max-attempts=6
# 間隔乘數,預設1.1
spring.cloud.config.retry.multiplier=1.1
# 初始重試間隔時間,預設1000ms
spring.cloud.config.retry.initial-interval=1000
# 最大間隔時間,預設2000ms
spring.cloud.config.retry.max-interval=2000
其中,通過eureka.client.service-url.defaultZone引數指定服務註冊中心,用於服務註冊與發現;在將spring.cloud.config.discovery.enabled引數設定為true,開啟通過服務來訪問Config Server的功能;最後利用spring.cloud.config.discovery.serviceId引數來指定Config Server註冊的服務名。這裡的spring.application.name和spring.cloud.config.profile如之前通過URI的方式訪問的時候一樣,用來定位Git中的資源。
3、在應用主類中,增加@EnableEurekaClient註解,用來發現springcloud-config-server服務,利用其來載入應用配置:
@SpringBootApplication
@EnableEurekaClient
public class SpringcloudConfigClientApplication {
public static void main(String[] args) {
SpringApplication.run(SpringcloudConfigClientApplication.class, args);
}
}
4、沿用之前我們建立的Controller來載入Git中的配置資訊:
@RestController
public class TestGetConfigController {
@Value("${configFile}")
String configFile;
@RequestMapping(value = "/configFile")
public String getConfigFile(){
return configFile;
}
}
5、完成上述配置之後,我們啟動客戶端應用。若啟動成功,訪問http://10.0.45.103:7001/configFile,可以在Eureka Server的資訊面板中看到該應用已經被註冊成功。
6、訪問客戶端應用提供的服務 http://10.0.45.103:7001/configFile,此時,我們會返回在Git倉庫中application-dev.properties檔案中的配置config-filede屬性內容:“configFile dev version 1”
失敗快速響應與重試
Spring Cloud Config的客戶端會預先載入很多其他資訊,然後再開始連線Config Serve進行屬性的注入。當我們構建的應用較為複雜的時候,可能在連線Config Server之前花較長的啟動時間,而在一些特殊場景下,我們又希望可以快速知道當前應用是否能順利從Config Server獲取到配置資訊,這對在初期構建除錯環境時,可以減少很多等待啟動的時間。要實現客戶端優先判斷Config Server獲取是否正常,並快速響應失敗內容,只需在bootstrap.properties中配置引數spring.cloud.config.failFast=true即可。
我們可以實現一下,在未配置該引數前,不啟動Config Server,直接啟動客戶端應用,可以獲得下面的報錯資訊。同時,在報錯之前,可以看到客戶端應用載入了很多內容,比如說Controller的請求等。
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'testGetConfigController': Injection of autowired dependencies failed;
加上spring.cloud.config.fail-fast=true 引數之後,在啟動客戶端應用,可以獲取下面的報錯資訊,並且前置的載入內容少了很多,這樣通過該引數有效地避免的了當Congfig Server配置有誤時,不需要多等待前置的一些載入時間,實現了快速返回失敗資訊
java.lang.IllegalStateException: Could not locate PropertySource and the fail fast property is set, failing
上面我們演示了當Config Server宕機或是客戶端配置不正確導致連線不到而啟動失敗的情況,快速響應的配置可以發揮比較好的效果。但是,若只是因為網路波動等其他間接性原因導致的問題,直接啟動失敗似乎代價有點高。所以Config客戶端還提供了自動重試的功能,在開啟重試功能前,先確保已經配置了spring.cloud.config.failFast=true,在進行下面的操作。
1、在客戶端的pom.xml中增加spring-retry和spring-boot-starter-aop依賴,具體如下:
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
2、不需要在做其他任何配置,啟動客戶端應用,在控制檯中可以看到如下內容。客戶端在連線Config Server失敗之後,會繼續嘗試,知道第六次失敗後才返回錯誤資訊。通過這樣的重試機制,可以避免一些間歇性問題引起的失敗導致客戶端應用無法啟動的情況。
2018-11-06 14:14:50.752 INFO 828 --- [ main] c.c.c.ConfigServicePropertySourceLocator : Fetching config from server at: http://localhost:8888
2018-11-06 14:14:52.813 INFO 828 --- [ main] c.c.c.ConfigServicePropertySourceLocator : Fetching config from server at: http://localhost:8888
2018-11-06 14:14:54.947 INFO 828 --- [ main] c.c.c.ConfigServicePropertySourceLocator : Fetching config from server at: http://localhost:8888
2018-11-06 14:14:57.188 INFO 828 --- [ main] c.c.c.ConfigServicePropertySourceLocator : Fetching config from server at: http://localhost:8888
2018-11-06 14:14:59.548 INFO 828 --- [ main] c.c.c.ConfigServicePropertySourceLocator : Fetching config from server at: http://localhost:8888
2018-11-06 14:15:02.044 INFO 828 --- [ main] c.c.c.ConfigServicePropertySourceLocator : Fetching config from server at: http://localhost:8888
2018-11-06 14:15:03.084 ERROR 828 --- [ main] o.s.boot.SpringApplication : Application startup failed
java.lang.IllegalStateException: Could not locate PropertySource and the fail fast property is set, failing
若對預設的最大重試次數和重試間隔等設定不滿意,還可以通過下面的引數進行調整。
spring.cloud.config.retry.multiplier:初始重試間隔時間(單位為毫秒),預設為1000毫秒。
spring.cloud.config.retry.initial-interval:下一間隔的乘數,預設為1.1所以當初間隔是1000毫秒時,下一次失敗的間隔為1100毫秒。
spring.cloud.config.retry.max-interval:最大間隔時間,預設為2000毫秒。
spring.cloud.config.retry.max.attempts:最大重試次數,預設為六次。
獲取遠端配置
在入門示例中,我們隊{application}、{profile}、{lable}這些引數已經有了一定的瞭解。在Git倉庫中,一個形如{application}-{profile}.properties或{application}-{profile}.yml的配置檔案,通過URL請求和客戶端配置的訪問對應可以總結如下:
1、通過向Config Server傳送GET請求以直接的方式獲取,可用下面的連結形式。
不帶{label}分支資訊,預設訪問master分支,可使用:
1./{application}-{profile}.yml
2./{application}-{profile}-properties
帶{label}分支資訊,可使用:
1./{label}/{application}-{profile}.yml
2./{application}/{profile}[/{label}]
3./{label}/{application}-{profile}.properties
2、通過客戶端配置方式載入的內容如下所示。
1.spring• application.name:對應配置檔案中的{application}內容。
2.spring. cloud, config.profile:對應配置檔案中{profile}內容。
3.spring.cloud.config. label:對應分支內容,如不配置,預設為master。
動態重新整理配置
有時候,我們需要對配置內容做一些實時更新,那麼Spring Cloud Config是否可以實現呢?答案顯然是可以的。下面,我們以快速入門中的示例作為基礎,看看如何進行改造來實現配置內容的實時更新。
首先,回顧一下,當前我們已經實現了哪些內容。
1、config-repo:定義在 Git倉庫中的一個目錄,其中儲存了應用名為didispace的多環境配置檔案,配置檔案中有一個from引數。
2、 config-server:配置了 Git倉庫的服務端。
3、config- client:指定了springcloud-config-server為配置中心的客戶端,應用名為springcloud-config-client,用來訪問配置伺服器以獲取配置資訊。該應用中提供了一個/configFile介面,它會獲取 respository/ application-dev.properties 中的 configFile屬性返回。
在改造程式之前,我們先將 springcloud-config- server 和 springcloud-config-client 都啟動起來,並訪問客戶端提供的REST介面 http:// localhost:7002/ configFile 來獲取配置資訊,獲得的返回內容為 configFile dev version 1。接著,我們可以嘗試使用Git工具修改當前配置的內容,比如, 將 respository/application-dev.properties 中的 configFile 的值從 configFile = configFile dev version 1 修改為 configFile = configFile dev version 2,再訪問 http://10.0.45.103:7001/configFile,可以看到其返回內容還是configFile dev version 1。
接下來,我們將在springcloud-config-client端做一些改造以實現配置資訊的動態重新整理。
1、在springcloud-config-client的pom.xml中新增 spring-boot-starter-actuator 監控模組。其中包含了/refresh端點的實現,該端點將用於應用配置資訊的重新獲取與重新整理。
<!--實時重新整理配置檔案-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2、重新啟動 springcloud-config-client,訪問一次 http://10.0.45.103:7001/configFile 可以看到當前的配置值。
3、修改Git 倉庫 respository/application-dev.properties檔案中的值。
4、在訪問一次 http://10.0.45.103:7001/configFile ,可以看到配置值沒有發生改變。
5、通過POST請求傳送到 http://10.0.45.103:7001/refresh,我們可以看到返回內容如下,代表configFile引數的配置內容被更新了:
6、再一次訪問 http://10.0.45.103:7001/configFile,可以看到配置值已經是更新後的值了。
通過上面的介紹,大家不難想到,該功能還可以同Git倉庫的Web Hook功能進行關聯,當有Git提交變化時,就給對應的配置主機發送/refresh請求來實現配置資訊的實時更新。但是,當我們的系統發展壯大之後,維護這樣的重新整理清單也將成為一個非常大的負擔,而且很容易犯錯,那麼有什麼辦法可以解決這個複雜度呢?後續我們將介紹如何通過 Spring Cloud Bus來實現以訊息匯流排的方式進行配置變更的通知,並完成叢集上的批量配置更新。
遠端拉取配置檔案操作資料庫
我們在專案實戰中肯定不會像上面的操作一樣,我們會把一些常用的配置資訊放在github的配置檔案中,放入多個環境的配置檔案,每個配置檔案中會有一些mysql,mybatis,redis,分頁,等諸多的配置資訊引數,下面我們就來演示從github獲取mysql,mybatis的相關配置資訊來操作資料庫.
1、準備好配置檔案的相關資訊
#mysql相關配置資訊
spring.datasource.url=jdbc:mysql://10.0.45.103/mysql-test?characterEncoding=utf8
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.initialSize=5
spring.datasource.maxActive=200
spring.datasource.minIdle=5
spring.datasource.maxWait=60000
spring.datasource.timeBetweenEvictionRunsMillis=60000
spring.datasource.minEvictableIdleTimeMillis=300000
spring.datasource.validationQuery=select 'x'
spring.datasource.testWhileIdle=true
spring.datasource.testOnReturn=false
spring.datasource.poolPreparedStatements=true
spring.datasource.maxOpenPreparedStatements=20
spring.datasource.testOnBorrow=false
#mybatis相關配置資訊
mybatis.mapper-locations=com/zy/cn/mapper/*.xml
mybatis.type-aliases-package=com.zy.cn.entity
2、啟動eureka叢集專案[上一篇博文中有搭建過程,程式碼已上傳github]
3、啟動springcloud-config-server專案[程式碼已上傳github]
4、在客戶端建立bootstrap.properties檔案,在啟動入口類時會首先載入bootstrap.properties中的相關配置資訊引數如下:
spring.application.name=springcloud-config-client
# 對應的檔案為application-datasource.properties檔案
spring.cloud.config.profile=datasource
# 指明遠端倉庫的分支
spring.cloud.config.label=master
# 配置中心config-server的地址 在configServer分散式配置中心沒有在eureka註冊中心註冊時,指定該ConfigServer的伺服器地址通過訪問Controller
# 來測試客戶端獲取git倉庫的某個檔案內容,之後ConfigServer在註冊中心進行註冊就可以使用service-id屬性來指定分散式服務的名稱,直接使用分散式服務
#spring.cloud.config.uri=http://10.0.45.103:8080/
#埠
server.port=7001
#開啟通過服務來訪問ConfigServer的功能
spring.cloud.config.discovery.enabled=true
#指定分散式配置中心服務名稱
spring.cloud.config.discovery.service-id=springcloud-config-server
#將分散式配置中心交給eureka叢集註冊中心來管理
eureka.client.service-url.defaultZone=http://peer1:1111/eureka/,http://peer3:3333/eureka/,http://peer2:2222/eureka/
#啟動失敗時能夠快速響應
spring.cloud.config.fail-fast=true
#關閉重新整理安全認證
management.security.enabled=false
#和重試機制相關的配置有如下四個:
# 配置重試次數,預設為6
spring.cloud.config.retry.max-attempts=6
# 間隔乘數,預設1.1
spring.cloud.config.retry.multiplier=1.1
# 初始重試間隔時間,預設1000ms
spring.cloud.config.retry.initial-interval=1000
# 最大間隔時間,預設2000ms
spring.cloud.config.retry.max-interval=2000
5、建立DataSourceProperties.class 作用就是通過@ConfigurationProperties註解實現了配置資訊的注入,該註解的作用:當以@ConfigurationProperties這種方式註冊bean時,該bean具有常規名稱:<prefix>-<fqn>,屬性 //其中<prefix>是在@ConfigurationProperties註釋中指定的環境[系統環境]鍵字首,並且<fqn>是bean的完全限定名稱。 //如果註釋沒有提供任何字首,則只使用bean的完全限定名稱。系統環境就是已經載入bootstrap.properties檔案從遠端github倉庫獲取相關資訊通過@ConfigurationProperties 註解給DataSourceProperties的屬性進行引數繫結。
/**
* 該類配置資料來源相關屬性
* 從springcloud config遠端github獲取配置檔案資訊
*/
//https://www.breakyizhan.com/springboot/3287.html Springboot中文文件24.7
//當以@ConfigurationProperties這種方式註冊bean時,該bean具有常規名稱:<prefix>-<fqn>,睡醒
//其中<prefix>是在@ConfigurationProperties註釋中指定的環境[系統環境]鍵字首,並且<fqn>是bean的完全限定名稱。
//如果註釋沒有提供任何字首,則只使用bean的完全限定名稱。
//通過使用@ConfigurationProperties註解實現了配置資訊的注入;
// 然後又通過使用@EnableConfigurationProperties註解才使得配置bean被創建出來
@ConfigurationProperties(prefix = DataSourceProperties.PREFIX, ignoreUnknownFields = false)
public class DataSourceProperties {
public DataSourceProperties() {
super();
}
//定義字首 //對應遠端配置檔案裡的key
public final static String PREFIX = "spring.datasource";
private String type;
private String driverClassName;
private String url;
private String username;
private String password;
private int maxActive = 1000;
private int maxIdle = 100;
private int minIdle = 8;
private int initialSize = 10;
private int maxWait;
private int timeBetweenEvictionRunsMillis;
private int minEvictableIdleTimeMillis;
private String validationQuery;
private boolean testWhileIdle;
private boolean poolPreparedStatements;
private int maxOpenPreparedStatements;
private boolean testOnBorrow = true;
private boolean testOnReturn = false;
//提供get/set方法
}
6、建立MybatisSourceProperties.class檔案
//@ConfigurationProperties 標註的“已經存在”的 bean 都會從系統環境中載入配置資訊
@ConfigurationProperties(prefix = MybatisSourceProperties.PREFIX, ignoreUnknownFields = false)
//通過使用@ConfigurationProperties註解實現了配置資訊的注入;
// 然後又通過使用@EnableConfigurationProperties註解才使得配置bean被創建出來
public class MybatisSourceProperties {
//指定遠端配置檔案字首
public final static String PREFIX = "mybatis";
//mapper配置檔案位置
private String mapperLocations;
//實體的別名
private String typeAliasesPackage;
//並提供get/set方法
}
7、在入口類上該註解上加引數 @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}),意思就是將spring boot自帶的DataSourceAutoConfiguration禁掉,防止自動配置資料來源
@MapperScan("com.zy.cn.dao")
@EnableEurekaClient
//將spring boot自帶的DataSourceAutoConfiguration禁掉,防止自動配置資料來源
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class SpringcloudProviderApplication {
public static void main(String[] args) {
SpringApplication.run(SpringcloudProviderApplication.class, args);
}
}
8、自定義資料來源 MybatisDataSource.class檔案 ,該檔案中建立資料來源元件,建立SqlSessionFactory,建立事物管理器,在這裡注意:通過使用@ConfigurationProperties註解實現了配置資訊的注入,然後又通過使用@EnableConfigurationProperties註解才使得配置bean被創建出來。
@Configuration
@MapperScan("com.zy.cn.*")
//載入資料來源以及mybatis的相關配置資訊
@EnableConfigurationProperties({DataSourceProperties.class,MybatisSourceProperties.class})
//通過使用@ConfigurationProperties註解實現了配置資訊的注入;
// 然後又通過使用@EnableConfigurationProperties註解才使得配置bean被創建出來
@EnableTransactionManagement//事務管理器
public class MybatisDataSource {
@Autowired
private DataSourceProperties dataSourceProperties;
@Autowired
private MybatisSourceProperties mybatisSourceProperties;
private DruidDataSource datasource = null;
//建立資料來源元件
@Bean(destroyMethod = "close")
public DataSource dataSource(){
datasource = new DruidDataSource();
//注入連線資料庫的·url地址
datasource.setUrl(dataSourceProperties.getUrl());
//注入型別
datasource.setDbType(dataSourceProperties.getType());
datasource.setDriverClassName(dataSourceProperties.getDriverClassName());
//注入使用者名稱密碼
datasource.setUsername(dataSourceProperties.getUsername());
datasource.setPassword(dataSourceProperties.getPassword());
//連線相關配置引數
datasource.setInitialSize(dataSourceProperties.getInitialSize());
datasource.setMaxActive(dataSourceProperties.getMaxActive());
datasource.setMinIdle(dataSourceProperties.getMinIdle());
datasource.setMaxWait(dataSourceProperties.getMaxWait());
datasource.setTimeBetweenEvictionRunsMillis(dataSourceProperties.getTimeBetweenEvictionRunsMillis());
datasource.setValidationQuery(dataSourceProperties.getValidationQuery());
datasource.setTestWhileIdle(dataSourceProperties.getTestWhileIdle());
datasource.setTestOnReturn(dataSourceProperties.isTestOnReturn());
datasource.setTestOnBorrow(dataSourceProperties.isTestOnBorrow());
datasource.setPoolPreparedStatements(dataSourceProperties.getPoolPreparedStatements());
datasource.setMaxOpenPreparedStatements(dataSourceProperties.getMaxOpenPreparedStatements());
return datasource;
}
@PreDestroy
public void close() {
if(datasource != null){
//關閉資料來源
datasource.close();
}
}
//建立sqlSessionFactory連線物件
@Bean
public SqlSessionFactory sqlSessionFactoryBean() throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
//注入資料來源元件
sqlSessionFactoryBean.setDataSource(dataSource());
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
//mybatis的mapper配置檔案位置
sqlSessionFactoryBean.setMapperLocations(resolver.getResources(mybatisSourceProperties.getMapperLocations()));
//指定實體別名的位置
sqlSessionFactoryBean.setTypeAliasesPackage(mybatisSourceProperties.getTypeAliasesPackage());
return sqlSessionFactoryBean.getObject();
}
//建立事務管理器
@Bean
public PlatformTransactionManager transactionManager() {
//注入資料來源物件
return new DataSourceTransactionManager(dataSource());
}
}
9.建立mapper配置檔案
10.進行測試,測試成功說明從github遠端獲取配置資訊進行載入從而進行操作資料庫。這樣子也是方便對各個環境的儘快地做出改變不需要人為的進行管理。