Spring Cloud Config是最早的配置中心,雖然后面的之秀Nacos可以取代它, 但是Spring Cloud Config還是很多公司在用,比如我司。
那為什么我們需要一個配置中心呢?我們直接將配置寫在本地的yml配置文件中不行嗎?
一個新技術的出現,一定是因為它解決了某些痛點,我們來看看將配置信息直接寫在本地yml配置文件存在哪些痛點:
Spring Authorization Server,而Spring Cloud Config解決了這倆個痛點:
簡單說明一下流程
接下來,我們將根據這個架構圖搭建一個案例。
項目中使用到的版本:
Spring 框架、版本不同的話可能會出現一點問題。
首先我們需要一個創建一個配置中心倉庫。由于github的網速太慢,所以我使用碼云創建配置中心倉庫,當然你也可以使用github。
1、在碼云創建springcloud-config倉庫
2、在倉庫中創建三個文件
Springboot注解,文件命名規格:{項目名}-{配置環境版本}.yml
。比如config-dev.yml,表示的是config項目的開發環境配置。
配置文件內容分別如下。
config-dev.yml:
user:name: "張三 dev"
config-prod.yml
user:name: "張三 prod"
SpringCloud是基于什么、1、 新建SpringBoot項目spring-cloud-config-server
,并引入依賴
<dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Hoxton.SR1</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement><dependencies><!-- spring cloud config 服務端包 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-config-server</artifactId></dependency>
</dependencies>
3.2 配置config相關配置
bootstrap.yml 文件
spring:application:name: config-server # 應用名稱cloud:config:server:git:# 配置中心倉庫地址uri: https://gitee.com/F_promise/springcloud-config.git #配置文件所在倉庫username: 碼云用戶名password: 碼云密碼default-label: master #配置文件分支
# search-paths: config #配置文件所在根目錄
3、在 Application 啟動類上增加相關注解 @EnableConfigServer
@SpringBootApplication
@EnableConfigServer
public class MainApplication {public static void main(String[] args) {SpringApplication.run(MainApplication.class,args);}
}
啟動SpringBoot服務,測試一下。
Spring Cloud Config 有它的一套訪問規則,我們通過這套規則在瀏覽器上直接訪問就可以。
/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
以第一條規則為例,訪問config-dev.yml配置文件:
至此,配置中心服務端搭建完畢,接下來客戶端(其他項目)需要從配置中心中獲取配置信息。
1、新建SpringBoot項目spring-cloud-config-client
,并引入依賴
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- spring cloud config 客戶端 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-config</artifactId></dependency>
</dependencies>
注意,客戶端和服務端引入的config依賴是不一樣的。
2、編寫bootstrap.yml配置文件
--- bootstrap.yml ---
spring:profiles:active: dev #激活開發環境的配置文件---
spring:application:name: configcloud:config:uri: http://localhost:8080 #config服務端的地址label: master profile: dev #開發環境---
spring:application:name: configcloud:config:uri: http://localhost:8080 #config服務端的地址label: masterprofile: prod #生產環境
3、編寫application.yml配置文件
server:port: 8888user:name: 小王 #配置默認值。配置中心有用配置中心的
4、創建UserController測試使用
@RestController
public class UserController {@Value("${user.name}")private String name;@GetMapping("info")public String info(){return name;}
}
5、啟動服務,訪問測試
可以看到,成功讀取到了配置中心中的config-dev.yml配置文件。將bootstrap.yml中的active改成prod在進行測試:
Spring Cloud Config是在項目啟動的時候加載的配置內容,導致了它存在一個缺陷,配置文件修改后,需要重啟服務才能生效。這也是我們之前說的第二個痛點。
為了解決這個痛點,它提供了一個刷新機制,但是需要我們主動出發。那就是 @RefreshScope 注解并結合 actuator 。
1、在spring-cloud-config-client
加入actuator依賴
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2、在application.yml中添加如下actuator的配置
management:endpoint:shutdown:enabled: falseendpoints:web:exposure:include: "*"
3、在Controller上添加@RefreshScope注解
@RestController
@RefreshScope
public class UserController {@Value("${user.name}")private String name;@GetMapping("info")public String info(){return name;}
}
4、主動觸發更新
在配置文件修改后,使用Postman發送一個post請求到http://localhost:8888/actuator/refresh 這個接口,觸發主動更新。
Spring Cloud Bus 將分布式系統的節點與輕量級消息代理鏈接。這可以用于廣播狀態更改(例如配置更改)或其他管理指令。一個關鍵的想法是,Bus 就像一個擴展的 Spring Boot 應用程序的分布式執行器,但也可以用作應用程序之間的通信渠道。
—— Spring Cloud Bus 官方解釋
如果每次配置文件修改后,都需要我們主動發送post請求觸發更新,這明顯有點不太方便。而且如何客戶端比較多的話,一個一個的手動刷新也比較耗時。這個時候,我們可以借助Spring Cloud Bus的廣播功能,讓client端都訂閱配置更新事件,當配置更新時,觸發其中一個端的更新事件,Spring Cloud Bus就把此事件廣播到其他訂閱端,以此來達到批量更新。
1、Spring Cloud Bus 核心原理其實就是利用消息隊列做廣播,所以要先有個消息隊列,目前官方支持 RabbitMQ 和 kafka。我們這里以RabbitMQ 為例。
2、在客戶端spring-cloud-config-client
中加入依賴
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bus-amqp</artifactId></dependency>
3、在配置文件中增加 RabbitMQ 相關配置
spring: rabbitmq:host: 192.168.243.136port: 5672username: guestpassword: guest
4、啟動倆個或多個客戶端進行測試
我們可以拷貝一份配置
然后修改vm options添加-Dserver.port=8889就行了
所以最后的結構就是倆個客戶端和一個配置中心服務端。
5、分別打開 http://localhost:8888/info和 http://localhost:8889/info,查看內容,然后修改碼云上配置文件的內容并提交。再次訪問這兩個地址,數據沒有變化。
6、訪問其中一個的 actuator/bus-refresh 地址,注意還是要用 POST 方式訪問。之后查看控制臺輸出,會看到這兩個端都有一條這樣的日志輸出
o.s.cloud.bus.event.RefreshListener: Received remote refresh request. Keys refreshed
7、再次訪問第 5 步的兩個地址,會看到內容都已經更新為修改后的數據了。
以上是Spring Cloud Config最基本的使用,在實際開發中,Spring Cloud Config可能會被注冊在Eureka中,這樣的話,可以Spring Cloud Config配置中心就可以搭建集群實現高可用。
此外引入Eureka后,config客戶端就不再需要直接和config服務端直接打交道了,而是通過Eureka來發現Config服務端。
加入Eureka后的架構圖如下:
簡單說明一下流程
首先搭建一個簡單的Eureka。如果你沒有學過Eureka的話,可以看看這篇文章Spring Cloud系列之Eureka入門使用。
1、導入依賴
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
2、編寫配置文件
spring:application:name: eureka-serverserver:port: 3000eureka:client:register-with-eureka: falsefetch-registry: falseservice-url.defaultZone: http://localhost:3000/eureka/
3、在啟動類標記@EnableEurekaServer
注解
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
1、給spring-cloud-config-server
項目添加Eureka依賴
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency>
2、在配置文件中添加Eureka相關配置
eureka:client:service-url:#注冊到eureka服務端的地址defaultZone: http://localhost:3000/eureka/instance:#點擊具體的微服務,右下角是否顯示ipprefer-ip-address: true#顯示微服務的名稱instance-id: spring-cloud-config-server
3、給主啟動類添加@EnableEurekaClient
注解
啟動配置中心后,訪問Eureka
1、給spring-cloud-config-client
項目添加Eureka依賴
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2、修改配置文件,添加Eureka的相關配置,并指定配置中心的application.name
spring:profiles:active: dev #激活開發環境的配置文件eureka:client:service-url:#注冊到eureka服務端的地址defaultZone: http://localhost:3000/eureka/instance:#點擊具體的微服務,右下角是否顯示ipprefer-ip-address: true#顯示微服務的名稱instance-id: spring-cloud-config-client---
spring:application:name: configcloud:config:
# uri: http://localhost:8080 #config服務端的地址,整合eureka后不需要填寫label: masterprofile: dev #開發環境discovery: #從Eureka中發現配置中心enabled: trueservice-id: config-server #指定配置中心的application.name---
spring:application:name: configcloud:config:
# uri: http://localhost:8080 #config服務端的地址label: masterprofile: prod #生產環境discovery: #從Eureka中發現配置中心enabled: trueservice-id: config-server #指定配置中心服務端的server-id
整合Eureka后,config客戶端不再需要指定config服務端的地址,而是通過config服務端的application.name從Eureka中獲取配置中心的信息。配置中心可以做集群高可用。
3、給主啟動類添加@EnableEurekaClient
注解
啟動后,查看Eureka,訪問http://localhost:8888/info
進行測試。
參考文章:
https://cloud.tencent.com/developer/article/1474037
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态