因?yàn)樵诠咀罱捻?xiàng)目中,使用的架構(gòu)是spring-cloud的微服務(wù)架構(gòu)玫荣,然后正好公司組織了一次關(guān)于spring-cloud的相關(guān)的一些技術(shù)分享甚淡,故在此處將對(duì)于spring-cloud 中對(duì)于ribbon ,hystrix 和 feign的作用和關(guān)系做一個(gè)學(xué)習(xí)記錄捅厂,以方便以后查看贯卦。
Ribbon介紹
Ribbon是Netflix發(fā)布的開(kāi)源項(xiàng)目底挫,主要功能是提供客戶端的軟件負(fù)載均衡算法,將Netflix的中間層服務(wù)連接在一起脸侥。Ribbon客戶端組件提供一系列完善的配置項(xiàng)如連接超時(shí)建邓,重試等。簡(jiǎn)單的說(shuō)睁枕,就是在配置文件中列出Load Balancer后面所有的機(jī)器官边,Ribbon會(huì)自動(dòng)的幫助你基于某種規(guī)則(如簡(jiǎn)單輪詢,隨機(jī)連接等)去連接這些機(jī)器外遇。我們也很容易使用Ribbon實(shí)現(xiàn)自定義的負(fù)載均衡算法注簿。簡(jiǎn)單地說(shuō),Ribbon是一個(gè)客戶端負(fù)載均衡器跳仿。
Ribbon工作時(shí)分為兩步:第一步先選擇 Eureka Server, 它優(yōu)先選擇在同一個(gè)Zone且負(fù)載較少的Server诡渴;第二步再根據(jù)用戶指定的策略,在從Server取到的服務(wù)注冊(cè)列表中選擇一個(gè)地址菲语。其中Ribbon提供了多種策略妄辩,例如輪詢、隨機(jī)山上、根據(jù)響應(yīng)時(shí)間加權(quán)等眼耀。
ribbon源碼的github地址:
https://github.com/Netflix/ribbon
Feign介紹
Feign是一個(gè)聲明式的web service客戶端,它使得編寫(xiě)web service客戶端更為容易佩憾。創(chuàng)建接口哮伟,為接口添加注解,即可使用Feign妄帘。Feign可以使用Feign注解或者JAX-RS注解楞黄,還支持熱插拔的編碼器和解碼器。Spring Cloud為Feign添加了Spring MVC的注解支持抡驼,并整合了Ribbon和Eureka來(lái)為使用Feign時(shí)提供負(fù)載均衡鬼廓。
feign源碼的github地址:
https://github.com/OpenFeign/feign
Hystrix介紹
Hystrix熔斷器,容錯(cuò)管理工具婶恼,旨在通過(guò)熔斷機(jī)制控制服務(wù)和第三方庫(kù)的節(jié)點(diǎn),從而對(duì)延遲和故障提供更強(qiáng)大的容錯(cuò)能力桑阶。在Spring Cloud Hystrix中實(shí)現(xiàn)了線程隔離、斷路器等一系列的服務(wù)保護(hù)功能勾邦。它也是基于Netflix的開(kāi)源框架 Hystrix實(shí)現(xiàn)的,該框架目標(biāo)在于通過(guò)控制那些訪問(wèn)遠(yuǎn)程系統(tǒng)割择、服務(wù)和第三方庫(kù)的節(jié)點(diǎn)眷篇,從而對(duì)延遲和故障提供更強(qiáng)大的容錯(cuò)能力。Hystrix具備了服務(wù)降級(jí)荔泳、服務(wù)熔斷蕉饼、線程隔離虐杯、請(qǐng)求緩存、請(qǐng)求合并以及服務(wù)監(jiān)控等強(qiáng)大功能昧港。
Hystrix源碼的github地址:
https://github.com/Netflix/hystrix
下面我們就來(lái)看一下在微服務(wù)中擎椰,如何快速的使用它們
在一個(gè)請(qǐng)求進(jìn)入到我們系統(tǒng)之后,我們的系統(tǒng)具體是怎么的一個(gè)流程來(lái)處理的呢创肥?可能每個(gè)同學(xué)都有自己的理解达舒,下面我畫(huà)了一個(gè)圖來(lái)比較形象的描述我對(duì)于這些組件之間的關(guān)系的一個(gè)圖,有不對(duì)的地方叹侄,請(qǐng)大家批評(píng)指正:
代碼實(shí)現(xiàn)示例
1.工程目錄結(jié)構(gòu)
本次我們準(zhǔn)備了4個(gè)工程模塊巩搏,分別是:
a.基于spring-boot的服務(wù)提供模塊:service-demo
b.基于eureka實(shí)現(xiàn)的服務(wù)注冊(cè)中心模塊:register-demo
c.消費(fèi)方-配合ribbon和hystrix的模塊:consumer-ribbon-with-hystrix-demo
d.消費(fèi)方-配合feign和hystrix的模塊:consumer-feign-with-hystrix-demo
2.consumer-ribbon-with-hystrix-demo中的代碼說(shuō)明
pom.xml配置
分別加入了hystrix/ribbon/eureka的pom依賴
user類實(shí)體類
RibbonHystrixController類
RibbonHystrixService類
在這個(gè)類中通過(guò)注解
@HystrixCommand(fallbackMethod = "fallback")
和實(shí)現(xiàn)的fallback方法來(lái)實(shí)現(xiàn)短路保護(hù)
public User fallback(Long id)?
啟動(dòng)類
通過(guò)注解@LoadBalanced
@Bean
@LoadBalanced
public RestTemplate restTemplate() { return new RestTemplate();}
實(shí)現(xiàn)調(diào)用方的負(fù)載均衡
測(cè)試實(shí)現(xiàn)效果
1.測(cè)試準(zhǔn)備
a.啟動(dòng)注冊(cè)中心服務(wù)register-demo
效果如下:
表示啟動(dòng)成功
b.在瀏覽器中訪問(wèn)地址:
http://localhost:8761/
能打開(kāi)頁(yè)面,表示啟動(dòng)成功趾代,從圖中可以看到贯底,目前沒(méi)有服務(wù)注冊(cè)進(jìn)來(lái)。
c.我們啟動(dòng)service-demo服務(wù)撒强,注意需要啟動(dòng)兩次service服務(wù)
注意在idea中默認(rèn)相同的服務(wù)禽捆,重復(fù)啟動(dòng)的話,會(huì)覆蓋之前的服務(wù)飘哨,如何啟動(dòng)兩個(gè)服務(wù)呢睦擂?請(qǐng)看下圖:
點(diǎn)擊Edit 菜單
將單列啟動(dòng)的限制勾選去掉,就可以了杖玲。注意顿仇,需要啟動(dòng)兩次,需要修改application.yml文件中的端口號(hào)
效果如下:
表示啟動(dòng)成功摆马,并加入到了注冊(cè)中心臼闻。
從圖中我們可以看到,在瀏覽器中已經(jīng)可以看到注冊(cè)上來(lái)的服務(wù)了囤采,并且這個(gè)服務(wù)有兩個(gè)節(jié)點(diǎn)
d.我們啟動(dòng)寫(xiě)好的consumer-ribbon-with-hystrix-demo服務(wù)
效果如下:
2.通過(guò)postmain調(diào)用接口測(cè)試
a.測(cè)試調(diào)用6次接口
http://localhost:8011/ribbon/2
結(jié)果:輸出是在每個(gè)控制臺(tái)打印三次日志
b.關(guān)掉所有服務(wù)的時(shí)候述呐,就會(huì)走到降級(jí)流程中
3.consumer-feign-with-hystrix-demo中的代碼說(shuō)明
這個(gè)的配置就不一一闡述秤茅,所有工程的代碼奕纫,請(qǐng)需要的同學(xué)從github中下載測(cè)試附迷。
在feign中使用hystrix斷路器的時(shí)候读存,一定要開(kāi)啟一個(gè)配置厨钻,如果沒(méi)有開(kāi)啟的話栈戳,默認(rèn)是關(guān)閉的牡彻,不會(huì)走斷路器腔呜。
如下圖:
代碼地址:
Github地址:點(diǎn)擊查看
https://github.com/xiangfajun/spring-cloud-microservice-demo
本文參考的文獻(xiàn)地址:
http://blog.didispace.com/spring-cloud-starter-dalston-2-3/
http://blog.didispace.com/spring-cloud-starter-dalston-2-2/
http://blog.didispace.com/spring-cloud-starter-dalston-4-1/
http://blog.didispace.com/spring-cloud-starter-dalston-4-2/