溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

選擇Spring Cloud Config作為配置中心的原因是什么

發(fā)布時(shí)間:2021-10-20 16:44:31 來(lái)源:億速云 閱讀:155 作者:iii 欄目:編程語(yǔ)言

這篇文章主要介紹“選擇Spring Cloud Config作為配置中心的原因是什么”,在日常操作中,相信很多人在選擇Spring Cloud Config作為配置中心的原因是什么問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”選擇Spring Cloud Config作為配置中心的原因是什么”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

什么是 Spring Cloud Config

一、Spring Cloud Config項(xiàng)目是一個(gè)解決分布式系統(tǒng)的配置解決方案。它包含了Client和Server兩個(gè)部分,Server提供配置文件的存儲(chǔ),以接口的形式將配置文件的內(nèi)容提供出去;Client通過(guò)接口獲取數(shù)據(jù),并依據(jù)此數(shù)據(jù)初始化自己的應(yīng)用。

服務(wù)端也稱(chēng)為分布式配置中心,它是一個(gè)獨(dú)立的微服務(wù)應(yīng)用,用來(lái)連接配置倉(cāng)庫(kù)并為客戶(hù)端提供獲取配置信息、加密/解密信息等訪(fǎng)問(wèn)接口。

客戶(hù)端則是微服務(wù)架構(gòu)中的各個(gè)微服務(wù)應(yīng)用或基礎(chǔ)設(shè)施,它們通過(guò)指定的配置中心來(lái)管理應(yīng)用資源與業(yè)務(wù)相關(guān)的配置內(nèi)容,并在啟動(dòng)的時(shí)候從配置中心獲取和加載配置信息。

二、Spring Cloud Config 默認(rèn)采用 Git 來(lái)存儲(chǔ)配置信息,所以使用 Spring Cloud Config 構(gòu)建的配置服務(wù)器,天然就支持對(duì)微服務(wù)用于配置信息的版本管理,并且可以通過(guò) Git 客戶(hù)端工具來(lái)方便地管理和訪(fǎng)問(wèn)配置內(nèi)容。

「注意:除了使用 Git 外,Spring Cloud Config 也同樣支持其他存儲(chǔ)方式比如:SVN、本地化文件系統(tǒng)等。」

Spring Cloud Config 基本用法

首先我們新建一個(gè)配置文件system-dev.properties,內(nèi)容如下

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

第一步,新建一個(gè)SpringCloudConfigServer模塊

選擇Spring Cloud Config作為配置中心的原因是什么

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 服務(wù)端依賴(lài)-->
        <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>

通過(guò)@EnableConfigServer可以激活配置中心服務(wù)。配置中心可以單獨(dú)做服務(wù),也可以嵌入到其它服務(wù)中。推薦用單獨(dú)做服務(wù)方式使用配置中心。

package com.javaer.study;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;

/**
 * @Author 公眾號(hào) | Java學(xué)習(xí)部落
 **/
@SpringBootApplication
@EnableConfigServer
public class SpringCloudConfigServerApplication {

    public static void main (String[] args) {
        SpringApplication.run (SpringCloudConfigServerApplication.class, args);
    }

}

由于配置文件的存儲(chǔ)的多樣性,下面主要介紹Git配置形式如何配置。當(dāng)然了所有的配置都配置在application.yml中。

application.yml 配置內(nèi)容如下

spring:
  application:
    name: configserver
  cloud:
    config:
      server:
        git:
          #  配置文件只搜索url目錄下的searchPaths
          uri: https://github.com/Maybe728/Spring_Cloud.git
          # 對(duì)應(yīng) {label} 部分,即 Git 的分支
          label: master
          # 指定搜索路徑,如果有多個(gè)路徑則使用,分隔
          search-paths: springcloud-config-git/config-repo
          # 對(duì)于使用git,svn做為后端配置,從遠(yuǎn)程庫(kù)獲取配置文件,需要存儲(chǔ)到本地文件
          basedir: /tmp/spring-cloud-repo
          # 配置中心通過(guò)git從遠(yuǎn)程git庫(kù),有時(shí)本地的拷貝被污染,這時(shí)配置中心無(wú)法從遠(yuǎn)程庫(kù)更新本地配置,設(shè)置force-pull=true,則強(qiáng)制從遠(yuǎn)程庫(kù)中更新本地庫(kù)
          force-pull: true
          # git 倉(cāng)庫(kù)用戶(hù)名(公開(kāi)庫(kù)可以不用填寫(xiě))
          username:
          # git 倉(cāng)庫(kù)密碼(公開(kāi)庫(kù)可以不用填寫(xiě))
          password:

