SpringCloud

SpringCloud:

SpringCloud是關(guān)注全局的微服務(wù)協(xié)調(diào)整理框架痹屹,他將SpringBoot開發(fā)的一個個單體服務(wù)整合并管理起來,為各個服務(wù)之間提供:配置管理、服務(wù)發(fā)現(xiàn)、斷路器、路由算谈、微代理、事件總線料滥、全局鎖然眼、決策競選、分布式會話等等集成服務(wù)葵腹。SpringCloud離不開SpringBoot高每,屬于依賴關(guān)系,SpringBoot專注于快速践宴,方便開發(fā)單個個體微服務(wù)觉义,SpringCloud關(guān)注全局的服務(wù)治理框架。

傳統(tǒng)的互聯(lián)網(wǎng)架構(gòu):


SpringClould更加完善:

相比較Dubbo而言浴井,SpringCloud拋棄了Dubbo的RPC通信晒骇,采用的是基于HTTP的REST方式。降低了自身的服務(wù)調(diào)用性能洪囤,提高了靈活性和兼容性,完美的融合Spring其他的產(chǎn)品:?


Springboot配置文件類型:

bootstrap.yml:系統(tǒng)級別的配置

application.yml:用戶級別的配置

Eureka配置:

https://www.springcloud.cc/spring-cloud-netflix.html

SpringCloud官方文檔中文版:

https://www.springcloud.cc/spring-cloud-dalston.html

SpringCloud中文版:

https://www.springcloud.cn/

SpringCloud版本選擇(現(xiàn)在的版本已經(jīng)到H):


SpringCloud使用:

創(chuàng)建maven工程,導(dǎo)入附錄依賴牺丙,刪除src作為Springcloud的父級應(yīng)用:然后在父級應(yīng)用上则涯,右鍵創(chuàng)建maven工程:

創(chuàng)建一個數(shù)據(jù)庫,在schemas中選中需要創(chuàng)建的數(shù)據(jù)庫:


?

創(chuàng)建table:


在table中冲簿,配置表的字段和信息:


在idea添加信息到數(shù)據(jù)庫:


創(chuàng)建api微服務(wù)存放Dept實(shí)體類:


創(chuàng)建微服務(wù)提供者8081(寫太多微服務(wù)粟判,命名加上端口號):

application.yml:


Mybatis-config.xml:



DeptMapper.xml:


DeptDao:


DeptServiceImpl:


DeptController:


創(chuàng)建一個消費(fèi)者類(客戶端80):


創(chuàng)建生產(chǎn)RestTemplate的Bean對象


消費(fèi)者類的控制器:


1.導(dǎo)入依賴 ??????????????????????????2.編寫配置文件 ?????

3.開啟這個功能 @EnableXXXX ????????4.配置類

什么是Eureka:

Eureka時候Netflix的一個子模塊,也是核心模塊之一峦剔,是一個基于REST的服務(wù)档礁,用于定位服務(wù),有了服務(wù)發(fā)現(xiàn)與注冊吝沫,只需要使用服務(wù)標(biāo)識符呻澜,就可以訪問到服務(wù),而不需要修改服務(wù)調(diào)用的配置文件了野舶,功能類似于Dubbo的注冊中心,比如Zookeeper宰衙。

使用Eureka的客戶端連接到EurekaServer并維持心跳連接平道。這樣系統(tǒng)的維護(hù)人員就可以通過EurekaServer來監(jiān)控系統(tǒng)中各個微服務(wù)是否正常運(yùn)行,SpringCloud的一些其他模塊(比如Zuul)就可以通過EurekaServer來發(fā)現(xiàn)系統(tǒng)中的其他微服務(wù)供炼,并執(zhí)行相關(guān)的邏輯一屋。


Eureka的兩個組件:?

Eureka Server提供服務(wù)注冊服務(wù),各個節(jié)點(diǎn)啟動后袋哼,會在EurekaServer中進(jìn)行注冊冀墨,這樣Eureka Server中的服務(wù)注冊表中將會村粗所有可用服務(wù)節(jié)點(diǎn)的信息,服務(wù)節(jié)點(diǎn)的信息可以在界面中直觀的看到涛贯。

Eureka Client是一個ava客戶端诽嘉,用于簡化EurekaServer的交互,客戶端同時也具備一個內(nèi)置的,使用輪詢負(fù)載算法的負(fù)載均衡器虫腋。在應(yīng)用啟動后骄酗,將會向EurekaServer發(fā)送心跳(默認(rèn)周期為30秒)。如果Eureka Server在多個心跳周期內(nèi)沒有接收到某個節(jié)點(diǎn)的心跳悦冀,EurekaServer將會從服務(wù)注冊表中把這個服務(wù)節(jié)點(diǎn)移除掉(默認(rèn)周期為90秒)


三大角色:

Eureka Server:提供服務(wù)的注冊于發(fā)現(xiàn)趋翻。Zookeeper

