Spring Cloud :Eureka嗡午、Ribbon、Hystrix冀痕、Feign荔睹、Zuul、Config

Eureka(服務(wù)治理言蛇,配置中心):

? ? ? ?Client服務(wù)啟動后向EurekaServer注冊僻他,Eureka Server會將注冊信息向其他Eureka Server進(jìn)行同步,當(dāng)服務(wù)消費(fèi)者要調(diào)用服務(wù)提供者腊尚,則向服務(wù)注冊中心獲取服務(wù)提供者地址吨拗,然后會將服務(wù)提供者地址緩存在本地,下次再調(diào)用時(shí),則直接從本地緩存中取劝篷,完成一次調(diào)用哨鸭。當(dāng)服務(wù)注冊中心Eureka Server檢測到服務(wù)提供者因?yàn)殄礄C(jī)、網(wǎng)絡(luò)原因不可用時(shí)娇妓,則在服務(wù)注冊中心將服務(wù)置為DOWN狀態(tài)像鸡,并把當(dāng)前服務(wù)提供者狀態(tài)向訂閱者發(fā)布,訂閱過的服務(wù)消費(fèi)者更新本地緩存哈恰。服務(wù)提供者在啟動后只估,周期性(默認(rèn)30秒)向Eureka Server發(fā)送心跳,進(jìn)行服務(wù)續(xù)約蕊蝗。Eureka Server在一定的時(shí)間(默認(rèn)90秒)未收到客戶端的心跳仅乓,則認(rèn)為服務(wù)宕機(jī),注銷該實(shí)例蓬戚。服務(wù)間使用標(biāo)準(zhǔn)的REST方式通訊夸楣。

Eureka Server 集群:?Eureka通過互相注冊的方式來實(shí)現(xiàn)高可用的部署,所以我們只需要將Eureke Server配置其他可用的serviceUrl就能實(shí)現(xiàn)高可用部署

CAP:一個(gè)分布式系統(tǒng)不可能同時(shí)滿足C(一致性)子漩、A(可用性)P(分區(qū)容錯(cuò)性)豫喧。

Zookeeper? :保證CP(強(qiáng)一致性Eureka各個(gè)節(jié)點(diǎn)都是平等的,幾個(gè)節(jié)點(diǎn)掛掉不會影響正常節(jié)點(diǎn)的工作幢泼,剩余的節(jié)點(diǎn)依然可以提供注冊和查詢服務(wù)紧显。而Eureka的客戶端在向某個(gè)Eureka注冊或時(shí)如果發(fā)現(xiàn)連接失敗,則會自動切換至其它節(jié)點(diǎn)缕棵,只要有一臺Eureka還在孵班,就能保證注冊服務(wù)可用(保證可用性),只不過查到的信息可能不是最新的(不保證強(qiáng)一致性)招驴。除此之外篙程,Eureka還有一種自我保護(hù)機(jī)制,如果在15分鐘內(nèi)超過85%的節(jié)點(diǎn)都沒有正常的心跳别厘,那么Eureka就認(rèn)為客戶端與注冊中心出現(xiàn)了網(wǎng)絡(luò)故障虱饿,此時(shí)會出現(xiàn)以下幾種情況:?1. Eureka不再從注冊列表中移除因?yàn)殚L時(shí)間沒收到心跳而應(yīng)該過期的服務(wù)?2. Eureka仍然能夠接受新服務(wù)的注冊和查詢請求,但是不會被同步到其它節(jié)點(diǎn)上(即保證當(dāng)前節(jié)點(diǎn)依然可用)?3. 當(dāng)網(wǎng)絡(luò)穩(wěn)定時(shí)触趴,當(dāng)前實(shí)例新的注冊信息會被同步到其它節(jié)點(diǎn)中)氮发。在leader出現(xiàn)宕機(jī)時(shí)zk無法對外提供訪問。