spring.cloud.config.server.git.url:指定配置文件所在遠(yuǎn)程git庫(kù)的url地址

spring.cloud.config.server.git.label:即 Git 的分支

spring.cloud.config.server.git.searchPaths:和上面的參數(shù)url配合使用,定位git庫(kù)的子目錄。指定搜索路徑,如果有多個(gè)路徑則使用,分隔

spring.cloud.config.server.git.basedir:對(duì)于使用git,svn做為后端配置,從遠(yuǎn)程庫(kù)獲取配置文件,需要存儲(chǔ)到本地文件。默認(rèn)存儲(chǔ)在系統(tǒng)臨時(shí)目錄下,目錄名的前綴為config-repo-,如在linux下時(shí)可能是/tmp/config-repo-。因?yàn)?tmp下的內(nèi)容有可能被誤刪,所有為了保險(xiǎn),最好修改存儲(chǔ)目錄。如果你修改存儲(chǔ)目錄,你可以修改spring.cloud.config.server.git.basedir

spring.cloud.config.server.git.force-pull:配置中心通過(guò)git從遠(yuǎn)程git庫(kù)讀取數(shù)據(jù)時(shí),有時(shí)本地的拷貝被污染,這時(shí)配置中心無(wú)法從遠(yuǎn)程庫(kù)更新本地配置。設(shè)置force-pull=true,則強(qiáng)制從遠(yuǎn)程庫(kù)中更新本地庫(kù)

最后我們啟動(dòng)程序后訪(fǎng)問(wèn):http://localhost:8080/system-dev.properties

選擇Spring Cloud Config作為配置中心的原因是什么

「成功?。。。?!」

在瀏覽器中輸入如下URL,可以訪(fǎng)問(wèn)到配置文件

/{application}/{profile}[/{label}]

/{application}-{profile}.yml

/{label}/{application}-{profile}.yml

/{application}-{profile}.properties

/{label}/{application}-{profile}.properties

下面通過(guò)具體例子說(shuō)明以上url的意思。如果我們的配置文件名稱(chēng)system-dev.properties,則其和URL中各個(gè)字段對(duì)應(yīng)的值為:

「application: system」

「profile: dev」

搭建SpringCloudConfig客戶(hù)端

配置中心服務(wù)端配置成功后,然后其它服務(wù)從配置中心獲取配置文件,這樣的服務(wù)被稱(chēng)為**「客戶(hù)端」**。

下面我們來(lái)搭建一個(gè)Config Client。

首先新建一個(gè)SpringCloudConfigClient項(xiàng)目:

「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>

請(qǐng)將配置中心的相關(guān)配置配置在bootstrap.yml中,不要配appliaction.yml。

因?yàn)榉?wù)啟動(dòng)時(shí),會(huì)從bootstrap中讀取配置,然后從遠(yuǎn)程配置中心讀取配置文件,最后再?gòu)腶ppliaction中獲取配置,如果有相同的配置項(xiàng),則后面的會(huì)覆蓋前面讀到的值。

所以如果配置中心的配置配置在appliaction,則配置項(xiàng)不會(huì)有任何效果。

「bootstrap.yml」

server:
  port: 8888
  