Service Provider:將自身服務(wù)注冊到Eureka中,從而使消費(fèi)方能夠找到盒蟆。

Service Consumer:服務(wù)消費(fèi)方從Eureka中獲取注冊服務(wù)列表踏烙,從而找到消費(fèi)服務(wù)。

?

創(chuàng)建Eureka的服務(wù)端:

<dependencies>?

???<dependency>????

? ??? ??<groupId>org.springframework.cloud</groupId>? ? ?

?<artifactId>spring-cloud-starter-eureka-server</artifactId>? ? ??

?? ???<version>1.4.6.RELEASE</version>? ?

?</dependency></dependencies>-->

Application.yml:

server:?

?port: 7001

#Eureka配置

eureka:??

? ??instance:??

?????????hostname: localhost #Eureka服務(wù)端的實(shí)例名稱?

? ???client:????register-with-eureka: false #表示是否向eureka注冊中心注冊自己??

?? ???????fetch-registry: false #fetch-registry如果為false历等,則表示自己為注冊中心? ??

? ? ? ? ??service-url: #監(jiān)控頁面讨惩,重寫默認(rèn)網(wǎng)址??????

? ? ? ? ? ? ? ? defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

啟動項(xiàng)Eureka服務(wù)端啟動類@EnableEurekaServer:


使用Eureka注冊注解(8001服務(wù)提供者):

<!--Eureka-->

<dependency>???

?????<groupId>org.springframework.cloud</groupId>?

???????<artifactId>spring-cloud-starter-eureka</artifactId>???

?????<version>1.4.6.RELEASE</version>

</dependency>

編寫Eureka配置文件:

#Eureka的配置,服務(wù)注冊到哪里

eureka:??

? ??client:??

??????service-url:???

???????????defaultZone: http://localhost:7001/eureka/

??instance:??

??????instance-id: springcloud-provider-dept8001?#修改Eureka上的默認(rèn)描述信息

開啟添加到Eureka注冊中心這個功能@EnableEurekaClient:

注冊成功圖(Application:就是我們配置的Spring的名字募闲,Status就是instanceid名字):

添加監(jiān)控信息(8001服務(wù)提供者):

<dependency>????

? ??<groupId>org.springframework.boot</groupId>???

? ???<artifactId>spring-boot-starter-actuator</artifactId>

</dependency>-->

編寫監(jiān)控配置文件:

#info配置info:?

?????app.name: dcits-springboot?

?????company.name: blog.chenglin.com

點(diǎn)擊status這個鏈接步脓,可以訪問監(jiān)控信息

Eureka擁有自我保護(hù)機(jī)制:

某時某刻一個微服務(wù)不可以用了,eureka不會立刻清理浩螺,依舊會對該服務(wù)的信息進(jìn)行保存靴患。

·默認(rèn)情況下,如果EurekaServer在一定時間內(nèi)沒有接收到某個微服務(wù)實(shí)例的心跳要出,EurekaServer將會注銷該實(shí)例(默認(rèn)90秒)鸳君。但是當(dāng)網(wǎng)絡(luò)分區(qū)故障發(fā)生時,微服務(wù)與Eureka之間無法正常通行患蹂,以上行為可能變得非常危險了--因?yàn)槲⒎?wù)本身其實(shí)是健康的或颊,此時本不應(yīng)該注銷這個服務(wù)。Eureka通過自我保護(hù)機(jī)制來解決這個問題--當(dāng)EurekaServer節(jié)點(diǎn)在短時間內(nèi)丟失過多客戶端時(可能發(fā)生了網(wǎng)絡(luò)分區(qū)故障)传于,那么這個節(jié)點(diǎn)就會進(jìn)入自我保護(hù)模式囱挑。一旦進(jìn)入該模式,EurekaServer就會保護(hù)服務(wù)注冊表中的信息沼溜,不再刪除服務(wù)注冊表中的數(shù)據(jù)(也就是不會注銷任何微服務(wù))平挑。當(dāng)網(wǎng)絡(luò)故障恢復(fù)后,該EurekaServer節(jié)點(diǎn)會自動退出自我保護(hù)模式系草。

·在自我保護(hù)模式中通熄,EurekaServer會保護(hù)服務(wù)注冊表中的信息,不再注銷任何服務(wù)實(shí)例找都。當(dāng)它收到的心跳數(shù)重新恢復(fù)到閾值以上時唇辨,該EurekaServer節(jié)點(diǎn)就會自動退出自我保護(hù)模式。它的設(shè)計哲學(xué)就是寧可保留錯誤的服務(wù)注冊信息能耻,也不盲目注銷任何可能健康的服務(wù)實(shí)例赏枚。一句話:好死不如賴活著