Eureka:保證 AP(最終一致性)冗懦。Eureka各個(gè)節(jié)點(diǎn)都是平等的爽冕,幾個(gè)節(jié)點(diǎn)掛掉不會影響正常節(jié)點(diǎn)的工作,剩余的節(jié)點(diǎn)依然可以提供注冊和查詢服務(wù)披蕉。而Eureka的客戶端在向某個(gè)Eureka注冊或查詢時(shí)如果發(fā)現(xiàn)連接失敗扇售,則會自動切換至其它節(jié)點(diǎn)前塔,只要有一臺Eureka還在,就能保證注冊服務(wù)可用(保證可用性)承冰,只不過查到的信息可能不是最新的(不保證強(qiáng)一致性)华弓。除此之外,Eureka還有一種自我保護(hù)機(jī)制困乒,如果在15分鐘內(nèi)超過85%的節(jié)點(diǎn)都沒有正常的心跳寂屏,那么Eureka就認(rèn)為客戶端與注冊中心出現(xiàn)了網(wǎng)絡(luò)故障,此時(shí)會出現(xiàn)以下幾種情況:

?????1. Eureka不再從注冊列表中移除因?yàn)殚L時(shí)間沒收到心跳而應(yīng)該過期的服務(wù)

?????2. Eureka仍然能夠接受新服務(wù)的注冊和查詢請求娜搂,但是不會被同步到其它節(jié)點(diǎn)上(即保證當(dāng)前節(jié)點(diǎn)依然可用)?

? ? ?3. 當(dāng)網(wǎng)絡(luò)穩(wěn)定時(shí)迁霎,當(dāng)前實(shí)例新的注冊信息會被同步到其它節(jié)點(diǎn)中


Ribbon(實(shí)現(xiàn)客戶端負(fù)載均衡):

? ? ? ?Ribbon實(shí)現(xiàn)的關(guān)鍵點(diǎn)是為ribbon定制的RestTemplate,ribbon利用了RestTemplate的攔截器機(jī)制百宇,在攔截器中實(shí)現(xiàn)ribbon的負(fù)載均衡考廉。負(fù)載均衡的基本實(shí)現(xiàn)就是利用applicationName從服務(wù)注冊中心獲取可用的服務(wù)地址列表,然后通過一定算法負(fù)載携御,決定使用哪一個(gè)服務(wù)地址來進(jìn)行http調(diào)用昌粤。在Ribbon實(shí)現(xiàn)中,定義了一個(gè)LoadBalancerInterceptor啄刹,ribbon就是通過這個(gè)攔截器進(jìn)行攔截請求涮坐,然后實(shí)現(xiàn)負(fù)載均衡調(diào)用。

Ribbon 負(fù)載均衡類型:

? ? ?RandomRule:該策略實(shí)現(xiàn)了從服務(wù)實(shí)例清單中隨機(jī)選擇一個(gè)服務(wù)實(shí)例的功能

? ??RoundRobinRule :該策略實(shí)現(xiàn)了按照線性輪詢的方式的方式一次選擇每個(gè)服務(wù)實(shí)例的功能誓军。與RandomRule非常類似袱讹。增加了一個(gè)count計(jì)數(shù)變量,該變量會在每次循環(huán)之后累加昵时,如果一直選擇不到server超過10次捷雕,那么就會結(jié)束嘗試,并打印一個(gè)警告信息壹甥。

? ? ? RetryRule :該策略實(shí)現(xiàn)了一個(gè)具備重試機(jī)制的實(shí)例選擇功能救巷。默認(rèn)使用了RoudRobinRule實(shí)例。

? ? ??WeightedResponseTimeRule :該策略是對RoundRobinRule的擴(kuò)展盹廷,增加了根據(jù)實(shí)例等運(yùn)行情況來計(jì)算權(quán)重征绸,并根據(jù)權(quán)重來挑選實(shí)例久橙,以達(dá)到更優(yōu)的分配效果俄占,它的實(shí)現(xiàn)主要有三個(gè)核心內(nèi)容:定時(shí)任務(wù)、權(quán)重計(jì)算淆衷、 實(shí)例選擇 缸榄。