spring:
  cloud:
    # 配置服務(wù)器的地址
    config:
      uri: http://127.0.0.1:8080
      # 要讀取配置文件讀取的值
      name: cloud-config
      # 如果不設(shè)置此值,則系統(tǒng)設(shè)置此值為 spring.profiles.active
      profile: dev
      # 可以使用之前的版本。默認(rèn)值可以是git label, branch name or commit id??梢允褂枚鄠€(gè)Label,多個(gè)Label可以使用逗號(hào)分隔
      # label:
      # true: 如果訪(fǎng)問(wèn)配置中心失敗,則停止啟動(dòng)服務(wù)
      fail-fast: true
      # 配置重試,默認(rèn)是重試6次,最初是延遲1s再次重試,如果再失敗,則延遲1.1*1s、1.1*1.1*1s、… 。可以使用這個(gè)配置
      retry:
        initial-interval: 2000
        # 最多重試次數(shù)
        max-attempts: 6
        # 最大重試間隔
        max-interval: 4000
        # 每次重試時(shí)間是之前的倍數(shù)
        multiplier: 1.2

重要參數(shù)的解釋如下:

「配置中心的url」:即從哪里讀取配置文件,通過(guò)“spring.cloud.config.url”配置

「要讀取哪些配置文件,由以下參數(shù)共同決定」

  • spring.cloud.config.name”:配置文件名稱(chēng),對(duì)應(yīng)上文的讀取URL中的{applicaion}值

  • spring.cloud.config.profile”:配置文件的profile,對(duì)應(yīng)上文的URL中的{profile}值

  • spring.cloud.config.label”:可以使用之前的版本。默認(rèn)值可以是git label, branch name or commit id??梢允褂枚鄠€(gè)Label,多個(gè)Label可以使用逗號(hào)分隔

「快速失敗」

如果要求客戶(hù)端訪(fǎng)問(wèn)配置中心失敗,則立即停止啟動(dòng)服務(wù),則設(shè)置“spring.cloud.config.label”為 true

「重試」

如果訪(fǎng)問(wèn)配置失敗,則自動(dòng)重試。默認(rèn)是重試**「6」次,最初是延遲「1s」**再次重試,如果再失敗,則延遲1.1*1s、1.1*1.1*1s、…。

通過(guò)下面參數(shù)可以修改值:

spring.cloud.config.retry.initial-interval”:第一次失敗,延遲多久重試

spring.cloud.config.retry.max-attempts”:最多重試次數(shù)

spring.cloud.config.retry.max-interval”: 最大重試間隔

spring.cloud.config.retry.multiplier”: 每次重試時(shí)間是之前的倍數(shù)

「如果要實(shí)現(xiàn)重試功能,需要引入新的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>

創(chuàng)建一個(gè)獲取配置信息成功后存放配置信息的對(duì)象

@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 + "]";
    }
}

創(chuàng)建一個(gè)Controller

package com.javaer.study;

import org.springframework.web.bind.annotation.RequestMapping;

/**
 * @author 公眾號(hào) | Java學(xué)習(xí)部落
 **/
public class SpringCloudConfigController {

    @RequestMapping ("/config")
    public JdbcConfigBean config() {
        return new JdbcConfigBean ();
    }
}

最后我們啟動(dòng)**「SpringCloudConfigClient」**,在瀏覽器輸入http://127.0.0.1:8888/config,就會(huì)看到配置信息。

Spring Cloud Config 整合 Eureka 實(shí)現(xiàn)服務(wù)化配置中心

首先我們需要搭建一個(gè)Eureka Server,這個(gè)不細(xì)說(shuō),因?yàn)樵谥爸v解Eureka的時(shí)候阿里面試官問(wèn)我:到底知不知道什么是Eureka,這次,我沒(méi)沉默已經(jīng)詳細(xì)的搭建過(guò)了,不會(huì)的可以去看看,順便補(bǔ)充下Eureka的相關(guān)知識(shí)。

接下來(lái)我們就要對(duì)配置中心進(jìn)行改造了。

「改造服務(wù)端」

第一步引入Eureka客戶(hù)端依賴(lài)

  <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  </dependency>

第二步在配置中心中添加如下配置

eureka:
  instance:
    preferIpAddress: true
  client:
    serviceUrl:
      # 注冊(cè)到 eureka
      defaultZone: http://localhost:8761/eureka

