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 應用上下文層級結構
當用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 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 學習筆記(一)——入門、特徵、配置
目錄 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
1、spring-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