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 應用上下文層級結構
當用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
注意
- 需要新增依賴“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
out
或clone
到本地檔案系統中。預設這些檔案會被放置到以config-repo-為字首的系統臨時目錄中。在Linux上,譬如應該是/tmp/config-repo-<randomid>
目錄。有些作業系統routinely
clean out放到臨時目錄中,這會導致不可預知的問題出現。為了避免這個問題,通過設定spring.cloud.config.server.git.basedir
或spring.cloud.config.server.svn.basedir
引數值為非系統臨時目錄。
3.2.1.3 檔案系統後端
使用本地載入配置檔案。
需要配置:spring.cloud.config.server.native.searchLocations
跟spring.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-retry
、spring-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.password
、spring.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客戶