SpringCloud Feign隔離與降級詳細分析
序篇
限流是一種預(yù)防措施,雖然限流可以盡量避免因高并發(fā)而引起的服務(wù)故障,但服務(wù)還會因為其它原因而故障。
而要將這些故障控制在一定范圍,避免雪崩,就要靠線程隔離(艙壁模式)和熔斷降級手段了。
線程隔離:調(diào)用者在調(diào)用服務(wù)提供者時,給每個調(diào)用的請求分配獨立線程池,出現(xiàn)故障時,最多消耗這個線程池內(nèi)資源,避免把調(diào)用者的所有資源耗盡。
熔斷降級:是在調(diào)用方這邊加入斷路器,統(tǒng)計對服務(wù)提供者的調(diào)用,如果調(diào)用的失敗比例過高,則熔斷該業(yè)務(wù),不允許訪問該服務(wù)的提供者了。
可以看到,不管是線程隔離還是熔斷降級,都是對客戶端(調(diào)用方)的保護。需要在調(diào)用方 發(fā)起遠程調(diào)用時做線程隔離、或者服務(wù)熔斷。
而我們的微服務(wù)遠程調(diào)用都是基于Feign來完成的,因此我們需要將Feign與Sentinel整合,在Feign里面實現(xiàn)線程隔離和服務(wù)熔斷。
FeignClient整合Sentinel
SpringCloud中,微服務(wù)調(diào)用都是通過Feign來實現(xiàn)的,因此做客戶端保護必須整合Feign和Sentinel。
1.1 修改配置,開啟sentinel功能
修改OrderService的application.yml文件,開啟Feign的Sentinel功能:
feign:
sentinel:
enabled: true # 開啟feign對sentinel的支持
1.2 編寫失敗降級邏輯
業(yè)務(wù)失敗后,不能直接報錯,而應(yīng)該返回用戶一個友好提示或者默認結(jié)果,這個就是失敗降級邏輯。
給FeignClient編寫失敗后的降級邏輯
①方式一:FallbackClass,無法對遠程調(diào)用的異常做處理
②方式二:FallbackFactory,可以對遠程調(diào)用的異常做處理,我們選擇這種
這里我們演示方式二的失敗降級處理。
步驟一:在feing-api項目中定義類,實現(xiàn)FallbackFactory:
代碼:
import cn.itcast.feign.clients.UserClient; import cn.itcast.feign.pojo.User; import feign.hystrix.FallbackFactory; import lombok.extern.slf4j.Slf4j; @Slf4j public class UserClientFallbackFactory implements FallbackFactory<UserClient> { @Override public UserClient create(Throwable throwable) { return new UserClient() { @Override public User findById(Long id) { log.error("查詢用戶異常", throwable); return new User(); } }; } }
步驟二:在feing-api項目中的DefaultFeignConfiguration類中將UserClientFallbackFactory注冊為一個Bean:
@Bean public UserClientFallbackFactory userClientFallbackFactory(){ return new UserClientFallbackFactory(); }
步驟三:在feing-api項目中的UserClient接口中使用UserClientFallbackFactory:
import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @FeignClient(value = "userservice", fallbackFactory = UserClientFallbackFactory.class) public interface UserClient { @GetMapping("/user/{id}") User findById(@PathVariable("id") Long id); }
重啟后,訪問一次訂單查詢業(yè)務(wù),然后查看sentinel控制臺,可以看到新的簇點鏈路:
1.3 總結(jié)
Sentinel支持的雪崩解決方案:
- 線程隔離(倉壁模式)
- 降級熔斷
Feign整合Sentinel的步驟:
- 在application.yml中配置:feign.sentienl.enable=true
- 給FeignClient編寫FallbackFactory并注冊為Bean
- 將FallbackFactory配置到FeignClient
到此這篇關(guān)于SpringCloud Feign隔離與降級詳細分析的文章就介紹到這了,更多相關(guān)SpringCloud Feign隔離與降級內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java中struts2實現(xiàn)簡單的文件上傳與下載
這篇文章主要為大家詳細介紹了java中struts2實現(xiàn)簡單的文件上傳與下載的相關(guān)資料,感興趣的小伙伴們可以參考一下2016-05-05intellij IDEA配置springboot的圖文教程
Spring Boot是由Pivotal團隊提供的全新框架,其設(shè)計目的是用來簡化新Spring應(yīng)用的初始搭建以及開發(fā)過程。接下來通過本文給大家介紹intellij IDEA配置springboot的圖文教程,感興趣的朋友一起看看吧2018-03-03IntelliJ IDEA配置Tomcat(完整版圖文教程)
這篇文章主要介紹了IntelliJ IDEA配置Tomcat(完整版圖文教程),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-05-05