? ? ??ClientConfigEnabledRoundRobinRule :實(shí)現(xiàn)功能與?RoundRobinRule相同 。



Hystrix(熔斷器祝拯,防止服務(wù)雪崩 ):

服務(wù)隔離

????????在微服務(wù)架構(gòu)中,我們實(shí)現(xiàn)的一個(gè)業(yè)務(wù)邏輯通常會依賴多個(gè)服務(wù)Hystrix甚带。例如:A服務(wù)依賴B她肯、C服務(wù),A服務(wù)在調(diào)用B/C時(shí)會共享線程池鹰贵。如果在調(diào)用B服務(wù)無響應(yīng)時(shí)晴氨,所有應(yīng)用都處于等待狀態(tài);此時(shí)服務(wù)開始雪崩碉输。通過將每個(gè)依賴服務(wù)分配獨(dú)立的線程池進(jìn)行資源隔離, 從而避免服務(wù)雪崩籽前。服務(wù)隔離會將A服務(wù)線程數(shù)量分配給各個(gè)依賴服務(wù):例如:B40線程,C60線程敷钾。

熔斷器模式

? ??????服務(wù)的健康狀況 = 請求失敗數(shù) / 請求總數(shù)

????????熔斷器開關(guān)由關(guān)閉到打開的狀態(tài)轉(zhuǎn)換是通過當(dāng)前服務(wù)健康狀況和設(shè)定閾值比較決定的枝哄。

? ??????當(dāng)熔斷器開關(guān)關(guān)閉時(shí), 請求被允許通過熔斷器.,如果當(dāng)前健康狀況高于設(shè)定閾值, 開關(guān)繼續(xù)保持關(guān)閉. 如果當(dāng)前健康狀況低于設(shè)定閾值, 開關(guān)則切換為打開狀態(tài)阻荒。

? ??????當(dāng)熔斷器開關(guān)打開時(shí), 請求被禁止通過挠锥。當(dāng)熔斷器開關(guān)處于打開狀態(tài), 經(jīng)過一段時(shí)間后, 熔斷器會自動進(jìn)入半開狀態(tài), 這時(shí)熔斷器只允許一個(gè)請求通過. 當(dāng)該請求調(diào)用 成功時(shí), 熔斷器恢復(fù)到關(guān)閉狀態(tài).。若該請求失敗, 熔斷器繼續(xù)保持打開狀態(tài), 接下來的請求被禁止通過。 熔斷器的開關(guān)能保證服務(wù)調(diào)用者在調(diào)用異常服務(wù)時(shí), 快速返回結(jié)果, 避免大量的同步等待. 并且熔斷器能在一段時(shí)間后繼續(xù)偵測請求執(zhí)行結(jié)果, 提供恢復(fù)服務(wù)調(diào)用的可能。

命令模式

????????Hystrix使用命令模式(繼承HystrixCommand類或者是HystrixObservableCommand類)來包裹具體的服務(wù)調(diào)用邏輯(run方法), 并在命令模式中添加了服務(wù)調(diào)用失敗后的降級邏輯(getFallback).同時(shí)我們在Command的構(gòu)造方法中可以定義當(dāng)前服務(wù)線程池和熔斷器的相關(guān)參數(shù) 蒸甜。(也可以使用注解:@HystrixCommand)



Feign(方便各個(gè)服務(wù)之間調(diào)用厅篓。也可以實(shí)現(xiàn)服務(wù)降級):

主程序入口添加了@EnableFeignClients注解開啟對FeignClient掃描加載處理。根據(jù)Feign Client的開發(fā)規(guī)范涮俄,定義接口并加@FeignClientd注解。當(dāng)程序啟動時(shí),回進(jìn)行包掃描球昨,掃描所有@FeignClients的注解的類,并且講這些信息注入Spring IOC容器中眨攘,當(dāng)定義的的Feign接口中的方法唄調(diào)用時(shí)主慰,通過JDK的代理方式,來生成具體的RequestTemplate.當(dāng)生成代理時(shí)鲫售,F(xiàn)eign會為每個(gè)接口方法創(chuàng)建一個(gè)RequestTemplate共螺。