·綜上亡驰,自我保護(hù)模式是一種應(yīng)對網(wǎng)絡(luò)異常的安全保護(hù)措施。它的架構(gòu)哲學(xué)是寧可同時保留所有微服務(wù)(健康的微服務(wù)和不健康的微服務(wù)都會保留)嗡贺,也不盲目注銷任何健康的微服務(wù)隐解。使用自我保護(hù)模式占锯,可以讓Eureka集群更加的健壯和穩(wěn)定

在SpringCloud中檬洞,可以使用eureka.server.enable-se1f-preservation = false 禁用自我保護(hù)模式

?

擴(kuò)展想要了解一個服務(wù)信息是干嘛的(在啟動類中添加@EnableDiscoveryClient):

然后在配置文件中注冊DiscoveryClient:并且獲取微服務(wù)信息:

可以得到輸出:

Eureka的集群:

在原先eureka7001的基礎(chǔ)上,創(chuàng)建7002和7003配置不變只改端口號:

集群的作用噩茄,就是讓三個注冊中心摄凡,互相相連续徽,一個中心崩了,另外兩個會支持注冊中心不崩潰亲澡。

配置關(guān)聯(lián)的域名映射( C:\Windows\System32\drivers\etc\hosts ):

集群關(guān)聯(lián)钦扭,在7001中關(guān)聯(lián)7002和7003,同理7002和7003相互關(guān)聯(lián)另外兩個:

server:??port: 7001

#Eureka配置

eureka:?

?????instance:??

??????????hostname: eureka7001.com #Eureka服務(wù)端的實(shí)例名稱??

? ??client:????

? ??????register-with-eureka: false #表示是否向eureka注冊中心注冊自己????

? ??????fetch-registry: false #fetch-registry如果為false床绪,則表示自己為注冊中心??

?? ???????service-url:? ??? ? ??

? ???????????????defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/

在8001中編寫配置文件:

#Eureka的配置客情,服務(wù)注冊到哪里

eureka:?

?????client:????

? ??????service-url:??????

? ??????????defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/??

? ??instance:??

??????????instance-id: springcloud-provider-dept8001

訪問其中一個盤配置中心可以看到集群關(guān)聯(lián)的:

在任何一個集群關(guān)聯(lián)的Eureka中都可以掛載注冊(關(guān)閉其中一個服務(wù)不影響集群組):

CAP原則:

C:強(qiáng)一致性

A:可用性

P分區(qū)容錯性

CAP的三進(jìn)二:CA癞己、AP膀斋、CP

對比ACID:

A:原子性

C:一致性

I:隔離性

D:持久性

CAP理論核心:

·一個分布式系統(tǒng)不可能同時很好的滿足一致性,可用性和分區(qū)容錯性這三個需求痹雅,

·根據(jù)CAP原理仰担,將NoSQL分成了滿足CA原則,滿足CP原則和滿足AP原則三大類:

·CA:單點(diǎn)集群绩社,滿足一致性摔蓝,可用性的系統(tǒng),通秤浒遥可擴(kuò)展性較差

·CP:滿足一致性贮尉,分區(qū)容錯性的系統(tǒng),通常性能不是特別高

·AP:滿足可用性朴沿,分區(qū)容錯性的系統(tǒng)猜谚,通常可能對一致性要求低一些

作為服務(wù)注冊中心悯仙,Eureka比zookeeper好在哪里?

著名的CAP理論指出龄毡,一個分布式系統(tǒng)不可能同時滿足C(一致性)吠卷、A (可用性)锡垄、Р(容錯性)。由于分區(qū)容錯性P在分布式系統(tǒng)中是必須要保證的祭隔,因此我們只能在A和C之間進(jìn)行權(quán)衡货岭。

Zookeeper保證的是CP:

可以容忍注冊中心返回的是幾分鐘以前的注冊信息路操。但是不能接受服務(wù)器down掉,沒有服務(wù)的保護(hù)機(jī)制千贯,一旦down掉服務(wù)注冊中心就不可用屯仗。擁有自己的master節(jié)點(diǎn),當(dāng)master節(jié)點(diǎn)因?yàn)榫W(wǎng)絡(luò)故障等失去聯(lián)系搔谴,剩余的節(jié)點(diǎn)會重新進(jìn)行選舉魁袜,但是選舉的時間太長。雖然能夠恢復(fù)敦第,但是漫長的選舉時間用戶體驗(yàn)不好峰弹。

Eureka保證的是AP:

Eureka的誕生尼補(bǔ)了Zookeeper的弊端,在設(shè)計時就優(yōu)先保證可用性芜果。Eureka各個節(jié)點(diǎn)都是平等的鞠呈,幾個節(jié)點(diǎn)掛掉不會影響正常節(jié)點(diǎn)的工作,剩余的節(jié)點(diǎn)依然可以提供注冊和查詢服務(wù)右钾。而Eureka的客戶端在向某個Eureka注冊時蚁吝,如果發(fā)現(xiàn)連接失敗,則會自動切換至其他節(jié)點(diǎn)舀射,只要有一臺Eureka還在窘茁,就能保住注冊服務(wù)的可用性,只不過查到的信息可能不是最新的后控,除此之外庙曙,Eureka還有一種自我保護(hù)機(jī)制,如果在15分鐘內(nèi)超過85%的節(jié)點(diǎn)都沒有正常的工作浩淘,那么Eureka就認(rèn)為客戶端與注冊中心出現(xiàn)了網(wǎng)絡(luò)故障捌朴,此時會出現(xiàn)以下幾種情況:

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

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

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

