Spring?Cloud?Hystrix?服務(wù)降級(jí)限流策略詳解
前言
前面說(shuō)到在我們應(yīng)對(duì)高并發(fā)的場(chǎng)景,請(qǐng)求量過(guò)于大的情況下給我們服務(wù)器的壓力很多,造成緩存穿透、擊穿、雪崩,那么我們采用布隆過(guò)濾器,有興趣的小伙伴可以去看看上篇文章,關(guān)于布隆過(guò)濾器的解析。Redis處理高并發(fā)之布隆過(guò)濾器
我們要從根源上解決問題,比如一個(gè)接口在同一時(shí)間內(nèi)被多次請(qǐng)求,如果請(qǐng)求失敗了,我們還要繼續(xù)請(qǐng)求么,一直請(qǐng)求一直失敗,一直的在給我們的服務(wù)器施加壓力,這種情況下肯定是不行,這個(gè)時(shí)候我們就需要對(duì)接口服務(wù)提供降級(jí)策略,在服務(wù)請(qǐng)求達(dá)成一定失敗率的情況下,就觸發(fā)降級(jí)、熔斷策略對(duì)服務(wù)進(jìn)行保護(hù),也可以去服務(wù)的每分鐘請(qǐng)求次數(shù)做限制,從而保護(hù)我們的服務(wù),給服務(wù)端減輕壓力,可以更加效率去執(zhí)行業(yè)務(wù)邏輯。
Hystrix簡(jiǎn)介
Hystrix 是一個(gè)用于解決分布式服務(wù)調(diào)用出現(xiàn)延遲、故障,在一個(gè)服務(wù)出現(xiàn)故障的時(shí)候,保護(hù)其他服務(wù)可以正常使用,避免整個(gè)系統(tǒng)出現(xiàn)問題,Hystrix作為開源庫(kù),以斷路器的角色存在著。
Hystrix的使用
服務(wù)降級(jí)
服務(wù)超時(shí)或故障,Hystrix調(diào)用降級(jí)方法處理,首先構(gòu)建兩個(gè)服務(wù),一個(gè)system服務(wù),定義2個(gè)controller方法,一個(gè)是模擬超時(shí)的場(chǎng)景,一個(gè)模擬調(diào)用錯(cuò)誤的場(chǎng)景,另外一個(gè)system2的服務(wù),去模擬分布式場(chǎng)景下的調(diào)system服務(wù)的場(chǎng)景。

system服務(wù)控制層
@RestController
@RequestMapping("/hystrix")
@DefaultProperties(defaultFallback = "timeOutFallbackMethod")
public class HystrixController {
@Autowired
private IHystrixService iHystrixService;
@GetMapping("/error")
@HystrixCommand
public String errorMethod() {
int i = 10 / 0;
return iHystrixService.fallBackMethodOk();
}
@GetMapping("/timeOut")
@HystrixCommand(fallbackMethod = "timeOutFallbackMethod", commandProperties = {
//超過(guò)2秒及服務(wù)降級(jí)
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "2000")
})
public String timeOutMethod() throws InterruptedException {
//線程睡眠3秒
return iHystrixService.timeOutMethod();
}
/**
* 降級(jí)方法
*
* @return
*/
private String timeOutFallbackMethod() {
return "服務(wù)訪問失敗,降級(jí)處理";
}
}
@DefaultProperties 默認(rèn)全局降級(jí)方法,在單純只加@HystrixCommand注解的情況下,走默認(rèn)的defaultFallback方法。
int i = 10 / 0; 接口異常情況下降級(jí)

超時(shí)降級(jí),服務(wù)設(shè)置超時(shí)時(shí)間為2秒,調(diào)用線程睡眠3秒,超時(shí)調(diào)降級(jí)服務(wù)