當(dāng)生成代理時(shí),F(xiàn)eign會為每個(gè)接口方法創(chuàng)建一個(gè)RequestTemplate對象情竹,改對象封裝可HTTP請求需要的全部信息藐不,如請求參數(shù)名,請求方法等信息都是在這個(gè)過程中確定的秦效。

然后RequestTemplate生成Request,然后把Request交給Client去處理雏蛮,這里指的時(shí)Client可以時(shí)JDK原生的URLConnection,Apache的HttpClient,也可以時(shí)OKhttp,最后Client被封裝到LoadBalanceClient類阱州,這個(gè)類結(jié)合Ribbon負(fù)載均衡發(fā)器服務(wù)之間的調(diào)用挑秉。


Zuul(服務(wù)網(wǎng)關(guān)):

服務(wù)網(wǎng)關(guān),自身包含Ribbon苔货、Hystrix模塊:?

?1.作為系統(tǒng)入口犀概,屏蔽系統(tǒng)內(nèi)部各個(gè)微服務(wù)細(xì)節(jié)立哑。? ??

2.可以與服務(wù)治理框架結(jié)合,實(shí)現(xiàn)自動化的服務(wù)實(shí)力維護(hù)集負(fù)載均衡的路由轉(zhuǎn)發(fā)姻灶。? ??

3.可以實(shí)現(xiàn)接口權(quán)限校驗(yàn)與微服務(wù)的業(yè)務(wù)邏輯解耦铛绰。? ? ??

?4.通過服務(wù)網(wǎng)關(guān)中的過濾器,在各生命周期中去校驗(yàn)請求的內(nèi)容产喉,將原本在對外服務(wù)層做的校驗(yàn)前移至耻,保證微服務(wù)的無狀態(tài)性,同時(shí)降低了微服務(wù)的測試難度镊叁,讓服務(wù)本身更關(guān)注業(yè)務(wù)邏輯尘颓。??

多實(shí)例配置:? ??

????xxxxxx.ribbon.listOfServers:配置多個(gè)實(shí)例。?

路徑匹配

????/晦譬?匹配一個(gè)字符

