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

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配置

<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

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進行配置。

相關推薦

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 Boot 學習筆記入門

Spring boot 簡介 1、Spring boot是Spring家族中的一個全新的框架,它用來簡化Spring應用程式的建立和開發過程,也可以說Spring boot能簡化我們之前採用Spring mvc + Spring + MyBatis 框架進行開發的過程; 2、在以往我們採用 Spring

1spring-boot學習筆記簡單入門

ava project nal run plugin mailto 5.4 安全 class a 一、新建普通Maven工程 pom.xml <parent> <groupId>org.springframework.boot</gr

Spring Boot 學習筆記—— 快速搭建Spring Boot專案

一、前言 Spring Boot是Spring系列框架的整合,使用“習慣優於配置”的理念快速搭建專案,在專案打包時還能根據需求打包為jar(內建servlet容器)或war檔案,相對以前的Spring、Spring MVC來說Spring Boot並沒有技術上的升級,而是為我們做好了大部

Spring AOP學習筆記:基礎概念

AOP產生背景 AOP(Aspect Oriented Programming),即面向切面程式設計,可以說是OOP(Object Oriented Programming,面向物件程式設計)的補充和完善。OOP引入封裝、繼承、多型等概念來建立一種物件層次結構,用於模擬公共行為的一個集合。不

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

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

spring cloud學習筆記2-- Eureka

傳統單體架構介紹及優缺點 一個專案包(war包,歸檔包)包含了應用的所有功能, 在沒有出現微服務概念之前,基本上都是這種架構形式存在, 我們一般把程式打包成一個檔案後,扔到tomcat或者jetty, jboss等應用伺服器中即可 特點: 部署很簡單,符合我們的思維;專案

Spring原始碼學習筆記 bean是怎麼生成的

bean 實在 bean 重新整理過程中產生的,首先我們看下 bean 的重新整理方法。下面是 AbstractApplicationContext 的 refresh 方法。 @Override public void refresh() throws

spring cloud學習筆記6--spring cloud config

config配置中心介紹 為什麼需要配置中心? 1、集中管理配置 2、不同環境不同配置 3、執行期間動態調整配置 4、自動重新整理 Spring Cloud Config為分散式系統外部化配置提供了伺服器端和客戶端的支援,它包括Config Server和Confi

spring cloud學習筆記5--統一閘道器zuul

微服務閘道器背景及簡介 不同的微服務一般有不同的網路地址,而外部的客戶端可能需要呼叫多個服務的接口才能完 成一個業務需求。比如一個電影購票的收集APP,可能回撥用電影分類微服務,使用者微服 務,支付微服務等。如果客戶端直接和微服務進行通訊,會存在一下問題: 客戶端會多次請求不同微服務,

深度學習筆記——TensorFlow學習筆記入門

之前使用的深度學習框架一直是Keras,Keras的高階封裝特性讓人們十分容易理解並上手。不過有些時候,由於keras過於封裝,反而使得有些時候不能靈活運用。這時候更底層一些的TensorFlow就體現出優勢來了。另外,大家知道,keras的底層後端有Theano和Tens

SLAM學習筆記入門

 SLAM (simultaneous localization and mapping),也稱為CML (Concurrent Mapping and Localization), 即時定位與地圖構建,或併發建圖與定位。 SLAM最早由Smith、Self

Spring Boot學習筆記——專案構建-使用-部署

Spring Boot簡介很榮幸剛開始學習java框架就接觸到了spring boot,並得到大神的指點,通過查閱資料以及教程學會在實際專案中去使用它,相對於其他框架只有一個字來形容 - “爽”。最近也

java安全框架-Shiro學習筆記-入門小案例

Apache Shiro是一個強大且易用的Java安全框架,執行身份驗證、授權、密碼學和會話管理。 我們先來一個簡單的示例 1、建立maven專案 2、將依賴jar包引入專案中,包括shiro和sl

Spring-Cloud學習筆記RestTemplate和Feign的使用方式以及部分註解的使用

通常,我們在搭建springcloud微服務架構時,會把我們的服務註冊到高可用eureka服務註冊發現中心上面,各個服務之間的通訊就是無可避免的,此時我們就需要用到RestTemplate 或者Feign去進行各個服務之間的通訊呼叫。                    

Python學習筆記:基礎語法變數型別運算子快速入門

Head First Python、Python基礎教程 下劃線的特殊意義 以下劃線開頭的識別符號是有特殊意義的。 以單下劃線開頭(_foo)的代表不能直接訪問的類屬性,需通過類提供的介面進行訪問,不能用”from xxx import *”而匯入

Spring框架學習筆記

     1: spring 層次的分析                 spring貫穿整個層次,管理各個層的bean,並維護bean之間的關係。     2 :spring 的快速入門                  傳統模式需要建立物件(new  Object()),

cs229 斯坦福機器學習筆記-- 入門與LR模型

房價 com 還要 實現 最大 title pid 分布 fcm 版權聲明:本文為博主原創文章,轉載請註明出處。

SpringBoot學習筆記入門

通過 描述 都是 init命令 其他 新版本 進行 adl https 1、重新認識Spring   假如臨危受命需要開發一個簡單的基於Spring的web程序,你該做什麽?可能想到一些基本的需要: 項目結構,其中可選擇使用Maven或Gradle構建。其中包含例如

Nginx 學習筆記個人網站的Https配置

ast 請求重定向 nginx nta pda opera 配置虛擬主機 location cat 一、系統環境 1、系統:Ubuntu 16.04.2 LTS 2、WEB服務器:Openresty11.2.5 二、開始配置 1、獲取certbot客戶端 wget htt