SpringCloud Feign隔離與降級詳細(xì)分析
序篇
限流是一種預(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)用方)的保護(hù)。需要在調(diào)用方 發(fā)起遠(yuǎn)程調(diào)用時做線程隔離、或者服務(wù)熔斷。
而我們的微服務(wù)遠(yuǎn)程調(diào)用都是基于Feign來完成的,因此我們需要將Feign與Sentinel整合,在Feign里面實現(xiàn)線程隔離和服務(wù)熔斷。
FeignClient整合Sentinel
SpringCloud中,微服務(wù)調(diào)用都是通過Feign來實現(xiàn)的,因此做客戶端保護(hù)必須整合Feign和Sentinel。
1.1 修改配置,開啟sentinel功能
修改OrderService的application.yml文件,開啟Feign的Sentinel功能:
feign:
sentinel:
enabled: true # 開啟feign對sentinel的支持
1.2 編寫失敗降級邏輯
業(yè)務(wù)失敗后,不能直接報錯,而應(yīng)該返回用戶一個友好提示或者默認(rèn)結(jié)果,這個就是失敗降級邏輯。
給FeignClient編寫失敗后的降級邏輯
①方式一:FallbackClass,無法對遠(yuǎn)程調(diào)用的異常做處理
②方式二:FallbackFactory,可以對遠(yuǎn)程調(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隔離與降級詳細(xì)分析的文章就介紹到這了,更多相關(guān)SpringCloud Feign隔離與降級內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot中選擇性加載Bean的幾種方式小結(jié)
自動配置是springboot技術(shù)非常好用的核心因素,前面學(xué)習(xí)了這么多種技術(shù)的整合,每一個都離不開自動配置,不過在學(xué)習(xí)自動配置的時候,需要你對spring容器如何進(jìn)行bean管理的過程非常熟悉才行,本文給大家介紹了SpringBoot中選擇性加載Bean的幾種方式,需要的朋友可以參考下2025-01-01
Idea使用插件實現(xiàn)逆向工程搭建SpringBoot項目的圖文教程
這篇文章主要介紹了Idea使用插件實現(xiàn)逆向工程搭建SpringBoot項目,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06
springboot集成JWT之雙重token的實現(xiàn)
本文主要介紹了springboot集成JWT之雙重token的實現(xiàn),前端使用accessToken進(jìn)行登錄和驗證,后端使用refreshToken定期更新accessToken,具有一定的參考價值,感興趣的可以了解一下2025-03-03
java 快速實現(xiàn)異步調(diào)用的操作方法
這篇文章主要介紹了java 如何快速實現(xiàn)異步調(diào)用方法,今天我們就來了解下 CompletableFuture,它Java 8引入的一種功能強(qiáng)大的異步編程工具,可以用于實現(xiàn)復(fù)雜的異步操作和處理鏈?zhǔn)降漠惒饺蝿?wù),需要的朋友可以參考下2023-07-07
Ubuntu16.04安裝部署solr7的圖文詳細(xì)教程
這篇文章主要為大家詳細(xì)介紹了Ubuntu16.04安裝部署solr7的圖文詳細(xì)教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-07-07
Spring事務(wù)@Transactional注解四種不生效案例場景分析
這篇文章主要為大家介紹了Spring事務(wù)@Transactional注解四種不生效的案例場景示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07