????/*匹配多個(gè)字符

? ???/**匹配任意字符目錄

? ??zuul.ignored-patterns 配置希望zuul忽略的url?

核心過濾器

? ??????pre過濾器 :主要是在請求路由之前調(diào)用疤苹,很多驗(yàn)證可以在這里做?

? ??????route過濾器:在路由請求時(shí)候被調(diào)用,主要用來轉(zhuǎn)發(fā)請求

? ? ? ? ?post過濾器:?主要用來處理響應(yīng)請求

? ??????? error過濾器:當(dāng)錯(cuò)誤發(fā)生時(shí)敛腌,會經(jīng)由這個(gè)類型的過濾器處理? ??

zuul與Spring Cloud Config 整合
? ???須由zuul實(shí)例化? zuulproperties 且添加@RefreshScope?


Spring Cloud Config:

占位符匹配git倉庫

????默認(rèn)倉庫:

? ? ? ? ? ? ? ? spring.cloud.config.server.git.uri=http://git.com/app/config-repo

????????占位符一(匹配路徑:http://localhost:7000/dev/*):? ? ? ? ? ? ? ??

? ??????????????spring.cloud.config.server.git.repos.dev.pattern=dev/*? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?????????????????spring.cloud.config.server.git.repos.dev.uri=file://home/git/config-repo? ? ? ? ??

????????占位符二(匹配路徑:http://localhost:70000/prod/pp* 和 http://localhost:70000/online/oo*):? ? ? ? ? ? ? ??

? ??????????????? spring.cloud.config.server.git.repos.prod.pattern=prod/pp*,online/oo*? ??????????????? ??????????????????spring.cloud.config.server.git.repos.dev.uri=http://git.com/app/config-repo? ??

? ? 加密解密

? ??????{cipher} 可以是倉庫文件中密碼自動加密

? ??????encrypt.key=xxxx 指定加密的鹽

? ??????curl http://localhost:7000/encrypt -d xxx 加密

? ??????curl http://localhost:7000/decrypt -d ******** 解密

????Client 端:

? ??????須指定:label (git分支)卧土、profile(哪個(gè)環(huán)境的配置文件)、 server端url

????失敗快速響應(yīng):? ?

? ???????spring.cloud.config.failFast=true? ?在項(xiàng)目啟動時(shí)先連接config server?

? ??失敗重試:? ? ? ? ??

? ??????使用spring-retry 和spring-boot-starter-aop? jar不需要其他配置像樊,默認(rèn)失敗重試6次? ??

? ??????spring.cloud.config.retry.multiplier:初始重試間隔時(shí)間(默認(rèn)1000毫秒)? ?

? ???????spring.cloud.config.retry.initial-interval:下一次間隔乘數(shù)? ? (默認(rèn)1.1 本次1000毫秒? ? 下次間隔1100毫秒)? ? ? ??

? ??????? spring.cloud.config.retry.-attempts:最大重試次數(shù)(默認(rèn)6次)

? ? 動態(tài)刷新配置:? ? 在client端引入actuator? 通過/refresh 端點(diǎn)刷新配置 或者使用git hook

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末尤莺,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子生棍,更是在濱河造成了極大的恐慌颤霎,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,919評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涂滴,死亡現(xiàn)場離奇詭異友酱,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)柔纵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評論 3 392
  • 文/潘曉璐 我一進(jìn)店門缔杉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人搁料,你說我怎么就攤上這事或详。” “怎么了郭计?”我有些...
    開封第一講書人閱讀 163,316評論 0 353
  • 文/不壞的土叔 我叫張陵霸琴,是天一觀的道長。 經(jīng)常有香客問我拣宏,道長沈贝,這世上最難降的妖魔是什么杠人? 我笑而不...
    開封第一講書人閱讀 58,294評論 1 292
  • 正文 為了忘掉前任勋乾,我火速辦了婚禮宋下,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘辑莫。我一直安慰自己学歧,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評論 6 390
  • 文/花漫 我一把揭開白布各吨。 她就那樣靜靜地躺著枝笨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪揭蜒。 梳的紋絲不亂的頭發(fā)上横浑,一...
    開封第一講書人閱讀 51,245評論 1 299
  • 那天,我揣著相機(jī)與錄音屉更,去河邊找鬼徙融。 笑死,一個(gè)胖子當(dāng)著我的面吹牛瑰谜,可吹牛的內(nèi)容都是我干的欺冀。 我是一名探鬼主播,決...
    沈念sama閱讀 40,120評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼萨脑,長吁一口氣:“原來是場噩夢啊……” “哼隐轩!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起渤早,我...
    開封第一講書人閱讀 38,964評論 0 275
  • 序言:老撾萬榮一對情侶失蹤职车,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后鹊杖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體提鸟,經(jīng)...
    沈念sama閱讀 45,376評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評論 2 333
  • 正文 我和宋清朗相戀三年仅淑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了称勋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,764評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡涯竟,死狀恐怖赡鲜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情庐船,我是刑警寧澤银酬,帶...
    沈念sama閱讀 35,460評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站筐钟,受9級特大地震影響揩瞪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜篓冲,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評論 3 327
  • 文/蒙蒙 一李破、第九天 我趴在偏房一處隱蔽的房頂上張望宠哄。 院中可真熱鬧,春花似錦嗤攻、人聲如沸毛嫉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽承粤。三九已至,卻和暖如春闯团,著一層夾襖步出監(jiān)牢的瞬間辛臊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評論 1 269
  • 我被黑心中介騙來泰國打工房交, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留浪讳,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,819評論 2 370
  • 正文 我出身青樓涌萤,卻偏偏與公主長得像淹遵,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子负溪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評論 2 354

推薦閱讀更多精彩內(nèi)容