Spring Cloud之——Config(配置中心)

Spring Cloud Config(配置中心)java

  你們好,有一段時間沒有寫技術博客了。因爲工做上的事情,這方面很難分配時間。近幾年隨着服務化的興起,一批服務化的框架應運而生,像dubbo,thrift,spring-cloud等。在國內使用dubbo的公司很是多,dubbo也是java程序員面試時必備知識點,並且它的官方文檔寫的很是清晰易懂,這都使得dubbo的普及很是容易。thrift是apache貢獻的,彷佛也流行了一段時間,小編對這個框架不是很瞭解。隨後spring-cloud一經推出,便在技術圈流行起來,這段時間小編也在學習spring-cloud,將學到的東西和你們分享一下,若是有不對的地方,還請你們多多指正。mysql

1、簡介git

  Spring Cloud Config爲分佈式系統中的外部配置提供服務器和客戶端支持。使用Config Server,您能夠爲全部環境中的應用程序管理其外部屬性。它很是適合spring應用,也可使用在其餘語言的應用上。隨着應用程序經過從開發到測試和生產的部署流程,您能夠管理這些環境之間的配置,並肯定應用程序具備遷移時須要運行的一切。服務器存儲後端的默認實現使用git,所以它輕鬆支持標籤版本的配置環境,以及能夠訪問用於管理內容的各類工具。程序員

  Spring Cloud Config服務端特性github

  • HTTP,爲外部配置提供基於資源的API(鍵值對,或者等價的YAML內容)
  • 屬性值的加密和解密(對稱加密和非對稱加密)
  • 經過使用@EnableConfigServer在Spring boot應用中很是簡單的嵌入。

  Config客戶端的特性(特指Spring應用)面試

  • 綁定Config服務端,並使用遠程的屬性源初始化Spring環境。
  • 屬性值的加密和解密(對稱加密和非對稱加密)

  入門示例:spring

  只要classpath下有Spring Boot Actuator和Spring Config Client,Spring Boot應用就會嘗試鏈接配置服務http://localhost:8888,這個地址是spring.cloud.config.uri的默認地址。若是你想修改這個地址,你能夠在bootstrap.[yml或properties]中設置spring.cloud.config.uri或者經過系統屬性或者經過環境變量。sql

@Configuration
@EnableAutoConfiguration
@RestController
public class Application {

  @Value("${config.name}")
  String name = "World";

  @RequestMapping("/")
  public String home() {
    return "Hello " + name;
  }

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

}

  上面例子中的config.name能夠來自本地的配置文件,也能夠來自遠程的配置服務。默認狀況下,遠程的配置服務將優先使用。apache

  爲了運行你本身的配置服務中心,你可使用spring-cloud-config-server依賴,和@EnableConfigServer註解。若是你設置了spring.config.name=configserver,應用將會運行在8888端口,而且從一個樣本倉庫提供數據。你須要設置spring.cloud.config.server.git.uri來指定你本身的配置數據。默認的,它是一個git倉庫,也能夠配置成本地的文件系統。bootstrap

2、Spring Cloud Config服務端

  服務器爲外部配置(鍵稱值對或等效的YAML內容)提供了基於資源的HTTP。它能夠在Spring Boot應用中使用@EnableConfigServer內嵌。例子以下:

@SpringBootApplication
@EnableConfigServer
public class SpringCloudConfigServerApplication {

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

  像全部的Spring Boot應用同樣,它默認運行在8080端口,你能夠經過多種方式將其切換到8888端口。最簡單的能夠設置spring.config.name=configserver(在Config Server的jar包有一個configserver.yml),它設置了一個默認的配置倉庫。另一種方式是使用你本身的application.properties,這也是小編推薦的方式:

server.port: 8888
spring.cloud.config.server.git.uri: git地址

  git地址中是你的YAML或者properties文件。

  環境倉庫

  你想在哪裏存儲配置數據?支持這種行爲的策略是EnvironmentRepository,它服務於Environment實例。這個Environment是Spring Environment的一個淺副本。Environment經過3個變量被參數化。

  • {application}映射客戶端的"spring.application.name"
  • {profile}映射客戶端的"spring.profiles.active"(逗號分隔列表)
  • {label}它是服務端的特性,標記版本的一組配置文件

  倉庫的實現一般表現的像Spring boot加載配置文件同樣,"spring.config.name"等於{application}參數, "spring.profiles.active" 等於{profile}參數。profiles的優先規則和正常的規則是同樣的,活動的profiles優於默認的。若是有多個profiles,則最後一個勝出。

  客戶端的配置實例:

spring:
  application:
    name: foo
  profiles:
    active: dev,mysql

  在Spring Boot應用中,這些參數也能夠經過環境變量或者命令行參數設置。

  git後端

