1. 程式人生 > >Spring Cloud 學習筆記——入門、特徵、配置

Spring Cloud 學習筆記——入門、特徵、配置

[TOC]

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 應用上下文層級結構

當用SpringApplicationSpringApplicationBuilder建立應用程式上下文時,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

注意

  • 需要新增依賴“org.springframework.boot.spring-boot-starter-actuator”
  • 需要自己傳送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 {
    publicstaticvoidmain(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進行配置。

相關推薦

Spring Cloud 學習筆記——入門特徵配置

[TOC] 0 放在前面 0.1 參考文件 0.2 maven配置 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter

spring cloud學習筆記3(同步呼叫非同步呼叫響應式呼叫)

1.同步呼叫  同步呼叫,在學習筆記2就是同步呼叫 2.非同步呼叫 修改service package com.study.cloud.consumer.services; import com.netflix.hystrix.contrib.javanica.annot

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

目錄 0 放在前面 0.1 參考文件 http://cloud.spring.io/spring-cloud-static/Brixton.SR7/ https://springcloud.cc/ http://projects.spring.io/spring-cloud/ 0.2 maven配置 &

Spring Cloud學習筆記 【篇一:分布式配置中心 Spring Colud Config】

16px gin war imp web項目 tps conf name request 一、簡介 Spring Cloud Config提供了在分布式系統的外部配置的客戶端支持。通過配置服務(Config Server)來為所有的環境和應用提供外部配置的集中管理。這些概念

Spring Cloud學習筆記-003

開發 spring pre 學習筆記 bubuko lse 參數 穩定 觸發 Spring Cloud學習筆記-003 服務提供者:向註冊中心註冊服務 1. 新建maven工程,骨架選擇quickstart,工程名稱:demo-member 2. 加入相關依賴

Spring Cloud學習筆記-004

服務 微服務架構 裏的 url 文件 啟動 spa 實現 ron 高可用註冊中心   在微服務架構這樣的分布式環境中,需要充分考慮發生故障的情況,所以在生產環境中必須對各個組件進行高可用部署,對於微服務如此,對於服務註冊中心也一樣。如果一直使用單節點的服務註冊中心

Spring Cloud學習筆記-007

通過 cati tar source 復雜 members quest 項目 ati 聲明式服務調用:Spring Cloud Feign   Feign基於Netflix Feign實現,整合了Spring Cloud Ribbon和Spring Cloud H

Spring Cloud學習筆記-011

設備 配置文件 enable 環境 共享 app 啟用 .config localhost 分布式配置中心:安全保護   由於配置中心存儲的內容比較敏感,做一定的安全處理是必需的。為配置中心實現安全保護的方式有很多,比如物理網絡限制、OAuth2授權等。由於微服務

Spring Cloud學習筆記-012

目錄 註冊中心 image yml 接口 面向 基礎 collect 16px 分布式服務跟蹤:Spring Cloud Sleuth   隨著業務的發展,系統規模也會變得越來越大,各微服務間的調用關系也變得越來越錯綜復雜。通常一個由客戶端發起的請求在後端系統中會

Spring Cloud學習筆記之Eureka Server註冊中心

Eureka Server提供服務註冊服務,各個節點啟動後,會在Eureka Server中進行註冊,這樣EurekaServer中的服務登錄檔中將會儲存所有可用服務節點的資訊,服務節點的資訊可以在介面中直觀的看到。我們簡單實現一下Eureka Server。 1.新建一個Maven專案

Spring Cloud學習筆記之Eureka框架的原理

Eureka 服務發現與註冊:我們在呼叫微服務的時候,如果我們的微服務部署了多份,我們應該如何去呼叫?這裡就涉及到了服務發現與註冊。服務發現就是程式如何通過一個標誌來獲取服務列表,並且這個服務列表是能夠隨著服務的狀態而動態變更的。 Spring Cloud提供了多種註冊中心的支援:如Eur

Spring Cloud學習筆記之微服務實現(一)(Spring Boot+IDEA)

我們先使用Spring Boot實現一個微服務,業務非常簡單: 1.商品微服務,通過商品id查詢商品的微服務 2.訂單微服務,通過訂單id查詢訂單資料,同時需要呼叫商品微服務查詢出訂單詳情資料對應的商品資料。 說明: 1.對於商品微服務而言,商品微服務是服務的提供者,訂單微服務是服務的消費

Spring Cloud學習筆記之微服務實現(二)(Spring Boot+Spring Cloud+IDEA)

在【Spring Cloud學習筆記之微服務實現(一)】中,我們實現了微服務,但是在實際的專案中,我們需要實現動態訪問微服務,在此之前,已經介紹了Spring Cloud和Eureka,並且實現了eureka註冊中心。現在我們實現一下動態呼叫。 注:註冊中心的服務在此期間保持啟動狀態。

Spring Cloud學習筆記25——自動擴充套件

垂直擴充套件 水平擴充套件 自我註冊和自我發現 服務登錄檔 客戶端 微服務例項 按需擴充套件 自動擴充套件的意義 好處: 提高了高可用性和容錯能力 增加了可伸縮性 具有最佳使用率,並節約成本

Spring Cloud學習筆記24——天氣預報系統微服務實現熔斷機制

建立專案 以之前的msa-weather-report-eureka-feign-gateway為藍本,建立msa-weather-report-eureka-feign-gateway-hystrix專案 修改build.gradle配置,新增Hystrix依賴: //依賴關係

Spring Cloud學習筆記19——如何整合 Zuul

Zuul的功能 整合Zuul 開發環境 JDK8+ Gradle4+ Redis 3.2.100 Spring Boot 2.0.0.M3 Spring Cloud Starter Netflix Eureka Client Finchley

Spring Cloud學習筆記18——API 閘道器

API 閘道器是一套主要用於統一API入口的應用元件,可以管理所有的API,形成一個API的入口 API閘道器的意義 集合多個API 統一API入口 API閘道器所帶來的好處 避免將內部資訊洩露給外部 為微服務新增額外的安全層 支

Spring Cloud學習筆記17——天氣預報系統微服務使用 Feign

回顧遺留的三個TODO 資料採集微服務在天氣資料同步任務中,依賴於城市資料API微服務 天氣預報微服務查詢天氣資訊,依賴於天氣資料API微服務 天氣預報微服務提供的城市列表,依賴於城市資料API微服務 天氣預報系統微服務使用Feign msa-we

Spring Cloud學習筆記16——微服務的消費

微服務的消費模式 基於http的客戶端經常被用作微服務的消費者,因為http本身是平臺無關的、語言無關的,所以基於http的客戶端往往會被廣大的社群支援 服務直連模式 特點: 簡潔明瞭,只要傳入一個URL,就能直接連過去,獲取到資源 平臺語言無關性,非常直白,不

spring cloud學習筆記(3)-- ribbon和feign

1.ribbon客戶端負載均衡介紹及基本使用 負載均衡想必都是比較清除的,在伺服器端的負載均衡主要是通過Nginx實現: 那麼客戶端的負載均衡呢 Ribbon是一個實現了客戶端負載均衡的元件,Netflix開源的,其主要功能是提供客戶端側負載均衡 Ribbon客戶