因此砂蔽,Eureka可以很好的應(yīng)對因網(wǎng)絡(luò)故障導(dǎo)致部分節(jié)點(diǎn)失去聯(lián)系的情況,而不會像zookeeper那樣使整個注冊服務(wù)癱瘓


Ribbon:

什么是Ribbon:

·Spring Cloud Ribbon是基于Netflix Ribbon實(shí)現(xiàn)的一套客戶端負(fù)載均衡的工具

·簡單的說署惯,Ribbon是Netflix發(fā)布的開源項(xiàng)目左驾,主要功能是提供客戶端的軟件負(fù)載均衡算法,將NetFlix的中間層服務(wù)連接在一起极谊。Ribbon的客戶端組件提供一系列完整的配置項(xiàng)如:連接超時诡右、重試等等。簡單的說轻猖,就是在配置文件中列出LoadBalancer(簡稱LB:負(fù)載均衡)后面所有的機(jī)器帆吻,Ribbon會自動的幫助你基于某種規(guī)則(如簡單輪詢,隨機(jī)連接等等)去連接這些機(jī)器咙边。我們也很容易使用Ribbon實(shí)現(xiàn)自定義的負(fù)載均衡算法!

Ribbon能干什么猜煮?:

·LB次员,即負(fù)載均衡(Load Balance),在微服務(wù)或分布式集群中經(jīng)常用的一種應(yīng)用王带。

·負(fù)載均衡簡單的說就是將用戶的請求平攤的分配到多個服務(wù)上淑蔚,從而達(dá)到系統(tǒng)的HA(高可用)。

·常見的負(fù)載均衡軟件有Nginx愕撰,Lvs等等

·SpringCloud中均給我們提供了負(fù)載均衡刹衫,負(fù)載均衡算法可以自定義。

負(fù)載均衡簡單分類:

·集中式LB:

·即在服務(wù)的消費(fèi)方和提供方之間使用獨(dú)立的LB設(shè)施搞挣,如Nginx:反向代理服務(wù)器!由該設(shè)施負(fù)責(zé)把訪問請求通過某種策略轉(zhuǎn)發(fā)至服務(wù)的提供方!

·進(jìn)程式LB

·將LB邏輯集成到消費(fèi)方绪妹,消蕢方從服務(wù)注冊中心獲知有哪些地址可用,然后自己再從這些地址中選出一個合適的服務(wù)器柿究。

·Ribbon就屬于進(jìn)程內(nèi)LB邮旷,它只是一個類庫,集成于消費(fèi)方進(jìn)程蝇摸,消費(fèi)方通過它來獲取到服務(wù)提供方的地址!

?

Ribbon的使用:

在客戶端導(dǎo)入ribbon依賴:ribbon需要從服務(wù)中心獲取數(shù)據(jù)判斷婶肩,所以需要配置Eureka

<!--Ribbon-->

<dependency>???

?????????<groupId>org.springframework.cloud</groupId>??

??????????<artifactId>spring-cloud-starter-ribbon</artifactId>??

??????????<version>1.4.6.RELEASE</version>

</dependency>

<!--Eureka-->

<dependency>???

?????????<groupId>org.springframework.cloud</groupId>????

????????<artifactId>spring-cloud-starter-eureka</artifactId>??

??<version>1.4.6.RELEASE</version></dependency>

填寫Ribbon配置:

server:?

?????port: 80

#Eureka配置

eureka:??

? ??client:???

?????????register-with-eureka: false ?#不想Eureka中注冊自己?

?? ????????service-url:??#負(fù)債均衡開啟后在下面三個網(wǎng)址中通過服務(wù)類名稱進(jìn)行訪問? ?

???????????????defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,

http://eureka7003.com:7003/eureka/

配置負(fù)債均衡實(shí)現(xiàn)在客戶端config中RestTemplate(注解@LoadBalanced):

在控制器中,使用Ribbon來動態(tài)寫入地址貌夕,寫入的地址是注冊中心中的服務(wù)類名稱:

基于服務(wù)名律歼,訪問成功:

輪詢負(fù)載均衡測試(創(chuàng)建復(fù)制8001創(chuàng)建8002服務(wù)端):

啟動Eureka,啟動8001啡专,啟動8002险毁,在Eureka注冊成功圖:

啟動客戶端80.然后通過客戶端進(jìn)行訪問,Ribbon會根據(jù)自己的算法輪詢判斷:

啟將負(fù)載輪詢们童,改為隨機(jī)畔况,重寫myRule,返回一個RandomRule()方法:

