斷路器Hystrix
在微服務架構中荔燎,系統(tǒng)被拆分成了一個個小的服務單元耻姥,各自運行在自己的線程中,各單元之間通過注冊與訂閱的方式互相遠程調(diào)用有咨,此時若網(wǎng)絡故障或是某一服務掛掉則會出現(xiàn)調(diào)用延遲琐簇,進一步導致調(diào)用方的對外服務也出現(xiàn)延遲,如果調(diào)用方的請求不斷增加座享,服務單元線程資源無法釋放婉商,隊列裝滿,最終導致故障的蔓延渣叛,斷路器就是解決這種問題的丈秩。
斷路器通過對特定的服務的調(diào)用的不可用達到一個閥值的時候打開斷路,用fallback方法直接返回一個固定值避免服務的阻塞淳衙。Netflix開源了Hystrix組件蘑秽,實現(xiàn)了斷路器模式,SpringCloud對這一組件進行了整合箫攀。下面斷路器的使用基于筆記2的eureka_ribbon項目肠牲。
首先在pox.xml文件中加入spring-cloud-starter-netflix-hystrix的依賴:
<dependency>
??? <groupId>org.springframework.cloud</groupId>
??? <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
在程序的啟動類EurekaRibbonApplication中添加Hystrix斷路器的注解@EnableHystrix,上面提及斷路器需要一個服務不可用時的固定返回值靴跛,所以在我們調(diào)用的hi方法中需要添加fallback的熔斷方法缀雳,其中hiError出錯時固定返回值的方法。
在啟動eureka_ribbon項目先啟動服務注冊中心eureka_server和服務eureka_client梢睛,訪問http://localhost:8764/hello肥印,出現(xiàn)正常的訪問頁面,這時候關閉SERVICE-HELLO的服務绝葡,再次訪問http://localhost:8764/hello竖独,則會出現(xiàn)如下信息,說明斷路器起了作用挤牛。當SERVICE-HELLO服務不可用時莹痢,會執(zhí)行快速失敗,直接調(diào)用固定方法返回一組字符串墓赴,而不是等待響應超時竞膳,很好的控制了容器的線程阻塞。
路由網(wǎng)關Zuul
zuul 是netflix開源的一個API Gateway 服務器, 本質(zhì)上是一個web servlet應用诫硕,提供動態(tài)路由坦辟,監(jiān)控,彈性章办,安全等邊緣服務的框架锉走,主要功能是路由轉(zhuǎn)發(fā)和過濾器滨彻。路由功能是微服務的一部分,默認和Ribbon結(jié)合實現(xiàn)了負載均衡挪蹭。
新建SpringBoot項目eureka-zuul亭饵,并引入zuul依賴,啟動類添加注解@EnableZuulProxy開啟zuul功能梁厉,配置文件application.yml如下:服務中心還是使用上節(jié)的8761辜羊,zuul服務端口設為8766,服務名service-zuul词顾,路由轉(zhuǎn)發(fā)規(guī)則設置為以/api-a/ 開頭的請求都轉(zhuǎn)發(fā)給service-ribbon服務八秃;以/api-b/開頭的請求都轉(zhuǎn)發(fā)給service-feign服務:
運行服務中心項目、client服務提供項目肉盹、以及ribbon服務調(diào)用項目昔驱,訪問http://localhost:8766/api-a/hello,頁面顯示如下上忍,說明路由zuul起到了服務轉(zhuǎn)發(fā)的功能舍悯。