第三步在啟動(dòng)類(lèi)加入@EnableDiscoveryClient激活對(duì)注冊(cè)中心支持

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 公眾號(hào) | Java學(xué)習(xí)部落
 **/
@SpringBootApplication
@EnableConfigServer
@EnableDiscoveryClient
public class SpringCloudConfigServerApplication {

    public static void main (String[] args) {
        SpringApplication.run (SpringCloudConfigServerApplication.class, args);
    }

}

「服務(wù)端改造完成?。?!」


「改造客戶(hù)端」

第一步同樣引入Eureka Client 依賴(lài)

<dependency>
    <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

第二步修改配置

eureka:
  client:
    serviceUrl:
      # 指向注冊(cè)中心的地址
      defaultZone: http://127.0.0.1:8761/eureka
  instance:
    preferIpAddress: true
server:
  port: 8888
spring:
  cloud:
    # 配置服務(wù)器的地址
    config:
      uri: http://127.0.0.1:8080
      username: user
      password: 111111
      # 要讀取配置文件讀取的值
      name: system
      # 如果不設(shè)置此值,則系統(tǒng)設(shè)置此值為 spring.profiles.active
      profile: dev
      discovery:
        #表示開(kāi)啟服務(wù)發(fā)現(xiàn),對(duì)比上篇也主要是這里的改變,從指定config服務(wù)地址到注冊(cè)中心服務(wù)ID
        enabled: true
        serviceId: config-serve
      # 可以使用之前的版本。默認(rèn)值可以是git label, branch name or commit id??梢允褂枚鄠€(gè)Label,多個(gè)Label可以使用逗號(hào)分隔
      # label:
      # true: 如果訪(fǎng)問(wèn)配置中心失敗,則停止啟動(dòng)服務(wù)
      fail-fast: true
      # 配置重試,默認(rèn)是重試6次,最初是延遲1s再次重試,如果再失敗,則延遲1.1*1s、1.1*1.1*1s、… ??梢允褂眠@個(gè)配置
      retry:
        initial-interval: 2000
        # 最多重試次數(shù)
        max-attempts: 6
        # 最大重試間隔
        max-interval: 4000
        # 每次重試時(shí)間是之前的倍數(shù)
        multiplier: 1.2

最后一步在啟動(dòng)類(lèi)加入@EnableDiscoveryClient激活對(duì)注冊(cè)中心支持。

「客戶(hù)端改造完成!?。 ?/strong>

Spring Cloud Config 健康檢查

Config Server自帶了一個(gè)健康狀態(tài)指示器,用于檢查所配置的EnvironmentRepository是否正常工作。

可使用Config Server的/health端點(diǎn)查詢(xún)當(dāng)前健康狀態(tài)。

默認(rèn)情況下,健康指示器向EnvironmentRepository請(qǐng)求的{application}是app,{profile}和{label}是對(duì)應(yīng) EnvironmentRepository實(shí)現(xiàn)的默認(rèn)值。

對(duì)于Git,{profile}是default,{label}是master。

Spring Cloud Config 屬性覆蓋

Config Server 有一個(gè)“屬性覆蓋”的特性,它可以讓開(kāi)發(fā)人員為所有的應(yīng)用提供配置屬性,只需要通過(guò) spring.cloud.config.server.overrides 屬性來(lái)設(shè)置鍵值對(duì)的參數(shù),這些參數(shù)會(huì)以 Map 的方式加載到客戶(hù)端的配置中。

利用該特性可以方便地為 Spring Cloud 應(yīng)用配置一些共同屬性或是默認(rèn)屬性。

通過(guò)該屬性配置的參數(shù)(優(yōu)先級(jí)高于 Git 倉(cāng)庫(kù)里面的配置),同時(shí)也不會(huì)被 Spring Cloud 的客戶(hù)端修改。

所有 Spring Cloud 客戶(hù)端從 Config Server 中獲取配置信息時(shí),都會(huì)取得這些配置信息。

Spring Cloud Config 安全保護(hù)