?

Ribbon自定義算法:

在啟動類添加(@RibbonClient(name=”spring的名字”),指定自己創(chuàng)建的組件包):


創(chuàng)建一個組件包慧库,將隨機(jī)的Bean對象移動到這:


進(jìn)入RandomRule()方法跷跪,復(fù)制方法為LinRandomRule修改算法:


Feign負(fù)載均衡:

feign是聲明式的web service客戶端,它讓微服務(wù)之間的調(diào)用變得更簡單了齐板,類似controller調(diào)用service吵瞻。SpringCloud集成了Ribbon和Eureka,可在使用Feign時提供負(fù)載均衡的http客戶端甘磨。

Feign能干什么橡羞?

·Feign在編寫javahttp客戶端變的更加容易

·在Feign的實(shí)現(xiàn)下,我們只需要創(chuàng)建一個接口并使用注解的方式來配置它(類似于以前Dao接口上標(biāo)準(zhǔn)的Mapper注解济舆,現(xiàn)在是一個微服務(wù)接口上面標(biāo)注一個Feign注解即可)

Feign集成了Ribbon

·利用Ribbon維護(hù)了MicroServiceCloud-Dept的服務(wù)列表信息卿泽,并且通過輪詢實(shí)現(xiàn)了客戶端的負(fù)載均衡,而與Ribbon不同的是吗冤,通過Feign只需要定義服務(wù)綁定接口且以聲明式的方法又厉,優(yōu)雅而且簡單的實(shí)現(xiàn)了服務(wù)調(diào)用。

Feign的使用(面向接口編程):

導(dǎo)入依賴:

<dependency>???

? ? ? ? ??<groupId>org.springframework.cloud</groupId>?

??? ???????<artifactId>spring-cloud-starter-feign</artifactId>? ?

?? ? ? ? ?<version>1.4.6.RELEASE</version>

</dependency>-->

創(chuàng)建Feign接口(注解@Component可以將對象注入到Spring當(dāng)中):

使用Feign注解:

Feign啟動項(xiàng):

讀取成功:

Hystrix服務(wù)熔斷:

網(wǎng)站:https://github.com/Netflix/Hystrix/wiki

分布式面臨的問題(服務(wù)雪崩):

復(fù)雜分布式體系結(jié)構(gòu)中的應(yīng)用程序有數(shù)十個依賴關(guān)系椎瘟,每個依賴關(guān)系在某些時候?qū)⒉豢杀苊獾氖?

服務(wù)雪崩:

多個微服務(wù)之間調(diào)用的時候覆致,假設(shè)微服務(wù)A調(diào)用微服務(wù)B和微服務(wù)C,微服務(wù)B和微服務(wù)C又調(diào)用其他的微服務(wù)肺蔚,這就是所謂的“扇出"煌妈、如果扇出的鏈路上某個微服務(wù)的調(diào)用響應(yīng)時間過長或者不可用,對微服務(wù)A的調(diào)用就會占用越來越多的系統(tǒng)資源宣羊,進(jìn)而引起系統(tǒng)崩潰璧诵,所謂的“雪崩效應(yīng)"。

對于高流量的應(yīng)用來說仇冯,單一的后端依賴可能會導(dǎo)致所有服務(wù)器上的所有資源都在幾秒中內(nèi)飽和之宿。比失敗更糟糕的是,這些應(yīng)用程序還可能導(dǎo)致服務(wù)之間的延遲增加苛坚,備份隊列比被,線程和其他系統(tǒng)資源緊張,導(dǎo)致整個系統(tǒng)發(fā)生更多的級聯(lián)故障泼舱,這些都表示需要對故障和延遲進(jìn)行隔離和管理等缀,以便單個依賴關(guān)系的失敗,不能取消整個應(yīng)用程序或系統(tǒng)娇昙。

我們需要·棄車保帥·

什么是Hystrix:

Hystrix是一個用于處理分布式系統(tǒng)的延遲和容錯的開源庫尺迂,在分布式系統(tǒng)里,許多依賴不可避免的會調(diào)用失敗冒掌,比如超時噪裕,異常等,Hystrix能夠保證在一個依賴出問題的情況下股毫,不會導(dǎo)致整體服務(wù)失敗州疾,避免級聯(lián)故障,以提高分布式系統(tǒng)的彈性皇拣。

“斷路器”本身是一種開關(guān)裝置严蓖,當(dāng)某個服務(wù)單元發(fā)生故障之后,通過斷路器的故障監(jiān)控(類似熔斷保險絲)氧急,向調(diào)用方返回一個服務(wù)預(yù)期的颗胡,可處理的備選響應(yīng)(FallBack),而不是長時間的等待或者拋出調(diào)用方法無法處理的異常吩坝,這樣就可以保證了服務(wù)調(diào)用方的線程不會被長時間毒姨,不必要的占用,從而避免了故障在分布式系統(tǒng)中的蔓延钉寝,乃至雪崩

