springcloud應用之hystrix

springcloud應用之hystrix

閱讀提示

hystrix項目
請先閱讀feign

hystrix是什麼

Hystrix是一個用於處理分佈式系統的延遲和容錯的開源庫,在分佈式系統裏,許多依賴不可避免的會調用失敗,比
如超時、異常等,Hystrix能夠保證在一個依賴出問題的情況下,不會導致整體服務失敗,避免級聯故障,以提高分
布式系統的彈性。
“斷路器”本身是一種開關裝置,當某個服務單元發生故障之後,通過斷路器的故障監控(類似熔斷保險絲),向調
用方返回一個符合預期的、可處理的備選響應(FallBack),而不是長時間的等待或者拋出調用方無法處理的異
常,這樣就保證了服務調用方的線程不會被長時間、不必要地佔用,從而避免了故障在分佈式系統中的蔓延,乃至
雪崩。

爲什麼需要hystrix

微服務之間的相互調用,調用鏈可能很長,萬一中間有一個微服務掛掉了,大量請求就會累計在掛掉的微服務,導致其他微服務沒有可用資源,基於這種服務雪崩,需要有人站出來,解決這種中途有人掛掉的情況,例如可以用降級方法處理,中途微服務的方法卡住了,出異常了,就跑降級方法返回一個服務繁忙稍後重試,這就是hystrix乾的事,它保證了服務的高可用

如何使用hystrix

對於上面服務雪崩情況hystrix提供了四種解決辦法服務降級,超時,限流,熔斷

啓動類加@EnableHystrix,pom加

 		<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>

降級

	/**
     * 測試降級
     * @return
     */
    @RequestMapping("testDemote")
    @HystrixCommand(fallbackMethod = "testDemoteFallbackMethod")
    public String testDemote(float rate){
        return orderService.queryErrorOrder(rate);
    }
    //降級方法也得加參數,因爲要考慮方法重載
    private String testDemoteFallbackMethod(float rate){
        return "testDemote:服務錯誤,請稍後重試";
    }
	@RequestMapping(value = "errorOrder",method= RequestMethod.GET)
    String queryErrorOrder(@RequestParam("rate") float rate);

超時

	/**
     * 測試超時
     * @param time
     * @return
     */
    @RequestMapping("testOvertime")
    @HystrixCommand(fallbackMethod = "testOvertimeFallbackMethod")
    public String testOvertime(long time) throws InterruptedException {
        //這個休眠爲了簡單就放這,本應放到被調用者的
        Thread.sleep(time);
        return "testOvertime";
    }
    private String testOvertimeFallbackMethod(long time){
        return "testOvertime:服務超時,請稍後重試";
    }

訪問testOvertime接口設置time=2000,會自動跑降級方法,因爲hystrix有默認超時時間1s,這個時間這樣配置

hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 1000

熔斷

其實熔斷,就好像我們生活中的跳閘一樣, 比如說你的電路出故障了,爲了防止出現
大型事故 這裏直接切斷了你的電源以免意外繼續發生, 把這個概念放在我們程序上也是如此, 當一個微服務調用多
次出現問題時(默認是10秒內20次當然 這個也能配置),hystrix就會採取熔斷機制,不再繼續調用你的方法(會
在默認5秒鐘內和電器短路一樣,5秒鐘後會試探性的先關閉熔斷機制,但是如果這時候再失敗一次{之前是20次}
那麼又會重新進行熔斷) 而是直接調用降級方法,這樣就一定程度上避免了服務雪崩的問題.

簡單來說熔斷會保證如果短時間出現大量錯誤,直接走降級,5s恢復不再直接走降級,而是走你的方法邏輯,如果此時再失敗,又會觸發5s時間直接走降級,如此往復。

測試的話可以這樣測testDemote這個接口大概設置錯誤率rate=0.5,不停f5有機會10s出錯20次,然後會發現5s內的f5都是直接降級信息

限流

	/**
     * 測試限流
     * @return
     */
    @RequestMapping("testLimit")
    @HystrixCommand(fallbackMethod="testLimitFallbackMethod",
            threadPoolKey = "testLimit",
            threadPoolProperties ={@HystrixProperty(name = "coreSize",value = "2"),
                    @HystrixProperty(name = "maxQueueSize",value = "1")})
    public String testLimit() throws InterruptedException {
        //這裏設置3000,別忘了yml把超時時間改成大於3000,不然一直超時降級
        Thread.sleep(3000);
        return "testLimit";
    }

    private String testLimitFallbackMethod(){
        return "testLimit:服務限流,請稍後重試";
    }

我方法休眠3s,coreSize=2這兩個信息組合起來的意思是
如果在3s內有超過兩個請求,超出的部分會直接降級,這個測試得多開幾個瀏覽器窗口

hystrix整合feign

如果覺得上面這種方式太複雜,可以試試下面的方法

yml

feign:
  hystrix:
    enabled: true

FeignAndHystrix
這裏千萬注意要把OrderService的@FeignClient(name = “order”)註釋掉,並且把controller用到orderService的地方全註釋,因爲一組微服務只能被@FeignClient一次

@FeignClient(name = "order",fallback = FeignAndHystrixImpl.class)
public interface FeignAndHystrix {
	
    @RequestMapping(value = "errorOrder",method= RequestMethod.GET)
    String queryErrorOrder(@RequestParam("rate") float rate);
}
@Component
public class FeignAndHystrixImpl implements FeignAndHystrix{
    @Override
    public String queryErrorOrder(float rate) {
        return "服務繁忙";
    }
}

調用方式

	@Autowired
    private FeignAndHystrix feignAndHystrix;
    
	@RequestMapping("testFeignAndHystrix")
    public String testFeignAndHystrix(){
       return feignAndHystrix.queryErrorOrder(0.3f);
    }

獲取order微服務的異常

@FeignClient(name = "order",fallbackFactory = FeignAndHystrixFallBackFactory.class)
public interface FeignAndHystrix {
 	@RequestMapping(value = "errorOrder",method= RequestMethod.GET)
    String queryErrorOrder(@RequestParam("rate") float rate);
}
@Component
public class FeignAndHystrixFallBackFactory implements FallbackFactory<FeignAndHystrix> {
    @Override
    public FeignAndHystrix create(Throwable throwable) {
        return new FeignAndHystrix() {
            @Override
            public String queryErrorOrder(float rate) {
                return "服務繁忙:"+throwable;
            }
        };
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章