目錄
1.1 微服務(wù)的功能主要體現(xiàn)在以下兒個方面睬辐。
三塑崖、服務(wù)注冊和發(fā)現(xiàn)Ereka
(3) Fetch Registries一一獲取服務(wù)注冊列表信息
6.6 Hystrix Dashboard 是監(jiān)控Hystrix 的熔斷器狀態(tài)
8.1 分布式配置中心Spring Cloud Config
口Config Server 從遠程Git 倉庫讀取配置文件掘鄙。
口Config Server 從遠程Git 倉庫讀取配置文件饿这。
一、SpringCloud微服務(wù)技術(shù)簡介
Spring Cloud 作為Java 語言的微服務(wù)框架唆姐,它依賴于Spring Boot,有快速開發(fā)廓八、持續(xù)交付和
容易部署等特點奉芦。Spring Cloud 的組件非常多,涉及微服務(wù)的方方面面剧蹂,井在開源社區(qū)Spring 和
Netflix 声功、Pivotal 兩大公司的推動下越來越完善。
1.1 微服務(wù)的功能主要體現(xiàn)在以下兒個方面宠叼。
口服務(wù)的注冊和發(fā)現(xiàn)先巴。
口服務(wù)的負載均衡。
口服務(wù)的容錯冒冬。
口服務(wù)網(wǎng)關(guān)伸蚯。
口服務(wù)配置的統(tǒng)一管理。
口鏈路追蹤简烤。
口實時日志剂邮。
1.2 微服務(wù)具有以下的特點。
口按照業(yè)務(wù)來劃分服務(wù)横侦,單個服務(wù)代碼量小挥萌,業(yè)務(wù)單一绰姻,易于維護。
口每個微服務(wù)都有自己獨立的基礎(chǔ)組件引瀑,例如數(shù)據(jù)庫狂芋、緩存等,且運行在獨立的進程中憨栽。
口微服務(wù)之間的通信是通過HTTP 協(xié)議或者消息組件帜矾,且具有容錯能力。
口微服務(wù)有一套服務(wù)治理的解決方案徒像,服務(wù)之間不相合黍特,可以隨時加入和剔除服務(wù)。
口單個微服務(wù)能夠集群化部署锯蛀,并且有負載均衡的能力灭衷。
口整個微服務(wù)系統(tǒng)應(yīng)該有一個完整的安全機制,包括用戶驗證旁涤、權(quán)限驗證翔曲、資源保護等。
口整個微服務(wù)系統(tǒng)有鏈路追蹤的能力劈愚。
口有一套完整的實時日志系統(tǒng)瞳遍。
?
二、開發(fā)框架SpringBoot
?
三菌羽、服務(wù)注冊和發(fā)現(xiàn)Ereka
3.1 什么是Eureka
和Consul 掠械、Zookeeper 類似, Eureka 是一個用于服務(wù)注冊和發(fā)現(xiàn)的組件注祖,最開始主要應(yīng)用
于亞馬遜公司旗下的云計算服務(wù)平臺AWS o Eureka 分為Eureka Server 和Eureka Client, Eureka
Server 為Eureka 服務(wù)注冊中心猾蒂, Eureka Client 為Eureka 客戶端。
3.2 Ereka優(yōu)勢
Eureka 和其他組件是晨,比如負載均衡組件Ribbon 肚菠、熔斷器組件Hys往以、熔斷器監(jiān)控組
件Hystrix Dashboard 組件罩缴、熔斷器聚合監(jiān)控Turbine 組件蚊逢,以及網(wǎng)關(guān)Zuul 組件相互配合, 能夠
很容易實現(xiàn)服務(wù)注冊箫章、負載均衡烙荷、熔斷和智能路由等功能。這些組件都是由Netflix 公司開源的檬寂,
一起被稱為Netflix OSS 組件奢讨。Netflix OSS 組件由Spring Cloud 整合為Spring Cloud Netflix 組件,
?
Eureka 的基本架構(gòu)如|到2-1 所示,其中主要包括以下3 種角色拿诸。
口Register Service :服務(wù)注冊中心扒袖,它是一個Eureka Server ,提供服務(wù)注冊和發(fā)現(xiàn)的功能亩码。
口Provider Service :服務(wù)提供者季率,它是一個Eureka Client ,提供服務(wù)描沟。
口Consumer Service :服務(wù)消費者飒泻,它是一個Eureka Cient ,消費服務(wù)吏廉。
服務(wù)消費的基本過程如下:首先前要一個服務(wù)注冊中心Eureka Server 泞遗,服務(wù)提供者Eureka
Client 向服務(wù)注冊中心Eureka Server 注冊,將自己的信息(比如服務(wù)名和服務(wù)的IP 地址等)
通過阻ST A 凹的形式提交給服務(wù)注冊中心Eureka Server 席覆。同樣史辙,服務(wù)消費者Eureka Client 也
向服務(wù)注冊1j1,L,, Eureka Server 注冊,同時服務(wù)消費者獲取一份服務(wù)注冊列表的信息佩伤, 該列表
包含了所有向脫務(wù)注冊中心Eureka Server 注冊的服務(wù)信息聊倔。獲取服務(wù)注冊列表信息之后,服
務(wù)消費者就知道服務(wù)提供者的IP 地址生巡,可以通過Htφ 遠程調(diào)度來消費服務(wù)提供者的服務(wù)耙蔑。
( l ) Registe 「一一服務(wù)注冊
當E ureka Client 向Eureka Server 注冊時, Eureka Client 提供自身的元數(shù)據(jù)孤荣,比如IP 地址甸陌、
端口、運行狀況H1 標的Uri 盐股、主頁地址等信息钱豁。
(2) Renew一一服務(wù)續(xù)約
Eureka C li ent 在默認的情況下會每隔30 秒發(fā)送一次心跳來進行服務(wù)續(xù)約。通過服務(wù)續(xù)約
來告知E ureka Server 該Eureka Client 仍然可用遂庄,沒有出現(xiàn)故障。正常情況下劲赠,如果E ureka Server
在90 秒內(nèi)沒有收到Eureka Client 的心跳涛目, Eureka Server 會將Eureka Client 實例從注冊列表中
刪除。注意:’盯網(wǎng)建議不要更t& 服務(wù)續(xù)約的間隔時間凛澎。
(3) Fetch Registries一一獲取服務(wù)注冊列表信息
Eureka Client 從Eureka Server 獲取服務(wù)注冊表信息霹肝,井將其緩存在本地。Eureka Client 會
使用服務(wù)注冊列表信息查找其他服務(wù)的信息塑煎,從而進行遠程調(diào)用沫换。該注冊列表信息定時(每
30 秒) 更新一次,每次返回注冊列表信息可能與Eureka Client 的緩存信息不同最铁, Eureka Client
會自己處理這些信息讯赏。如呆由于某種原因?qū)е伦粤斜硇畔⒉荒芗皶r匹配垮兑, Eureka Client 會重
新獲取整個注冊表信息。Eureka Server 緩存了所有的服務(wù)注冊列表信息漱挎,并將整個注冊列表以
及每個應(yīng)用程序的信息進行了壓縮系枪,壓縮內(nèi)容和沒有壓縮的內(nèi)容完全相同。Eureka Client 和
Eureka Server 可以使用JSON 和XML 數(shù)據(jù)格式進行通信磕谅。在默認的情況下私爷, Eureka Client 使
用JSON 格式的方式來獲取服務(wù)注冊列表的信息。
( 4) Cancel -一服務(wù)下線
Eureka Client 在程序關(guān)閉時可以向Eureka Server 發(fā)送下線請求膊夹。發(fā)送請求后衬浑,該客戶端的
實例信息將從E ureka Server 的服務(wù)注冊列表中刪除。該下線請求不會自動完成放刨,需要在程序
關(guān)閉時調(diào)用以下代碼:
DiscoveryManager . getinstance() .shutdownComponent();
( 5 ) Eviction一一服務(wù)剔除
在默認情況下工秩,當Eureka Client 連續(xù)90 秒沒有向Eureka Server 發(fā)送服務(wù)續(xù)約(即心跳〉
時, Eureka Server 會將該服務(wù)實例從服務(wù)注冊列表刪除宏榕,即服務(wù)剔除拓诸。
四、負載均衡
?
五麻昼、申明式調(diào)用
5.1 申明式Feign的簡介
@Feign Client 注解用于創(chuàng)建聲明式API 接口奠支,該接口是阻STful 風格的。Feign 被設(shè)計成
插拔式的抚芦,可以注入其他組件和Feign 一起使用倍谜。最典型的是如果Ribbon 可用, Feign 會和
Ribbon 相結(jié)合進行負載均衡叉抡。
在代碼中尔崔, value()和name()一樣,是被調(diào)用的服務(wù)的Serviceld 褥民。url ()直接填寫硬編碼的
Uri 地址季春。decode404()即404 是被解碼,還是拋異常消返。configuration ()指明FeignClient 的配置類载弄,
默認的配置類為FeignClientsConfiguration 類, 在缺省的情況下撵颊, 這個類注入了默認的Decoder 宇攻、
Encoder 和Contract 等配置的Bean 。fallback()為配置熔斷器的處理類倡勇。
配置如下:
spring :
application :
name : eureka-feign-client
server:
port : 8765
eureka :
client :
serv 工ceUrl :
defaultZone: http://localhost:8761/eureka/
在程序的啟動類EurekaFeignClientApplication 加上注解@E nableEurekaCJ ient 開啟Eureka
Client 的功能逞刷,通過注解@EnableFeignClients 開啟Feign Client 的功能。代碼如下:
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class EurekaFeignClientApplication {
public static void main (String [] args) {
SpririgApplication . run(EurekaFeignClientApplication.class , args) ;
5.2?Feign簡單構(gòu)建
通過以上3 個步驟,該程序就具備了Feign 的功能夸浅,現(xiàn)在來實現(xiàn)一個簡單的Feign Client o
新建一個EurekaClientFeign 的接口仑最,在接口上加@FeignClient 注解來聲明一個Fe ign Client,
其中value 為遠程調(diào)用其他服務(wù)的服務(wù)名, FeignConfig.class 為Feign Client 的配置類题篷。在
EurekaClientFeign 接口內(nèi)部有一個sayHiFromClientEureka()方法词身,該方法通過Feign 來調(diào)用
eureka-client 服務(wù)的“ 曠的API 接口
?
六、熔斷器
6.1? 什么是Hystrix
在分布式系統(tǒng)中番枚,服務(wù)與服務(wù)之間的依賴錯綜復(fù)雜法严, 一種不可避免的情況就是某些服務(wù)會
出現(xiàn)故障,導(dǎo)致依賴于它們的其他服務(wù)出現(xiàn)遠程調(diào)度的線程阻塞葫笼。Hystrix 是Netflix 公司開
源的一個項目深啤,它提供了熔斷器功能,能夠阻止分布式系統(tǒng)中出現(xiàn)聯(lián)動故障路星。Hystrix 是通過
隔離服務(wù)的訪問點阻止聯(lián)動故障的溯街,并提供了故障的解決方案,從而提高了整個分布式系統(tǒng)
的彈性洋丐。
6.2 Hystrix的作用
在復(fù)雜的分布式系統(tǒng)中呈昔,可能有幾十個服務(wù)相互依賴,這些服務(wù)由于某些原因友绝,例如機房
的不可靠性堤尾、網(wǎng)絡(luò)服務(wù)商的不可靠性等,導(dǎo)致某個服務(wù)不可用迁客。如果系統(tǒng)不隔離該不可用的服務(wù)郭宝,可能會導(dǎo)致整個系統(tǒng)不可用。
例如掷漱,對于依賴30 個服務(wù)的應(yīng)用程序粘室,每個服務(wù)的正常運行時間為99.99% ,對于單個服務(wù)來說卜范, 99.99% 的可用是非常完美的衔统。有99.9930 = 99.7% 的可正常運行時間和0.3% 的不可用時間,那么10 億次請求中有3000000次失敗海雪,實際的情況可能比這更糟糕锦爵。如果不設(shè)計整個系統(tǒng)的韌性,即使所有依賴關(guān)系表現(xiàn)良好喳魏,單個服務(wù)只有0.01% 的不可用棉浸,由于整個系統(tǒng)的服務(wù)相互依賴怀薛,最終對整個系統(tǒng)的影響是非常大的刺彩。在微服務(wù)系統(tǒng)中, 一個用戶請求可能需要調(diào)用幾個服務(wù)才能完成。如圖8-1 所示创倔,在所有的服務(wù)都處于可用狀態(tài)時嗡害, 一個用戶請求需要調(diào)用A 、H 畦攘、I 和P 服務(wù)霸妹。
6.3 Hystrix的場景
當某一個服務(wù),例如服務(wù)I知押,出現(xiàn)網(wǎng)絡(luò)延遲或者故障時叹螟,即使服務(wù)A 、H 和P 可用台盯,由于
服務(wù)I 的不可用罢绽,整個用戶請求會處于阻塞狀態(tài),并等待服務(wù)I 的響應(yīng)静盅,如圖8-2 所示良价。
在高并發(fā)的情況下,單個服務(wù)的延遲會導(dǎo)致整個請求都處于延遲狀態(tài)蒿叠,可能在幾秒鐘就使
整個服務(wù)處于線程負載飽和的狀態(tài)明垢。
某個服務(wù)的單個點的請求故障會導(dǎo)致用戶的請求處于阻塞狀態(tài),最終的結(jié)果就是整個服務(wù)
的線程資源消耗殆盡市咽。由于服務(wù)的依賴性痊银,會導(dǎo)致依賴于該故障服務(wù)的其他服務(wù)也處于線程阻
塞狀態(tài),最終導(dǎo)致這些服務(wù)的線程資源消耗殆盡魂务, 直到不可用曼验,從而導(dǎo)致整個問服務(wù)系統(tǒng)都不
可用,即雪崩效應(yīng)粘姜。
為了防止雪崩效應(yīng)鬓照,因而產(chǎn)生了熔斷器模型。Hystrix 是在業(yè)界表現(xiàn)非常好的一個熔斷器
模型實現(xiàn)的開源組件孤紧,它是Spring Cloud 組件不可缺少的一部分豺裆。
6.4 Hystrix設(shè)計原則
Hystrix 的設(shè)計原則如下。
口防止單個服務(wù)的故障耗盡整個服務(wù)的Servlet 容器(例如Tomcat )的線程資源号显。
口快速失敗機制臭猜,如果某個服務(wù)出現(xiàn)了故障,則調(diào)用該服務(wù)的請求快速失敗押蚤,而不是線
程等待蔑歌。
口提供回退( fallback )方案,在請求發(fā)生故障時揽碘,提供設(shè)定好的回退方案次屠。
口使用熔斷機制园匹,防止故障擴散到其他服務(wù)钉鸯。
口提供熔斷器的監(jiān)控組件Hystrix Dashboard澄步,可以實時監(jiān)控熔斷器的狀態(tài)。
6.5 Hystrix 的工作機制
當服務(wù)的某個API 接口的失敗次數(shù)
在一定時間內(nèi)小于設(shè)定的閥值時限府,熔斷器處于關(guān)閉狀態(tài)本昏,該API 接口正常提供服務(wù)供汛。當該
API 接口處理請求的失敗次數(shù)大于設(shè)定的閥值時, Hystrix 判定該API 接口出現(xiàn)了故障涌穆,打開
熔斷器怔昨,這時請求該API 接口會執(zhí)行快速失敗的邏輯(即fallback 回退的邏輯),不執(zhí)行業(yè)
務(wù)邏輯宿稀,請求的線程不會處于阻塞狀態(tài)朱监。處于打開狀態(tài)的熔斷器, 一段時間后會處于半打開
狀態(tài)原叮,并將一定數(shù)量的請求執(zhí)行正常邏輯赫编。剩余的請求會執(zhí)行快速失敗,若執(zhí)行正常邏輯的
請求失敗了奋隶,則熔斷器繼續(xù)打開: 若成功了擂送,則將熔斷器關(guān)閉。這樣熔斷器就具有了自我修
復(fù)的能力唯欣。
6.6 Hystrix Dashboard 是監(jiān)控Hystrix 的熔斷器狀態(tài)
在微服務(wù)架構(gòu)中嘹吨,為了保證服務(wù)實例的可用性,防止服務(wù)實例出現(xiàn)故障導(dǎo)致線程阻塞境氢,而
出現(xiàn)了熔斷器模型蟀拷。烙斷器的狀況反映了一個程序的可用性和健壯性,它是一個重要指標萍聊。
Hystrix Dashboard 是監(jiān)控Hystrix 的熔斷器狀況的一個組件问芬,提供了數(shù)據(jù)監(jiān)控和l 友好的圖形化
展示界面。本節(jié)在上一節(jié)的基礎(chǔ)上寿桨,以案例的形式講述如何使用Hystrix Dashboard 監(jiān)控熔斷
器的狀態(tài)此衅。
?
?
七、路由網(wǎng)關(guān)
智能路由網(wǎng)關(guān)組件Zuul:Zuul 作為微服務(wù)系統(tǒng)的網(wǎng)關(guān)組件亭螟,用于構(gòu)建邊界服務(wù)( Edge
Service )挡鞍,致力于動態(tài)路由、過濾预烙、監(jiān)控墨微、彈性伸縮和安全。
7.1 Zuul的作用
Zuul 作為路由網(wǎng)關(guān)組件扁掸,在微服務(wù)架構(gòu)中有著非常重要的作用翘县,主要體現(xiàn)在以下6 個方面衰琐。
D Zuul 、Ribbon 以及Eureka 相結(jié)合炼蹦,可以實現(xiàn)智能路由和負載均衡的功能, Zuul 能夠
將請求流量按某種策略分發(fā)到集群狀態(tài)的多個服務(wù)實例狸剃。
口網(wǎng)關(guān)將所有服務(wù)的API 接口統(tǒng)一聚合掐隐,并統(tǒng)一對外暴露。外界系統(tǒng)調(diào)用API 接口時钞馁,
都是由網(wǎng)關(guān)對外暴露的API 接口虑省,外界系統(tǒng)不需要知道微服務(wù)系統(tǒng)中各服務(wù)相互調(diào)
用的復(fù)雜性。微服務(wù)系統(tǒng)也保護了其內(nèi)部微服務(wù)單元的API 接口僧凰, 防止其被外界直
接調(diào)用探颈,導(dǎo)致服務(wù)的敏感信息對外暴露。
口網(wǎng)關(guān)服務(wù)可以做用戶身份認證和權(quán)限認證训措,防止非法請求操作API 接口伪节,對服務(wù)器
起到保護作用。
口網(wǎng)關(guān)可以實現(xiàn)監(jiān)控功能绩鸣,實時日志輸出怀大,對請求進行記錄。
口網(wǎng)關(guān)可以用來實現(xiàn)流量監(jiān)控呀闻, 在高流量的情況下化借,對服務(wù)進行降級。
口API 接口從內(nèi)部服務(wù)分離出來捡多, 方便做測試蓖康。
?
7.2 Zuul的工作原理
Zuul 是通過Servlet 來實現(xiàn)的, Zuul 通過自定義的Zuu!Servlet (類似于Spring MVC 的
DispatcServlet〕來對請求進行控制垒手。Zuul 的核心是一系列過濾器蒜焊,可以在Http 請求的發(fā)起和
響應(yīng)返回期間執(zhí)行一系列的過濾器。Zuul 包括以下4 種過濾器科贬。
口PRE 過濾器: 它是在請求路由到具體的服務(wù)之前執(zhí)行的山涡,這種類型的過濾器可以做
安全驗證,例如身份驗證唆迁、參數(shù)驗證等鸭丛。
口ROUTING 過濾器: 它用于將請求路由到具體的微服務(wù)實例。在默認情況下唐责,它使用
Http Client 進行網(wǎng)絡(luò)請求鳞溉。
口POST 過濾器:它是在請求己被路由到微服務(wù)后執(zhí)行的。一般情況下鼠哥,用作收集統(tǒng)計
信息熟菲、指標看政,以及將響應(yīng)傳輸?shù)娇蛻舳恕?/p>
口ERROR 過濾器:它是在其他過濾器發(fā)生錯誤時執(zhí)行的。
Zuul 采取了動態(tài)讀取抄罕、編譯和運行這些過濾器允蚣。過濾器之間不能直接相互通信,而是通
過RequestContext 對象來共享數(shù)據(jù)呆贿, 每個請求都會創(chuàng)建一個RequestContext 對象嚷兔。Zuul 過濾器
具有以下關(guān)鍵特性。
口Type (類型) : Zuul 過濾器的類型做入,這個類型決定了過濾器在請求的哪個階段起作用冒晰,
例如Pre 、Post 階段等竟块。
口Execution Order (執(zhí)行順序) :規(guī)定了過濾器的執(zhí)行順序壶运, Order 的值越小,越先執(zhí)行浪秘。
口Criteria (標準) : Filter 執(zhí)行所需的條件蒋情。
口Action (行動〉: 如果符合執(zhí)行條件,則執(zhí)行Action (即邏輯代碼)耸携。
Zuul 請求的生命周期如圖9-1 所示恕出,該圖來自Zuul 的官方文檔。
當一個客戶端Request 請求進入Zuul 網(wǎng)關(guān)服務(wù)時违帆,網(wǎng)關(guān)先進入“pre filter飛進行一系列
的驗證浙巫、操作或者判斷。然后交給“routing filter ”進行路由轉(zhuǎn)發(fā)刷后,轉(zhuǎn)發(fā)到具體的服務(wù)實例進
行邏輯處理的畴、返回數(shù)據(jù)。當具體的服務(wù)處理完后尝胆,最后由“post filter 丧裁,,進行處理含衔, 該類型的處
理器處理完之后煎娇,將Response 信息返回給客戶端。
?
7.3 在Zuul 上配置熔斷器
Zuul 作為Netflix 組件贪染,可以與Ribbon 缓呛、Eureka 和Hystrix 等組件相結(jié)合,實現(xiàn)負載均衡杭隙、
熔斷器的功能哟绊。在默認情況下, Zuul 和Ribbon 相結(jié)合痰憎, 實現(xiàn)了負載均衡的功能票髓。下面來講解
如何在Zuul 上實現(xiàn)熔斷功能攀涵。
在Zuul 中實現(xiàn)熔斷功能需要實現(xiàn)ZuulFallbackProvider 的接口。實現(xiàn)該接口有兩個方法洽沟, 一個
是getRouteO方法以故,用于指定熔斷功能應(yīng)用于哪些路由的服務(wù); 另一個方法fallbackResponseO為進
入熔斷功能時執(zhí)行的邏輯
7.4 在Zuul 中使用過濾器
在前面的章節(jié)講述了過濾器的作用和種類裆操,下面來講解如何實現(xiàn)一個自定義的過濾器怒详。
實現(xiàn)過濾器很簡單, 只需要繼承ZuulFilter 跷车,井實現(xiàn)Zuu!Filter 中的抽象方法,包括filterType()
和filterOrder()橱野,以及IZuulFilter 的shouldFilter()和0均ect run()的兩個方法朽缴。其中, filterType()
即過濾器的類型水援,在前文已經(jīng)講解過了密强,它有4 種類型,分別是“ pre '’“ post ”“ routing ”和
“ error ” 蜗元。白lterOrder()是過濾順序或渤,它為一個Int 類型的值,值越小奕扣,越早執(zhí)行該過濾器薪鹦。
shouldFilter()表示該過濾器是否過濾邏輯,如果為true 惯豆,則執(zhí)行run()方法:如果為false 池磁,則
不執(zhí)行run ()方法。run ()方法寫具體的過濾的邏輯楷兽。
5.Zuul 的常見使用方式
Zuul 是采用了類似于Spring MVC 的DispatchServlet 來實現(xiàn)的地熄,采用的是異步阻塞模型,
所以性能比Ngnix 差芯杀。由于Zuul 和其他Netflix 組件可以相互配合端考、無縫集成, Zuul 很容易
就能實現(xiàn)負載均衡揭厚、智能路由和熔斷器等功能却特。在大多數(shù)情況下, Zuul 都是以集群的形式存
在的筛圆。由于Z u川的橫向擴展能力非常好核偿,所以當負載過高時,可以通過添加實例來解決性
能瓶頸顽染。
一種常見的使用方式是對不同的渠道使用不同的Zuul 來進行路由漾岳,例如移動端共用一個
Zuul 網(wǎng)關(guān)實例轰绵, Web 端用另一個Zuul 網(wǎng)關(guān)實例,其他的客戶端用另外一個Zuul 實例進行路由尼荆。
這種不同的渠邊用不同Zuul 實例的架構(gòu)如圖9-3 所示左腔。
?
另外一種常見的集群是通過Ngnix 和Zuul 相互結(jié)合來做負載均衡。暴露在最外面的是
Ngnix 主從雙熱備進行Keepalive, Ngnix 經(jīng)過某種路由策略捅儒,將請求路由轉(zhuǎn)發(fā)到Zuul 集群上液样,
Zuul 最終將請求分發(fā)到具體的服務(wù)上,架構(gòu)圖如圖9-4 所示巧还。
?
八鞭莽、配置中心
8.1 分布式配置中心Spring Cloud Config
口Config Server 從本地讀取配置文件。
Config Server 可以從本地倉庫讀取配置文件麸祷,也可以從遠處Git 倉庫讀取澎怒。本地倉庫是指
將所有的配置文件統(tǒng)一寫在Config Server 工程目錄下。Config Sever 暴露HttpAPI 接口阶牍, Config
Client 通過調(diào)用Config Sever 的H即API 接口來讀取配置文件喷面。
spring:
cloud :
config :
server :
native :
search-locations: classpath : /shared
profiles :
active : native
application :
name : config- server
server :
port : 8769
在工程的Resources 目錄下建一個shared 文件夾,用于存放本地配置文件走孽。在shared 目錄
下惧辈,新建一個config-client-dev. ym l 文件,用作eureka-client 工程的dev (開發(fā)環(huán)境〉的配置文
件磕瓷。在config-client-dev.yml 配置文件中盒齿,指定程序的端口號為8762 , 并定義一個變fil foo 困食, 該
變量的值為foo version l县昂。
口Config Server 從遠程Git 倉庫讀取配置文件。
Spring Cloud Config 支持從遠程Git 倉庫讀取配置文件陷舅,即Config Server 可以不從本地的
倉庫讀取倒彰,而是從遠程Git 倉庫讀取。這樣做的好處就是將配置統(tǒng)一管理莱睁,并且可以通過Spring
Cloud Bus 在不人工啟動程序的情況下對Config Client 的配置進行刷新待讳。
server:
port :8769
spring :
cloud :
config :
server:
git:
uri: https://github.com/forezp/SpringcloudConfig
searchPaths: respo
username: miles02 @163.com
password :
label : master
application:
name : config-server
其中, uri 為遠程Git 倉庫的地址仰剿, serachPaths 為搜索遠程倉庫的文件夾地址创淡, usemame和passwor d 為Git 倉庫的登錄名和密碼。如果是私人Git 倉庫南吮,登錄名和密碼是必須的琳彩;如果是公開的Git 倉庫,可以不需要。label 為git 倉庫的分支名露乏。
口搭建高可用Co nfig Server 集群碧浊。
當服務(wù)實例很多時,所有的服務(wù)實例需要同時從配置中心
Config Server 讀取配置文件瘟仿,這時可以考慮將配置中心Config Server 做成一個微服務(wù)箱锐,并且將
其集群化,從而達到高可用劳较。
?
口使用Spring Cloud Bus 刷新配置驹止。
Spring Cloud Bus 是用輕量的消息代理將分布式的節(jié)點連接起來,可以用于廣播配置文件
的更改或者服務(wù)的監(jiān)控管理观蜗。)個關(guān)鍵的思想就是臊恋,消息總線可以為微服務(wù)做監(jiān)控,也可以實
現(xiàn)應(yīng)用程序之間相I T-L 通信墓捻。S pring Cloud Bus 可選的消息代理組建包括RabbitMQ 抖仅、AMQP 和
Kafka 等。本節(jié)講述的是用RabbitMQ 作為Spring Cloud 的消息組件去刷新更改微服務(wù)的配置
文件毙替。
?
?
九岸售、服務(wù)鏈路追蹤
分布式配置中心S pring Cloud Config
口Config Server 從本地讀取配置文件践樱。
spring:
cloud :
config :
server :
native :
search-locations: classpath : /shared
profiles :
active : native
application :
name : config- server
server :
port : 8769
Config Server 可以從本地倉庫讀取配置文件厂画,也可以從遠處Git 倉庫讀取。本地倉庫是指
將所有的配置文件統(tǒng)一寫在Config Server 工程目錄下拷邢。Config Sever 暴露HttpAPI 接口袱院, Config
Client 通過調(diào)用Config Sever 的H即API 接口來讀取配置文件。
為了講解得更清楚瞭稼,本章將不在之前章節(jié)的工程的基礎(chǔ)上改造忽洛,而是重新建工程。和之前的工程一樣环肘,采用多Mo dule 形式欲虚。
口Config Server 從遠程Git 倉庫讀取配置文件。
spring :
application :
name : config-client
cloud :
config :
uri: http : //localhost : 8769
fail-fast : true
profi les :
active : dev
Spring Cloud Config 支持從遠程Git 倉庫讀取配置文件悔雹,即Config Server 可以不從本地的
倉庫讀取复哆,而是從遠程Git 倉庫讀取。這樣做的好處就是將配置統(tǒng)一管理腌零,并且可以通過Spring
Cloud Bus 在不人工啟動程序的情況下對Config Client 的配置進行刷新梯找。本例采用GitHub 作為
遠程Git 倉庫。
口搭建高可用Config Server 集群益涧。
當服務(wù)實例很多時锈锤,所有的服務(wù)實例需要同時從配置中心
Config Server 讀取配置文件,這時可以考慮將配置中心Config Server 做成一個微服務(wù),并且將
其集群化久免,從而達到高可用浅辙。配置中心C onfig Server 高可用的架構(gòu)圖如圖10-1 所示。C onfig
Server 和Config Client 向Eureka Server 注冊妄壶,且將Config Server 多實例集群部署摔握。
?
口使用Spring Cloud Bus 刷新配置。
Spring Cloud Bus 是用輕量的消息代理將分布式的節(jié)點連接起來丁寄,可以用于廣播配置文件
的更改或者服務(wù)的監(jiān)控管理氨淌。)個關(guān)鍵的思想就是,消息總線可以為微服務(wù)做監(jiān)控伊磺,也可以實現(xiàn)應(yīng)用程序之間相I T-L 通信盛正。S pring Cloud Bus 可選的消息代理組建包括RabbitMQ 、AMQP 和
Kafka 等屑埋。本節(jié)講述的是用RabbitMQ 作為Spring Cloud 的消息組件去刷新更改微服務(wù)的配置
文件豪筝。
如果有幾十個微服務(wù),而每一個服務(wù)又是多實例摘能,當更改配置時续崖,需要重新啟動多個微服
務(wù)實例,會非常麻煩团搞。Spring Cloud Bus 的一個功能就是讓這個過程變得簡單严望,當遠程Git 倉
庫的配置更改后,只需要向某一個微服務(wù)實例發(fā)送一個Post 請求逻恐,通過消息組件通知其他微
服務(wù)實例重新拉取配置文件像吻。如圖10-3 所示,當遠程Git 倉庫的配置更改后复隆,通過發(fā)送
“ /bus/refresh ” Post 請求給某一個微服務(wù)實例拨匆,通過消息組件,通知其他微服務(wù)實例挽拂,更新配
置文件惭每。
?
十、微服務(wù)監(jiān)控
十一亏栈、SpringSecurity
------------------------------------------------------------------------------------------------------------------------------
本文來自 旭日Follow_24 的CSDN 博客 台腥,全文地址請點擊:https://mp.csdn.net/postedit/81742534