  EnvironmentRepository的默認實現是使用git後端,它對管理更新、物理環境和審覈更改很是的方便。要改變倉庫的地址,你能夠在配置服務端設置"spring.cloud.config.server.git.uri"屬性(在application.properties文件中)。若是你用file:開頭設置它,它將從本地倉庫運行,這樣能夠在沒有服務端的狀況下很是快速和簡單的啓動。這種狀況,服務端將直接在本地倉庫中運行。爲了擴展配置服務並使它高可用,你須要把服務的全部實例指向同一個倉庫,所以只有共享文件系統能夠工做。即便在這種狀況下,最好使用共享文件系統存儲庫的ssh:協議,以便服務器能夠將其克隆並使用本地工做副本做爲緩存。

  該倉庫的實現將HTTP資源中的{label}參數映射到git的標籤(提交id、分支名稱或者tag)。若是git分支或者tag名稱中包含「/」,則HTTP URL中的label要使用特殊字符「(_)」代替。例如:若是分支的名稱是foo/bar,則HTTP中的label的格式爲foo(_)bar。這個特殊字符也能夠用到{application}參數中。

  git URI中的佔位符

  Spring Cloud Config Server支持在git URL中使用佔位符,使用{application} 和 {profile}(若是使用{label},請記住它是使用在git標籤中的)。所以你能夠輕鬆的支持「一個應用一個倉庫」的原則。以下:

spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/myorg/{application}

  或者一個環境一個倉庫的原則,使用{profile}代替{application}。另外在{application}參數中使用特殊字符"(_)"能夠支持多組織。

spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/{application}

  {application}參數的格式爲"organization(_)application"。

  模式匹配和多倉庫

  在{application}和{profile}參數中使用模式匹配能夠支持更多複雜的需求。模式的格式是一組逗號分隔的{application}/{profile},其中的參數可使用通配符。例如:

spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/spring-cloud-samples/config-repo
          repos:
            simple: https://github.com/simple/config-repo
            special:
              pattern: special*/dev*,*special*/dev*
              uri: https://github.com/special/config-repo
            local:
              pattern: local*
              uri: file:/home/configsvc/config-repo

  若是{application}/{profile}沒有匹配到任何模式,它將使用默認的倉庫地址:spring.cloud.config.server.git.uri。上面的例子中,"simple"倉庫匹配的是「simple/*」(它僅僅匹配一個倉庫simple,在全部的環境下)。"local"倉庫將匹配全部{application}的名字以「local」開頭的,而且也是在全部的環境下。「/*」前綴自動添加到全部沒有設置{profile}的模式中。

  每個倉庫也能夠在子目錄下存儲配置文件,模式匹配也能夠用於搜索這些目錄,須要制定searchPaths,以下:

spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/spring-cloud-samples/config-repo
          searchPaths: foo,bar*

  上面的例子中,將在foo和以bar開頭的目錄中,搜索配置文件。

  默認地,服務器在第一次請求配置文件時克隆遠程的倉庫,服務器也能夠配置在啓動的時候克隆倉庫,以下:

spring:
  cloud:
    config:
      server:
        git:
          uri: https://git/common/config-repo.git
          repos:
            team-a:
                pattern: team-a-*
                cloneOnStart: true
                uri: http://git/team-a/config-repo.git
            team-b:
                pattern: team-b-*
                cloneOnStart: false
                uri: http://git/team-b/config-repo.git
            team-c:
                pattern: team-c-*
                uri: http://git/team-a/config-repo.git

  在上面的例子team-a的倉庫將在服務端啓動時進行克隆,其餘的倉庫將在第一次請求時克隆。

  認證

  若是遠程的git倉庫須要用戶名和密碼,能夠參照下面的例子

spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/spring-cloud-samples/config-repo
          username: trolley
          password: strongpassword

  到此,Spring Cloud Config服務端就介紹到這裏,還有一些不經常使用的功能在這裏就不介紹了,你們能夠參照spring cloud官網。Spring Cloud Config服務端的代碼示例能夠參照個人GitHub地址:https://github.com/bigbugliu/spring-cloud-config-server。

3、Spring Cloud Config 客戶端

  Spring Boot應用能夠當即使用Spring Config Server。只要在classpath中有Spring Cloud Config Client的jar包,這個應用就會請求配置的服務端。他將使用綁定的配置服務器(spring.cloud.config.uri中配置的)的屬性初始化spring環境。

  在某些狀況下,若是服務沒法鏈接到配置服務器,則可能但願啓動服務失敗。若是這是所需的行爲,請設置引導配置屬性spring.cloud.config.failFast=true,客戶端將以異常中止。

  若是您但願配置服務器在您的應用程序啓動時可能偶爾不可用,您能夠要求它在發生故障後繼續嘗試。首先,您須要設置spring.cloud.config.failFast=true,而後您須要將spring-retry和spring-boot-starter-aop添加到您的類路徑中。默認行爲是重試6次,初始退避間隔爲1000ms,指數乘數爲1.1,用於後續退避。您可使用spring.cloud.config.retry.*配置屬性配置這些屬性(和其餘)。

  詳細代碼請參考個人GitHub:https://github.com/bigbugliu/spring-boot-demo。

  

Spring Cloud Config就介紹完了,歡迎你們在評論區討論。

相關文章
相關標籤/搜索