您好,登錄后才能下訂單哦!
這篇文章主要介紹“選擇Spring Cloud Config作為配置中心的原因是什么”,在日常操作中,相信很多人在選擇Spring Cloud Config作為配置中心的原因是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”選擇Spring Cloud Config作為配置中心的原因是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
一、Spring Cloud Config項目是一個解決分布式系統的配置解決方案。它包含了Client和Server兩個部分,Server提供配置文件的存儲,以接口的形式將配置文件的內容提供出去;Client通過接口獲取數據,并依據此數據初始化自己的應用。
服務端也稱為分布式配置中心,它是一個獨立的微服務應用,用來連接配置倉庫并為客戶端提供獲取配置信息、加密/解密信息等訪問接口。
客戶端則是微服務架構中的各個微服務應用或基礎設施,它們通過指定的配置中心來管理應用資源與業務相關的配置內容,并在啟動的時候從配置中心獲取和加載配置信息。
二、Spring Cloud Config 默認采用 Git 來存儲配置信息,所以使用 Spring Cloud Config 構建的配置服務器,天然就支持對微服務用于配置信息的版本管理,并且可以通過 Git 客戶端工具來方便地管理和訪問配置內容。
「注意:除了使用 Git 外,Spring Cloud Config 也同樣支持其他存儲方式比如:SVN、本地化文件系統等。」
首先我們新建一個配置文件system-dev.properties,內容如下
jdbc.driverClassName: com.mysql.jdbc.Driver jdbc.url: jdbc:mysql://127.0.0.1:3306/testproject jdbc.username: root jdbc.password: root
然后我們將該配置文件上傳了github,Demo地址:https://github.com/Maybe728/Spring_Cloud
第一步,新建一個SpringCloudConfigServer模塊
pom.xml代碼如下:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.cnblogs.hellxz</groupId> <artifactId>ConfigServer</artifactId> <version>1.0-SNAPSHOT</version> <parent> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-parent</artifactId> <version>Dalston.SR5</version> <relativePath/> </parent> <dependencies> <!--Spring Cloud Config 服務端依賴--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build> </project>
通過@EnableConfigServer可以激活配置中心服務。配置中心可以單獨做服務,也可以嵌入到其它服務中。推薦用單獨做服務方式使用配置中心。
package com.javaer.study; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.config.server.EnableConfigServer; /** * @Author 公眾號 | Java學習部落 **/ @SpringBootApplication @EnableConfigServer public class SpringCloudConfigServerApplication { public static void main (String[] args) { SpringApplication.run (SpringCloudConfigServerApplication.class, args); } }
由于配置文件的存儲的多樣性,下面主要介紹Git配置形式如何配置。當然了所有的配置都配置在application.yml中。
application.yml 配置內容如下
spring: application: name: configserver cloud: config: server: git: # 配置文件只搜索url目錄下的searchPaths uri: https://github.com/Maybe728/Spring_Cloud.git # 對應 {label} 部分,即 Git 的分支 label: master # 指定搜索路徑,如果有多個路徑則使用,分隔 search-paths: springcloud-config-git/config-repo # 對于使用git,svn做為后端配置,從遠程庫獲取配置文件,需要存儲到本地文件 basedir: /tmp/spring-cloud-repo # 配置中心通過git從遠程git庫,有時本地的拷貝被污染,這時配置中心無法從遠程庫更新本地配置,設置force-pull=true,則強制從遠程庫中更新本地庫 force-pull: true # git 倉庫用戶名(公開庫可以不用填寫) username: # git 倉庫密碼(公開庫可以不用填寫) password:
spring.cloud.config.server.git.url
:指定配置文件所在遠程git庫的url地址
spring.cloud.config.server.git.label
:即 Git 的分支
spring.cloud.config.server.git.searchPaths
:和上面的參數url配合使用,定位git庫的子目錄。指定搜索路徑,如果有多個路徑則使用,分隔
spring.cloud.config.server.git.basedir
:對于使用git,svn做為后端配置,從遠程庫獲取配置文件,需要存儲到本地文件。默認存儲在系統臨時目錄下,目錄名的前綴為config-repo-,如在linux下時可能是/tmp/config-repo-。因為/tmp下的內容有可能被誤刪,所有為了保險,最好修改存儲目錄。如果你修改存儲目錄,你可以修改spring.cloud.config.server.git.basedir
spring.cloud.config.server.git.force-pull
:配置中心通過git從遠程git庫讀取數據時,有時本地的拷貝被污染,這時配置中心無法從遠程庫更新本地配置。設置force-pull=true,則強制從遠程庫中更新本地庫
最后我們啟動程序后訪問:http://localhost:8080/system-dev.properties
「成功!!!!!」
在瀏覽器中輸入如下URL,可以訪問到配置文件
/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
下面通過具體例子說明以上url的意思。如果我們的配置文件名稱system-dev.properties,則其和URL中各個字段對應的值為:
「application: system」
「profile: dev」
配置中心服務端配置成功后,然后其它服務從配置中心獲取配置文件,這樣的服務被稱為**「客戶端」**。
下面我們來搭建一個Config Client。
首先新建一個SpringCloudConfigClient項目:
「pom.xml」
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.4.1</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.javaer.study</groupId> <artifactId>springcloudconfigclient</artifactId> <version>0.0.1-SNAPSHOT</version> <name>springcloudconfigclient</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> <spring-cloud.version>2020.0.0</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> <repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> </repository> </repositories> </project>
請將配置中心的相關配置配置在bootstrap.yml中,不要配appliaction.yml。
因為服務啟動時,會從bootstrap中讀取配置,然后從遠程配置中心讀取配置文件,最后再從appliaction中獲取配置,如果有相同的配置項,則后面的會覆蓋前面讀到的值。
所以如果配置中心的配置配置在appliaction,則配置項不會有任何效果。
「bootstrap.yml」
server: port: 8888 spring: cloud: # 配置服務器的地址 config: uri: http://127.0.0.1:8080 # 要讀取配置文件讀取的值 name: cloud-config # 如果不設置此值,則系統設置此值為 spring.profiles.active profile: dev # 可以使用之前的版本。默認值可以是git label, branch name or commit id。可以使用多個Label,多個Label可以使用逗號分隔 # label: # true: 如果訪問配置中心失敗,則停止啟動服務 fail-fast: true # 配置重試,默認是重試6次,最初是延遲1s再次重試,如果再失敗,則延遲1.1*1s、1.1*1.1*1s、… 。可以使用這個配置 retry: initial-interval: 2000 # 最多重試次數 max-attempts: 6 # 最大重試間隔 max-interval: 4000 # 每次重試時間是之前的倍數 multiplier: 1.2
重要參數的解釋如下:
「配置中心的url」:即從哪里讀取配置文件,通過“spring.cloud.config.url”配置
「要讀取哪些配置文件,由以下參數共同決定」
“spring.cloud.config.name
”:配置文件名稱,對應上文的讀取URL中的{applicaion}值
“spring.cloud.config.profile
”:配置文件的profile,對應上文的URL中的{profile}值
“spring.cloud.config.label
”:可以使用之前的版本。默認值可以是git label, branch name or commit id。可以使用多個Label,多個Label可以使用逗號分隔
「快速失敗」
如果要求客戶端訪問配置中心失敗,則立即停止啟動服務,則設置“spring.cloud.config.label”為 true
「重試」
如果訪問配置失敗,則自動重試。默認是重試**「6」次,最初是延遲「1s」**再次重試,如果再失敗,則延遲1.1*1s、1.1*1.1*1s、…
。
通過下面參數可以修改值:
“spring.cloud.config.retry.initial-interval
”:第一次失敗,延遲多久重試
“spring.cloud.config.retry.max-attempts
”:最多重試次數
“spring.cloud.config.retry.max-interval
”: 最大重試間隔
“spring.cloud.config.retry.multiplier
”: 每次重試時間是之前的倍數
「如果要實現重試功能,需要引入新的jar」
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework.retry/spring-retry --> <dependency> <groupId>org.springframework.retry</groupId> <artifactId>spring-retry</artifactId> </dependency>
創建一個獲取配置信息成功后存放配置信息的對象
@Component public class JdbcConfigBean { @Value("${jdbc.url}") private String url; @Value("${jdbc.username}") private String username; @Value("${jdbc.password}") private String password; @Value("${jdbc.driverClassName}") private String driverClassName; public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getDriverClassName() { return driverClassName; } public void setDriverClassName(String driverClassName) { this.driverClassName = driverClassName; } @Override public String toString() { return "JdbcConfigBean [url=" + url + ", username=" + username + ", password=" + password + ", driverClassName=" + driverClassName + "]"; } }
創建一個Controller
package com.javaer.study; import org.springframework.web.bind.annotation.RequestMapping; /** * @author 公眾號 | Java學習部落 **/ public class SpringCloudConfigController { @RequestMapping ("/config") public JdbcConfigBean config() { return new JdbcConfigBean (); } }
最后我們啟動**「SpringCloudConfigClient」**,在瀏覽器輸入http://127.0.0.1:8888/config,就會看到配置信息。
首先我們需要搭建一個Eureka Server,這個不細說,因為在之前講解Eureka的時候阿里面試官問我:到底知不知道什么是Eureka,這次,我沒沉默已經詳細的搭建過了,不會的可以去看看,順便補充下Eureka的相關知識。
接下來我們就要對配置中心進行改造了。
「改造服務端」
第一步引入Eureka客戶端依賴
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
第二步在配置中心中添加如下配置
eureka: instance: preferIpAddress: true client: serviceUrl: # 注冊到 eureka defaultZone: http://localhost:8761/eureka
第三步在啟動類加入@EnableDiscoveryClient激活對注冊中心支持
package com.javaer.study; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.config.server.EnableConfigServer; /** * @Author 公眾號 | Java學習部落 **/ @SpringBootApplication @EnableConfigServer @EnableDiscoveryClient public class SpringCloudConfigServerApplication { public static void main (String[] args) { SpringApplication.run (SpringCloudConfigServerApplication.class, args); } }
「服務端改造完成!!!」
「改造客戶端」
第一步同樣引入Eureka Client 依賴
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
第二步修改配置
eureka: client: serviceUrl: # 指向注冊中心的地址 defaultZone: http://127.0.0.1:8761/eureka instance: preferIpAddress: true server: port: 8888 spring: cloud: # 配置服務器的地址 config: uri: http://127.0.0.1:8080 username: user password: 111111 # 要讀取配置文件讀取的值 name: system # 如果不設置此值,則系統設置此值為 spring.profiles.active profile: dev discovery: #表示開啟服務發現,對比上篇也主要是這里的改變,從指定config服務地址到注冊中心服務ID enabled: true serviceId: config-serve # 可以使用之前的版本。默認值可以是git label, branch name or commit id。可以使用多個Label,多個Label可以使用逗號分隔 # label: # true: 如果訪問配置中心失敗,則停止啟動服務 fail-fast: true # 配置重試,默認是重試6次,最初是延遲1s再次重試,如果再失敗,則延遲1.1*1s、1.1*1.1*1s、… 。可以使用這個配置 retry: initial-interval: 2000 # 最多重試次數 max-attempts: 6 # 最大重試間隔 max-interval: 4000 # 每次重試時間是之前的倍數 multiplier: 1.2
最后一步在啟動類加入@EnableDiscoveryClient激活對注冊中心支持。
「客戶端改造完成!!!」
Config Server自帶了一個健康狀態指示器,用于檢查所配置的EnvironmentRepository是否正常工作。
可使用Config Server的/health端點查詢當前健康狀態。
默認情況下,健康指示器向EnvironmentRepository請求的{application}是app,{profile}和{label}是對應 EnvironmentRepository實現的默認值。
對于Git,{profile}是default,{label}是master。
Config Server 有一個“屬性覆蓋”的特性,它可以讓開發人員為所有的應用提供配置屬性,只需要通過 spring.cloud.config.server.overrides 屬性來設置鍵值對的參數,這些參數會以 Map 的方式加載到客戶端的配置中。
利用該特性可以方便地為 Spring Cloud 應用配置一些共同屬性或是默認屬性。
通過該屬性配置的參數(優先級高于 Git 倉庫里面的配置),同時也不會被 Spring Cloud 的客戶端修改。
所有 Spring Cloud 客戶端從 Config Server 中獲取配置信息時,都會取得這些配置信息。
我們知道,一般來說,配置中心的信息都是很敏感很機密的,比如數據庫賬號密碼的配置,redis賬號密碼的配置等等,所以對配置信息做一定的安全保護是十分有必要的。
由于微服務是構建在Spring Boot之上,所以整合Spring Security是最方便的方式。
首先在服務端引入Spring Security依賴
<dependency> <!-- spring security 安全認證 --> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
然后再配置文件中增加Spring Security配置
security: basic: enabled: true #啟用基本認證(默認) user: #配置security用戶名密碼,默認值為“user”的用戶名和隨機生成的密碼 name: user password: 111111
啟動服務,測試一下。請求http://localhost:8080/system-dev.yml,會出現登陸界面
「成功!!!」
**「同時」我們在「SpringCloudConfigClient」工程中,我們修改「bootstrap.yml」配置文件(在這里配置了Config Server的訪問信息),為其添加認證,我們選擇添加「spring.cloud.config.username」和「spring.cloud.config.password」**屬性
server: port: 8888 spring: cloud: # 配置服務器的地址 config: uri: http://127.0.0.1:8080 username: user password: 111111 # 要讀取配置文件讀取的值 name: system # 如果不設置此值,則系統設置此值為 spring.profiles.active profile: dev # 可以使用之前的版本。默認值可以是git label, branch name or commit id。可以使用多個Label,多個Label可以使用逗號分隔 # label: # true: 如果訪問配置中心失敗,則停止啟動服務 fail-fast: true # 配置重試,默認是重試6次,最初是延遲1s再次重試,如果再失敗,則延遲1.1*1s、1.1*1.1*1s、… 。可以使用這個配置 retry: initial-interval: 2000 # 最多重試次數 max-attempts: 6 # 最大重試間隔 max-interval: 4000 # 每次重試時間是之前的倍數 multiplier: 1.2
Spring Cloud Config 的客戶端會預先加載很多其他信息,然后再開始連接 Config Server 進行屬性的注入。當我們構建的應用較為復雜的時候,可能在連接 Config Server 之前花費較長的啟動時間,而在一些特殊場景下,我們又希望可以快速知道當前應用是否能順利地從 Config Server 獲取到配置信息,這對在初期構建調試環境時,可以減少很多等待啟動的時間。
首先如果我們不啟動服務端 Config-Server,直接啟動客戶端應用時 如果未配置spring.cloud.config.fail-fast=true
這個參數,在配置加載報錯之前,客戶端應用便已經加載了很多內容,比如 Controller 的請求等。
如果配置了spring.cloud.config.fail-fast=true
參數,啟動客戶端后前置的加載內容會少很多,很快就報錯。這樣有效避免了當 Config-server 配置有誤時,不需要多等待前置的一些加載時間,實現了快速返回失敗信息。
「這個就是我們說的請求配置失敗快速響應!!!」
有時可能因為網絡波動等其他間歇性原因導致連接失敗,Config 客戶端還提供了重試功能,避免一些間歇性問題引起的失敗導致客戶端應用服務啟動的情況。
要實現這個功能,首先我們要在在客戶端的**「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>
然后配置了失敗快速響應參數即可。
spring.cloud.config.fail-fast=true
重點配置解讀。
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
:最大重試此時,默認為 6 次
現在我們思考下這個問題:
如果在服務運行過程中,我們需要將驗證碼的失效時間從1分鐘調整為2分鐘,那么服務端如何在不重啟服務的情況下就能使修改的配置動態生效呢?
這就是我們接下來要說的**「動態刷新」**
實現動態刷新配置有兩種方式
使用Actuator
使用Spring Cloud Bus(后續會有專文介紹,再次不做講解)
接下來我們就來使用Actuator來是實現動態刷新配置
首先我們在客戶端的 pom.xml 中新增 spring-boot-starter-actuator 監控模塊
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
?
spring-boot-starter-actuator 監控模塊中包含了 /refresh 端點的實現,該端點將用于實現客戶端應用配置信息的重新獲取與刷新。
?
接著編輯 application.properties 文件,添加如下配置開啟 /refresh 端點:
management.endpoints.web.exposure.include=refresh
很簡單到這兒客戶端改造就結束了,我們只需要重啟客戶端,然后修改git中的配置信息,在重新獲取配置信息我們就會發現已經配置信息已經修改了。
我們使用 /actuator/env 與 /actuator/refresh 兩個接口可以實現單個服務實例配置的動態更新,但在微服務架構中,服務實例可能達幾十甚至幾百個,一個個調用來做動態更新就有點太不方便了。
到此,關于“選擇Spring Cloud Config作為配置中心的原因是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。