我們知道,一般來(lái)說(shuō),配置中心的信息都是很敏感很機(jī)密的,比如數(shù)據(jù)庫(kù)賬號(hào)密碼的配置,redis賬號(hào)密碼的配置等等,所以對(duì)配置信息做一定的安全保護(hù)是十分有必要的。

由于微服務(wù)是構(gòu)建在Spring Boot之上,所以整合Spring Security是最方便的方式。

首先在服務(wù)端引入Spring Security依賴(lài)

<dependency>
    <!-- spring security 安全認(rèn)證 -->
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

然后再配置文件中增加Spring Security配置

  security:
    basic:
      enabled: true  #啟用基本認(rèn)證(默認(rèn))
    user:   #配置security用戶(hù)名密碼,默認(rèn)值為“user”的用戶(hù)名和隨機(jī)生成的密碼
      name: user
      password: 111111

啟動(dòng)服務(wù),測(cè)試一下。請(qǐng)求http://localhost:8080/system-dev.yml,會(huì)出現(xiàn)登陸界面

選擇Spring Cloud Config作為配置中心的原因是什么

「成功?。?!」

**「同時(shí)」我們?cè)?/strong>「SpringCloudConfigClient」工程中,我們修改「bootstrap.yml」配置文件(在這里配置了Config Server的訪(fǎng)問(wèn)信息),為其添加認(rèn)證,我們選擇添加「spring.cloud.config.username」「spring.cloud.config.password」**屬性

server:
  port: 8888

spring:
  cloud:
    # 配置服務(wù)器的地址
    config:
      uri: http://127.0.0.1:8080
      username: user
      password: 111111
      # 要讀取配置文件讀取的值
      name: system
      # 如果不設(shè)置此值,則系統(tǒng)設(shè)置此值為 spring.profiles.active
      profile: dev
      # 可以使用之前的版本。默認(rèn)值可以是git label, branch name or commit id??梢允褂枚鄠€(gè)Label,多個(gè)Label可以使用逗號(hào)分隔
      # label:
      # true: 如果訪(fǎng)問(wèn)配置中心失敗,則停止啟動(dòng)服務(wù)
      fail-fast: true
      # 配置重試,默認(rèn)是重試6次,最初是延遲1s再次重試,如果再失敗,則延遲1.1*1s、1.1*1.1*1s、… ??梢允褂眠@個(gè)配置
      retry:
        initial-interval: 2000
        # 最多重試次數(shù)
        max-attempts: 6
        # 最大重試間隔
        max-interval: 4000
        # 每次重試時(shí)間是之前的倍數(shù)
        multiplier: 1.2

Spring Cloud Config 請(qǐng)求配置失敗快速響應(yīng)與重試

Spring Cloud Config 的客戶(hù)端會(huì)預(yù)先加載很多其他信息,然后再開(kāi)始連接 Config Server 進(jìn)行屬性的注入。當(dāng)我們構(gòu)建的應(yīng)用較為復(fù)雜的時(shí)候,可能在連接 Config Server 之前花費(fèi)較長(zhǎng)的啟動(dòng)時(shí)間,而在一些特殊場(chǎng)景下,我們又希望可以快速知道當(dāng)前應(yīng)用是否能順利地從 Config Server 獲取到配置信息,這對(duì)在初期構(gòu)建調(diào)試環(huán)境時(shí),可以減少很多等待啟動(dòng)的時(shí)間。

首先如果我們不啟動(dòng)服務(wù)端 Config-Server,直接啟動(dòng)客戶(hù)端應(yīng)用時(shí) 如果未配置spring.cloud.config.fail-fast=true這個(gè)參數(shù),在配置加載報(bào)錯(cuò)之前,客戶(hù)端應(yīng)用便已經(jīng)加載了很多內(nèi)容,比如 Controller 的請(qǐng)求等。

如果配置了spring.cloud.config.fail-fast=true參數(shù),啟動(dòng)客戶(hù)端后前置的加載內(nèi)容會(huì)少很多,很快就報(bào)錯(cuò)。這樣有效避免了當(dāng) Config-server 配置有誤時(shí),不需要多等待前置的一些加載時(shí)間,實(shí)現(xiàn)了快速返回失敗信息。

