Spring?Cloud?Hystrix?服務(wù)降級(jí)限流策略詳解
前言
前面說到在我們應(yīng)對(duì)高并發(fā)的場(chǎng)景,請(qǐng)求量過于大的情況下給我們服務(wù)器的壓力很多,造成緩存穿透、擊穿、雪崩,那么我們采用布隆過濾器,有興趣的小伙伴可以去看看上篇文章,關(guān)于布隆過濾器的解析。Redis處理高并發(fā)之布隆過濾器
我們要從根源上解決問題,比如一個(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作為開源庫,以斷路器的角色存在著。
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 = { //超過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)文章
Java8新特性之深入解析日期和時(shí)間_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Java8新特性之深入解析日期和時(shí)間_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理,需要的朋友可以參考下2017-06-06關(guān)于HashMap相同key累加value的問題
這篇文章主要介紹了關(guān)于HashMap相同key累加value的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05SpringMVC?RESTFul實(shí)體類創(chuàng)建及環(huán)境搭建
這篇文章主要為大家介紹了SpringMVC?RESTFul實(shí)體類創(chuàng)建及環(huán)境搭建詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05SpringBoot+SpringBatch+Quartz整合定時(shí)批量任務(wù)方式
這篇文章主要介紹了SpringBoot+SpringBatch+Quartz整合定時(shí)批量任務(wù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09如何基于Jenkins構(gòu)建Jmeter項(xiàng)目
這篇文章主要介紹了如何基于Jenkins構(gòu)建Jmeter項(xiàng)目,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09