System2調(diào)System降級(jí)場(chǎng)景
controller
@RestController
@AllArgsConstructor
@RequestMapping("/provider")
public class HystrixProviderController {
@Autowired
private HystrixService hystrixService;
/**
* 模擬接口錯(cuò)誤場(chǎng)景
* @return
*/
@GetMapping("/executeProviderMethod1")
public String executeProviderMethod1(){
int i =5/0;
String result = hystrixService.errorMethod();
return result;
}
}
服務(wù)system feign接口,feign添加fallback,實(shí)現(xiàn)類是調(diào)用的降級(jí)方法。
@FeignClient(contextId = "hystrixService", value = "Lxlxxx-system", fallbackFactory = HystrixFallbackFactory.class)
public interface HystrixService {
/**
* 異常方法
*
* @return
*/
@GetMapping("/hystrix/error")
public String errorMethod();
/**
* 超時(shí)方法
*
* @return
*/
@GetMapping("/hystrix/timeOut")
public String timeOutMethod();
}
fallback降級(jí)方法。
@Component
@Slf4j
public class HystrixFallbackFactory implements FallbackFactory<HystrixService> {
@Override
public HystrixService create(Throwable cause) {
log.error("用戶服務(wù)調(diào)用失敗:{}", cause.getMessage());
return new HystrixService() {
@Override
public String errorMethod() {
return "觸發(fā)system 服務(wù)的降級(jí)方法";
}
@Override
public String timeOutMethod() {
return null;
}
};
}
}
服務(wù)熔斷
Service類里面的熔斷方式,可以配置多個(gè)出發(fā)服務(wù)熔斷的屬性,從而更好的斷路保護(hù)服務(wù)。
@Service
@Slf4j
public class HystrixServiceImpl implements IHystrixService {
//服務(wù)熔斷
@HystrixCommand(fallbackMethod = "fallback",commandProperties = {
@HystrixProperty(name = "circuitBreaker.enabled",value = "true"), //是否開啟斷路器
@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "5"), //請(qǐng)求次數(shù)
@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "10000"), //時(shí)間范圍
@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "60"), //失敗率達(dá)到多少后跳閘
})
@Override
public String countError(Integer count){
//模擬報(bào)錯(cuò)
if (count > 0){
throw new RuntimeException("*****count 必須大于0");
}
return Thread.currentThread().getName()+"\t"+"調(diào)用成功";
}
public String fallback(Integer count){
return "count 必修大于0 count: " +count;
}
}
總結(jié)
熔斷、降級(jí)的方式有很多,Spring Cloud Hystrix 可以能更好的集成在分布式微服務(wù)的架構(gòu)體系上,采用注解的方式,更加方便使用,如果還有更好的服務(wù)熔斷、降級(jí)策略歡迎小伙伴分享。
以上就是Spring Cloud Hystrix 服務(wù)降級(jí)限流策略詳解的詳細(xì)內(nèi)容,更多關(guān)于Spring Cloud Hystrix 服務(wù)降級(jí)限流的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Spring注解Autowired的底層實(shí)現(xiàn)原理詳解
從當(dāng)前springboot的火熱程度來(lái)看,java?config的應(yīng)用是越來(lái)越廣泛了,在使用java?config的過(guò)程當(dāng)中,我們不可避免的會(huì)有各種各樣的注解打交道,其中,我們使用最多的注解應(yīng)該就是@Autowired注解了。本文就來(lái)聊聊Autowired的底層實(shí)現(xiàn)原理2022-10-10
MyBatis-Plus?updateById更新不了空字符串或null的解決方法
本文主要介紹了MyBatis-Plus?updateById更新不了空字符串或null的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03
Spring FreeMarker整合Struts2過(guò)程詳解
這篇文章主要介紹了Spring FreeMarker整合Struts2過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10
Spring實(shí)現(xiàn)對(duì)象注入的三種方法詳解
這篇文章主要為大家學(xué)習(xí)介紹了Spring中實(shí)現(xiàn)對(duì)象注入的三種常用方法,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的可以了解一下2023-07-07
java調(diào)用webservice的.asmx接口的使用步驟
這篇文章主要介紹了java調(diào)用webservice的.asmx接口的使用步驟,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09