「這個(gè)就是我們說(shuō)的請(qǐng)求配置失敗快速響應(yīng)?。?!」

有時(shí)可能因?yàn)榫W(wǎng)絡(luò)波動(dòng)等其他間歇性原因?qū)е逻B接失敗,Config 客戶(hù)端還提供了重試功能,避免一些間歇性問(wèn)題引起的失敗導(dǎo)致客戶(hù)端應(yīng)用服務(wù)啟動(dòng)的情況。

要實(shí)現(xiàn)這個(gè)功能,首先我們要在在客戶(hù)端的**「pom.xml」**中增加 spring-retry 和 spring-boot-starter-aop 依賴(lài):

<dependency>
    <groupId>org.springframework.retry</groupId>
    <artifactId>spring-retry</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

然后配置了失敗快速響應(yīng)參數(shù)即可。

spring.cloud.config.fail-fast=true

重點(diǎn)配置解讀。

spring.cloud.config.retry.multiplier:初始重試間隔時(shí)間(單位為毫秒),默認(rèn)值為 1000 毫秒

spring.cloud.config.retry.initial-interval:下一間隔的乘數(shù),默認(rèn)為 1.1(當(dāng)最初間隔為 1000 毫秒時(shí),下一次失敗的間隔為 1100 毫秒)

spring.cloud.config.retry.max-interval:最大間隔時(shí)間,默認(rèn)為 2000 毫秒

spring.cloud.config.retry.max-attempts:最大重試此時(shí),默認(rèn)為 6 次

Spring Cloud Config 如何實(shí)現(xiàn)動(dòng)態(tài)刷新配置

現(xiàn)在我們思考下這個(gè)問(wèn)題:

如果在服務(wù)運(yùn)行過(guò)程中,我們需要將驗(yàn)證碼的失效時(shí)間從1分鐘調(diào)整為2分鐘,那么服務(wù)端如何在不重啟服務(wù)的情況下就能使修改的配置動(dòng)態(tài)生效呢?

這就是我們接下來(lái)要說(shuō)的**「動(dòng)態(tài)刷新」**

實(shí)現(xiàn)動(dòng)態(tài)刷新配置有兩種方式

  1. 使用Actuator

  2. 使用Spring Cloud Bus(后續(xù)會(huì)有專(zhuān)文介紹,再次不做講解)

接下來(lái)我們就來(lái)使用Actuator來(lái)是實(shí)現(xiàn)動(dòng)態(tài)刷新配置

首先我們?cè)诳蛻?hù)端的 pom.xml 中新增 spring-boot-starter-actuator 監(jiān)控模塊

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

?

spring-boot-starter-actuator 監(jiān)控模塊中包含了 /refresh 端點(diǎn)的實(shí)現(xiàn),該端點(diǎn)將用于實(shí)現(xiàn)客戶(hù)端應(yīng)用配置信息的重新獲取與刷新。

?

接著編輯 application.properties 文件,添加如下配置開(kāi)啟 /refresh 端點(diǎn):

management.endpoints.web.exposure.include=refresh

很簡(jiǎn)單到這兒客戶(hù)端改造就結(jié)束了,我們只需要重啟客戶(hù)端,然后修改git中的配置信息,在重新獲取配置信息我們就會(huì)發(fā)現(xiàn)已經(jīng)配置信息已經(jīng)修改了。

我們使用 /actuator/env 與 /actuator/refresh 兩個(gè)接口可以實(shí)現(xiàn)單個(gè)服務(wù)實(shí)例配置的動(dòng)態(tài)更新,但在微服務(wù)架構(gòu)中,服務(wù)實(shí)例可能達(dá)幾十甚至幾百個(gè),一個(gè)個(gè)調(diào)用來(lái)做動(dòng)態(tài)更新就有點(diǎn)太不方便了。

到此,關(guān)于“選擇Spring Cloud Config作為配置中心的原因是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI