Spring Cloud 學習筆記(一)——入門、特征、配置


0 放在前面

0.1 參考文檔

0.2 maven配置

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.2.RELEASE</version>
</parent>
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Dalston.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-config</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka</artifactId>
    </dependency>
</dependencies>

0.3 簡介

Spring Cloud為開發人員提供了快速構建分布式系統中的一些通用模式(例如配置管理,服務發現,斷路器,智能路由,微代理,控制總線,一次性令牌,全局鎖,領導選舉,分布式 會話,群集狀態)。 分布式系統的協調引出樣板模式(boiler plate patterns),並且使用Spring Cloud開發人員可以快速地實現這些模式來啟動服務和應用程序。 它們可以在任何分布式環境中正常工作,包括開發人員自己的筆記本電腦,裸機數據中心和受管平台,如Cloud Foundry。

Version: Brixton.SR7


1 特征

Spring Cloud專注於為經典用例和擴展機制提供良好的開箱即用

  • 分布式/版本配置
  • 服務注冊與發現
  • 路由選擇
  • 服務調用
  • 負載均衡
  • 熔斷機制
  • 全局鎖
  • 領導人選舉和集群狀態
  • 分布式消息

2 原生雲應用程序

原生雲是應用程序開發的一種風格,鼓勵在持續交付和價值驅動領域的最佳實踐。
Spring Cloud的很多特性是基於Spring Boot的。更多的是由兩個庫實現:Spring Cloud Context and Spring Cloud Commons。

2.1 Spring Cloud Context: 應用上下文服務

Spring Boot關於使用Spring構建應用有硬性規定:通用的配置文件在固定的位置,通用管理終端,監控任務。建立在這個基礎上,Spring Cloud增加了一些額外的特性。

2.1.1 引導應用程序上下文

Spring Cloud會創建一個“bootstrap”的上下文,這是主應用程序的父上下文。對應的配置文件擁有最高優先級,並且,默認不能被本地配置文件覆蓋。對應的文件名bootstrap.yml或bootstrap.properties。

可通過設置spring.cloud.bootstrap.enabled=false來禁止bootstrap進程。

2.1.2 應用上下文層級結構

當用SpringApplication SpringApplicationBuilder創建應用程序上下文時,bootstrap上下文將作為父上下文被添加進去,子上下文將繼承父上下文的屬性。

子上下文的配置信息可覆蓋父上下文的配置信息。

2.1.3 修改Bootstrap配置文件位置

spring.cloud.bootstrap.name(默認是bootstrap),或者spring.cloud.bootstrap.location(默認是空)

2.1.4 覆蓋遠程配置文件的值

spring.cloud.config.allowOverride=true
spring.cloud.config.overrideNone=true
spring.cloud.config.overrideSystemProperties=false

2.1.5 定制Bootstrap配置

/META-INF/spring.factories的key為org.springframework.cloud.bootstrap.BootstrapConfiguration,定義了Bootstrap啟動的組件。

在主應用程序啟動之前,一開始Bootstrap上下文創建在spring.factories文件中的組件,然后是@Beans類型的bean。

2.1.6 定制Bootstrap屬性來源

關鍵點:spring.factories、PropertySourceLocator

2.1.7 環境改變

應用程序可通過EnvironmentChangedEvent監聽應用程序並做出響應。

2.1.8 Refresh Scope

Spring的bean被@RefreshScope將做特殊處理,可用於刷新bean的配置信息。

注意

  • 需要添加依賴“org.springframework.boot.spring-boot-starter-actuator”
  • 目前我只在@Controller測試成功
  • 需要自己發送POST請求/refresh
  • 修改配置文件即可

2.1.9 加密和解密

Spring Cloud可對配置文件的值進行加密。
如果有"Illegal key size"異常,那么需要安裝JCE。

2.1.10 服務點

除了Spring Boot提供的服務點,Spring Cloud也提供了一些服務點用於管理,注意都是POST請求

  • /env:更新Environment、重新綁定@ConfigurationProperties跟日志級別
  • /refresh重新加載配置文件,刷新標記@RefreshScope的bean
  • /restart重啟應用,默認不可用
  • 生命周期方法:/pause/resume

2.2 Spring Cloud Commons:通用抽象

服務發現、負載均衡、熔斷機制這種模式為Spring Cloud客戶端提供了一個通用的抽象層。

2.2.1 RestTemplate作為負載均衡客戶端

通過@Bean@LoadBalanced指定RestTemplate。注意URI需要使用虛擬域名(如服務名,不能用域名)。

如下:

@Configuration
public class MyConfiguration {

    @LoadBalanced
    @Bean
    RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

public class MyClass {
    @Autowired
    private RestTemplate restTemplate;

    public String doOtherStuff() {
        String results = restTemplate.getForObject("http://stores/stores", String.class);
        return results;
    }
}

2.2.2 多個RestTemplate對象

注意@Primary注解的使用。

@Configuration
public class MyConfiguration {

    @LoadBalanced
    @Bean
    RestTemplate loadBalanced() {
        return new RestTemplate();
    }

    @Primary
    @Bean
    RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

public class MyClass {
    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    @LoadBalanced
    private RestTemplate loadBalanced;

    public String doOtherStuff() {
        return loadBalanced.getForObject("http://stores/stores", String.class);
    }

    public String doStuff() {
        return restTemplate.getForObject("http://example.com", String.class);
    }
}

2.2.3 忽略網絡接口

忽略確定名字的服務發現注冊,支持正則表達式配置。


3 Spring Cloud Config

Spring Cloud Config提供服務端和客戶端在分布式系統中擴展配置。支持不同環境的配置(開發、測試、生產)。使用Git做默認配置后端,可支持配置環境打版本標簽。

3.1 快速開始

可通過IDE運行或maven運行。

默認加載property資源的策略是克隆一個git倉庫(at spring.cloud.config.server.git.uri')。

HTTP服務資源的構成:

/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties

application是SpringApplication的spring.config.name,(一般來說'application'是一個常規的Spring Boot應用),profile是一個active的profile(或者逗號分隔的屬性列表),label是一個可選的git標簽(默認為"master")。

3.1.1 客戶端示例

創建以Spring Boot應用即可,添加依賴“org.springframework.cloud:spring-cloud-starter-config”。

配置application.properties,注意URL為配置服務端的地址

spring.cloud.config.uri: http://myconfigserver.com

3.2 Spring Cloud Config 服務端

針對系統外的配置項(如name-value對或相同功能的YAML內容),該服務器提供了基於資源的HTTP接口。使用@EnableConfigServer注解,該服務器可以很容易的被嵌入到Spring Boot 系統中。使用該注解之后該應用系統就是一個配置服務器。

@SpringBootApplication
@EnableConfigServer
public class ConfigApplicion {
	public static void main(String[] args) throws Exception {
		SpringApplication.run(ConfigApplicion.class, args);
	}
}

3.2.1 資源庫環境

  • {application} 對應客戶端的"spring.application.name"屬性
  • {profile} 對應客戶端的 "spring.profiles.active"屬性(逗號分隔的列表)
  • {label} 對應服務端屬性,這個屬性能標示一組配置文件的版本

如果配置庫是基於文件的,服務器將從application.yml和foo.yml中創建一個Environment對象。高優先級的配置優先轉成Environment對象中的PropertySource

3.2.1.1 Git后端

默認的EnvironmentRepository是用Git后端進行實現的,Git后端對於管理升級和物理環境是很方便的,對審計配置變更也很方便。也可以file:前綴從本地配置庫中讀取數據。

這個配置庫的實現通過映射HTTP資源的{label}參數作為git label(提交id,分支名稱或tag)。如果git分支或tag的名稱包含一個斜杠 ("/"),此時HTTP URL中的label需要使用特殊字符串"(_)"來替代(為了避免與其他URL路徑相互混淆)。如果使用了命令行客戶端如 curl,請謹慎處理URL中的括號(例如:在shell下請使用引號''來轉義它們)。

Git URI占位符
Spring Cloud Config Server支持git庫URL中包含針對{application}和 {profile}的占位符(如果你需要,{label}也可包含占位符, 不過要牢記的是任何情況下label只指git的label)。所以,你可以很容易的支持“一個應用系統一個配置庫”策略或“一個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/* (也就說,無論profile是什么,它只匹配application名稱為“simple”的應用系統)。“local”庫匹配所有application名稱以“local”開頭任何應用系統,不管profiles是什么(來實現覆蓋因沒有配置對profile的匹配規則,“/*”后綴會被自動的增加到任何的匹配表達式中)。

Git搜索路徑中的占位符
spring.cloud.config.server.git.searchPaths

3.2.1.2 版本控制后端文件系統使用

伴隨着版本控制系統作為后端(git、svn),文件都會被check outclone 到本地文件系統中。默認這些文件會被放置到以config-repo-為前綴的系統臨時目錄中。在Linux上,譬如應該是/tmp/config-repo-<randomid>目錄。有些操作系統routinely clean out放到臨時目錄中,這會導致不可預知的問題出現。為了避免這個問題,通過設置spring.cloud.config.server.git.basedirspring.cloud.config.server.svn.basedir參數值為非系統臨時目錄。

3.2.1.3 文件系統后端

使用本地加載配置文件。
需要配置:spring.cloud.config.server.native.searchLocationsspring.profiles.active=native
路徑配置格式:classpath:/, classpath:/config,file:./, file:./config

3.2.1.4 共享配置給所有應用

基於文件的資源庫
在基於文件的資源庫中(i.e. git, svn and native),這樣的文件名application*命名的資源在所有的客戶端都是共享的(如 application.properties, application.yml, application-*.properties,etc.)。

屬性覆蓋
“spring.cloud.config.server.overrides”添加一個Map類型的name-value對來實現覆蓋。
例如

spring:
  cloud:
    config:
      server:
        overrides:
          foo: bar

會使所有的配置客戶端應用程序讀取foo=bar到他們自己配置參數中。

3.2.2 健康指示器

通過這個指示器能夠檢查已經配置的EnvironmentRepository是否正常運行。
通過設置spring.cloud.config.server.health.enabled=false參數來禁用健康指示器。

3.2.3 安全

你可以自由選擇任何你覺得合理的方式來保護你的Config Server(從物理網絡安全到OAuth2 令牌),同時使用Spring Security和Spring Boot 能使你做更多其他有用的事情。

為了使用默認的Spring Boot HTTP Basic 安全,只需要把Spring Security 增加到classpath中(如org.springframework.boot.spring-boot-starter-security)。默認的用戶名是“user”,對應的會生成一個隨機密碼,這種情況在實際使用中並沒有意義,一般建議配置一個密碼(通過 security.user.password屬性進行配置)並對這個密碼進行加密。

3.2.4 加密與解密

如果遠程屬性包含加密內容(以{cipher}開頭),這些值將在通過HTTP傳遞到客戶端之前被解密。

使用略

3.2.5 密鑰管理

配置服務可以使用對稱(共享)密鑰或者非對稱密鑰(RSA密鑰對)。

使用略

3.2.6 創建一個測試密鑰庫

3.2.7 使用多密鑰和循環密鑰

3.2.8 加密屬性服務


3.3 可替換格式服務

配置文件可加后綴".yml"、".yaml"、".properties"


3.4 文本解釋服務

/{name}/{profile}/{label}/{path}


3.5 嵌入配置服務器

一般配置服務運行在單獨的應用里面,只要使用注解@EnableConfigServer即可嵌入到其他應用。


3.6 推送通知和總線

添加依賴spring-cloud-config-monitor,激活Spring Cloud 總線,/monitor端點即可用。

當webhook激活,針對應用程序可能已經變化了的,配置服務端將發送一個RefreshRemoteApplicationEvent


3.7 客戶端配置

3.7.1 配置第一次引導

通過spring.cloud.config.uri屬性配置Config Server地址

3.7.2 發現第一次引導

如果用的是Netflix,則用eureka.client.serviceUrl.defaultZone進行配置。

3.7.3 配置客戶端快速失敗

在一些例子里面,可能希望在沒有連接配置服務端時直接啟動失敗。可通過spring.cloud.config.failFast=true進行配置。

3.7.4 配置客戶端重試

添加依賴spring-retryspring-boot-starter-aop,設置spring.cloud.config.failFast=true。默認的是6次重試,初始補償間隔是1000ms,后續補償為1.1指數乘數,可通過spring.cloud.config.retry.*配置進行修改。

3.7.5 定位遠程配置資源

路徑:/{name}/{profile}/{label}

  • "name" = ${spring.application.name}
  • "profile" = ${spring.profiles.active} (actually Environment.getActiveProfiles())
  • "label" = "master"

label對於回滾到之前的版本很有用。

3.7.6 安全

通過spring.cloud.config.passwordspring.cloud.config.username進行配置。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM