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中文版:
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)程障癌;