Hystrix作用:

·服務(wù)降級

·服務(wù)熔斷

·服務(wù)限流

·接近實(shí)時的監(jiān)控等

服務(wù)熔斷是什么(避免整個微服務(wù)出現(xiàn)異常導(dǎo)致整個應(yīng)用報錯):

熔斷機(jī)制是對應(yīng)雪崩效應(yīng)的一種微服務(wù)鏈路保護(hù)機(jī)制弧呐。

當(dāng)扇出鏈路的某個微服務(wù)不可用或者響應(yīng)時間太長時闸迷,會進(jìn)行服務(wù)的降級,進(jìn)而熔斷該節(jié)點(diǎn)微服務(wù)的調(diào)用俘枫,快速返回錯誤的響應(yīng)信息-=-腥沽。當(dāng)檢測到該節(jié)點(diǎn)微服務(wù)調(diào)用響應(yīng)正常后恢復(fù)調(diào)用鏈路。在SpringCloud框架里熔斷機(jī)制通過Hystrix實(shí)現(xiàn)鸠蚪。Hystrix會監(jiān)控微服務(wù)間調(diào)用的狀況今阳,當(dāng)失敗的調(diào)用到一定閾值,缺省是5秒內(nèi)20次調(diào)用失敗就會啟動熔斷機(jī)制茅信。熔斷機(jī)制的注解是@HystrixCommand盾舌。

如何使用hystrix服務(wù)熔斷:

導(dǎo)入hystrix依賴:

<!--Hystrix-->

<dependency>?

???????????<groupId>org.springframework.cloud</groupId>?

???????????<artifactId>spring-cloud-starter-hystrix</artifactId>???

?????????<version>1.4.7.RELEASE</version>

</dependency>

添加Hystrix方法,使用Hystrix注解調(diào)用:

Hystrix啟動類:

測試(當(dāng)數(shù)據(jù)庫沒有id值蘸鲸,進(jìn)入Hystrix方法妖谴,使服務(wù)不down掉):

服務(wù)降級:

什么是服務(wù)降級:

服務(wù)降級是指當(dāng)服務(wù)器壓力劇增的情況下,根據(jù)實(shí)際業(yè)務(wù)情況及流量酌摇,對一些服務(wù)和頁面有策略的不處理窖维,或換種簡單的方式處理,從而釋放服務(wù)器資源以保證核心業(yè)務(wù)正常運(yùn)作或高效運(yùn)作妙痹。說白了铸史,就是盡可能的把系統(tǒng)資源讓給優(yōu)先級高的服務(wù)。

指定熔斷降級降級:

通過工廠調(diào)用接口進(jìn)行服務(wù)降級

編寫配置信息(?#開啟降級feign.hystrix):

feign:??

?????hystrix:? ?

?????????enabled: true

運(yùn)行后關(guān)閉服務(wù)器(降級成功):

服務(wù)熔斷:服務(wù)端某個服務(wù)超時或者異常怯伊,引起熔斷保險絲

服務(wù)降級:客戶端從整體網(wǎng)站請求負(fù)載考慮琳轿,當(dāng)某個服務(wù)熔斷或者關(guān)閉之后,服務(wù)將不再被調(diào)用~此時在客戶端耿芹,我們可以準(zhǔn)備一個FallbackFactory崭篡,返回一個默認(rèn)的值(缺省值),整體服務(wù)的水平下降了吧秕,但是好歹能用琉闪,比直接掛掉要強(qiáng)~

Hystrix監(jiān)控面板(dashboard):

?

首先導(dǎo)入依賴(創(chuàng)建監(jiān)控客戶端,復(fù)制80依賴后加入如下兩個依賴):

<dependency>??

? ????????<groupId>org.springframework.cloud</groupId>

??? ???????<artifactId>spring-cloud-starter-hystrix</artifactId>

??? ????????<version>1.4.7.RELEASE</version>

</dependency>

<dependency>??

?? ??????<groupId>org.springframework.cloud</groupId>??

?? ???????<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>??

? ????????<version>1.4.7.RELEASE</version>

</dependency>-->

然后編寫端口等配置信息:

server:??

? ??port: 9001

hystrix:??

? ??dashboard:???

? ???????proxy-stream-allow-list: localhost

?

編寫監(jiān)控頁面啟動類(開啟監(jiān)控注解 ?@EnableHystrixDashboard):


在服務(wù)端砸彬,想要監(jiān)控信息的流颠毙,需要添加一個Servlet創(chuàng)建Bean對象,創(chuàng)建Hystrix流監(jiān)控砂碉,并且傳遞監(jiān)控Url信息蛀蜜,然后開啟對熔斷器的支持( @EnableCircuitBreaker):

啟動7001,8003,9001,在http://localhost:8003/actuator/hystrix.stream這上面我們可以捕捉到8003服務(wù)器上面的get請求信息:

測試啟動是否成功增蹭,在http://localhost:9001/hystrix上填寫需要監(jiān)控頁面的信息:

得到結(jié)果:

實(shí)心圓的健康程度綠<黃<橙<紅 遞減 流量越大圓越大滴某,其他參數(shù)表示:

Zuul路由網(wǎng)關(guān):

什么是Zuul:

·Zull包含了對請求的路由(用來跳轉(zhuǎn)的)和過濾兩個最主要功能:

·其中路由功能負(fù)責(zé)將外部請求轉(zhuǎn)發(fā)到具體的微服務(wù)實(shí)例上,是實(shí)現(xiàn)外部訪問統(tǒng)一入口的基礎(chǔ),而過濾器功能則負(fù)責(zé)對請求的處理過程進(jìn)行干預(yù)霎奢,是實(shí)現(xiàn)請求校驗(yàn)户誓,服務(wù)聚合等功能的基礎(chǔ)。Zuul和Eureka進(jìn)行整合幕侠,將Zuul自身注冊為Eureka服務(wù)治理下的應(yīng)用帝美,同時從Eureka中獲得其他服務(wù)的消息,也即以后的訪問微服務(wù)都是通過Zuul跳轉(zhuǎn)后獲得橙依。

·Zuul服務(wù)最終還是會注冊進(jìn) Eureka

使用Zuul:

創(chuàng)建Zuul工程導(dǎo)入Zuul依賴:

<dependency>???

? ???????<groupId>org.springframework.cloud</groupId>???

? ???????<artifactId>spring-cloud-starter-zuul</artifactId>

??? ????<version>1.4.7.RELEASE</version>

</dependency>-->

編寫配置信息:

server:

?? ???port: 9527

spring:?

? ???application:? ??

? ??????name: springcloud-zuul#Eureka的配置,服務(wù)注冊到哪里

eureka:??

? ??client:????

? ??????service-url:????

? ????????????defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,

? ??????????????????????????????????http://eureka7003.com:7003/eureka/?

instance:??

???instance-id: springcloud-zuul-9527? ??

? ??prefer-ip-address: true

#info配置

info:??

? ??app.name: dcits-springboot??

? ??company.name: blog.chenglin.com

添加啟動項(xiàng):

注冊到Eureka:

通過路由網(wǎng)關(guān)(微服務(wù)名稱)硕旗,訪問:

通過Zuul隱藏微服務(wù)的名稱:

? ??????在9527下添加配置信息窗骑,通過mydept訪問,隱藏微服務(wù)的名稱:

zuul:??

? ??routes:??

? ????? ??mydept.serviceId: springcloud-provider-dept? ??

? ??????mydept.path: /mydept/**??

ignored-services: springcloud-provider-dept ?#不能夠通過這個路徑訪問漆枚,忽略這個名稱

通過路由網(wǎng)關(guān)(隱藏微服務(wù)名稱)创译,訪問:

發(fā)表項(xiàng)目的時候,利用通配符進(jìn)行隱藏墙基,并且指定訪問前綴:

zuul:?

? ???routes:???

? ???????mydept.serviceId: springcloud-provider-dept?

??? ? ? ??mydept.path: /mydept/**??

ignored-services: "*" ?#不能夠通過這個路徑訪問软族,忽略,隱藏全部?

prefix: /lin #統(tǒng)一規(guī)定,公共的訪問前綴/lin

通過路由網(wǎng)關(guān)指定訪問前綴残制,訪問:

SpringCloudConfig分布式配置:

什么是springCloudConfig分布式配置中心(在配置中心提供了configServer來解決在大型項(xiàng)目中需要修改無數(shù)個配置文件的問題)將配置放github上:

spring cloud config為微服務(wù)架構(gòu)中的微服務(wù)提供集中化的外部支持立砸,配置服務(wù)器為各個不同微服務(wù)應(yīng)用的所有環(huán)節(jié)提供了一個中心化的外部配置。

spring cloud config分為服務(wù)端客戶端兩部分初茶。

服務(wù)端也稱為分布式配置中心颗祝,它是一個獨(dú)立的微服務(wù)應(yīng)用,用來連接配置服務(wù)器并為客戶端提供獲取配置信息恼布,加密螺戳,解密信息等訪問接口。

客戶端則是通過指定的配置中心來管理應(yīng)用資源折汞,以及與業(yè)務(wù)相關(guān)的配置內(nèi)容倔幼,并在啟動的時候從配置中心獲取和加載配置信息。配置服務(wù)器默認(rèn)采用git來存儲配置信息爽待,這樣就有助于對環(huán)境配置進(jìn)行版本管理损同。并且可用通過git客戶端工具來方便的管理和訪問配置內(nèi)容。

SpringCloud config分布式配置中心能干什么:

·集中式管理配置文件

·不同環(huán)境不同配置鸟款,動態(tài)化的配置更新揖庄,分環(huán)境部署,比如/dev /test /prod /beta/release

·運(yùn)行期間動態(tài)調(diào)整配置欠雌,不再需要在每個服務(wù)部署的機(jī)器上編寫配置文件蹄梢,服務(wù)會向配置中心統(tǒng)一拉取配置自己的信息

·當(dāng)配置發(fā)生變動時,服務(wù)不需要重啟,即可感知到配置的變化禁炒,并應(yīng)用新的配置

·將配置信息以REST接口的形式暴露

Config服務(wù)端連接git:

創(chuàng)建config服務(wù)端:

導(dǎo)入依賴(除此之外而咆,海域要web和eureka依賴等):

<!--config-->

<dependency>???

? ???????<groupId>org.springframework.cloud</groupId>????

? ??????<artifactId>spring-cloud-config-server</artifactId>????

? ??????<version>2.1.1.RELEASE</version>

</dependency>

編寫配置信息(通過config-server可以連接到git,訪問其中的資源以及配置):

server:?

? ???port: 3344

spring:?

? ???application:??

?? ???????name: springcloud-config-server????#連接遠(yuǎn)程倉庫??

cloud:??

?? ???config:? ??

?? ???????server:? ? ? ?

? ???????????git:????????

? ????????????????uri: https://github.com/*/springcloud-config.git???# https不是git

創(chuàng)建啟動類:

HTTP服務(wù)通過如下訪問git上面的內(nèi)容:

? ??????/{application}/{profile}[/{label}]

? ??????/{application}-{profile}.yml

? ??????/{label}/{application}-{profile}.yml

? ??????/{application}-{profile}.properties

? ??????/{label}/{application}-{profile}.properties

訪問到git:

創(chuàng)建config客戶端:

導(dǎo)入依賴:

<!--config-client-->

<dependency>???

?? ??????<groupId>org.springframework.cloud</groupId>? ?

? ???????<artifactId>spring-cloud-starter-config</artifactId>?

? ?????????<version>2.1.1.RELEASE</version>

</dependency>

編寫配置信息(bootstrap.yml系統(tǒng)級別的配置,application.yml用戶級別配置):

bootstrap.yml:

#系統(tǒng)級別的配置??bootstrap.yml

spring:??

? ??cloud:???

? ???????config:??

? ?? ???????????name: config-client #需要從git上讀取資源的名稱幕袱,不需要后綴? ?

?? ?????????????profile: dev? ? ?

? ? ? ? ? ? ? ??label: master??

? ??? ?????????uri: http://localhost:3344

application.yml:

#用戶級別的配置?application.yml

spring:?

?? ??application:??

? ???? ???name: springcloud-config-client-3355

?

創(chuàng)建客戶端啟動類:

編寫客戶端控制器:

啟動客戶端和服務(wù)端暴备,訪問config-clientprofile: dev的配置,得到結(jié)果:

?

重啟動客戶端们豌,更改系統(tǒng)級別配置文件config-clientprofile: test的配置涯捻,得到結(jié)果:

得到結(jié)果,我們可以把配置望迎,放到遠(yuǎn)程障癌;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市辩尊,隨后出現(xiàn)的幾起案子涛浙,更是在濱河造成了極大的恐慌,老刑警劉巖摄欲,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件轿亮,死亡現(xiàn)場離奇詭異,居然都是意外死亡胸墙,警方通過查閱死者的電腦和手機(jī)我注,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來迟隅,“玉大人仓手,你說我怎么就攤上這事〔J纾” “怎么了嗽冒?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長补履。 經(jīng)常有香客問我添坊,道長,這世上最難降的妖魔是什么箫锤? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任贬蛙,我火速辦了婚禮,結(jié)果婚禮上谚攒,老公的妹妹穿的比我還像新娘阳准。我一直安慰自己,他們只是感情好馏臭,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布野蝇。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪绕沈。 梳的紋絲不亂的頭發(fā)上锐想,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天,我揣著相機(jī)與錄音乍狐,去河邊找鬼赠摇。 笑死,一個胖子當(dāng)著我的面吹牛浅蚪,可吹牛的內(nèi)容都是我干的藕帜。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼惜傲,長吁一口氣:“原來是場噩夢啊……” “哼洽故!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起操漠,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤收津,失蹤者是張志新(化名)和其女友劉穎饿这,沒想到半個月后浊伙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡长捧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年嚣鄙,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片串结。...
    茶點(diǎn)故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡哑子,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出肌割,到底是詐尸還是另有隱情卧蜓,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布把敞,位于F島的核電站弥奸,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏奋早。R本人自食惡果不足惜盛霎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望耽装。 院中可真熱鬧愤炸,春花似錦、人聲如沸掉奄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至绰姻,卻和暖如春枉侧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背狂芋。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工榨馁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人帜矾。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓翼虫,卻偏偏與公主長得像,于是被迫代替她去往敵國和親屡萤。 傳聞我的和親對象是個殘疾皇子珍剑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評論 2 359

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