Spring Cloud(三):斷路器 Hystrix

一、Hystrix簡介

在微服務架構中,根據業務來拆分成一個個的服務,服務與服務之間可以相互調用(RPC),在Spring Cloud可以用RestTemplate+Ribbon和Feign來調用。爲了保證其高可用,單個服務通常會集羣部署。由於網絡原因或者自身的原因,服務並不能保證100%可用,如果單個服務出現問題,調用這個服務就會出現線程阻塞,此時若有大量的請求涌入,Servlet容器的線程資源會被消耗完畢,導致服務癱瘓。服務與服務之間的依賴性,故障會傳播,會對整個微服務系統造成災難性的嚴重後果,這就是服務故障的“雪崩”效應。爲了解決這個問題,業界提出了斷路器模型。

作用:斷路器,保護系統,控制故障範圍。
Netflix開源了Hystrix組件,實現了斷路器模式,SpringCloud對這一組件進行了整合。 在微服務架構中,通常有多層服務調用。

較低級別的服務中的服務故障可能導致用戶級聯故障。當對特定服務的呼叫達到一定閾值時(Hystrix中的默認值爲5秒內的20次故障),電路打開,不進行通話。在錯誤和開路的情況下,開發人員可以提供後備。

斷路打開後,可用避免連鎖故障,fallback方法可以直接返回一個固定值。

二、Feign中使用斷路器

1.Feign自帶斷路器,在D版本的Spring Cloud之後,沒有默認打開。需在application.yml中配置打開:

#Feign自帶斷路器
feign:
  hystrix:
    enabled: true

2.基於上一篇的demo_eureka_feign項目繼續開發,只需在service層下的的SchedualServiceHi接口的註解中加上fallback的指定類即可:

package com.example.demo_eureka_feign.service;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

/**
 * 定義一個feign接口,通過@ FeignClient(“服務名”),來指定調用哪個服務。
 * 比如在代碼中調用了eureka-client-zyy-demo服務的“/hi”接口.
 */
@FeignClient(value = "eureka-client-zyy-demo",fallback = SchedualServiceHiHystric.class)
public interface SchedualServiceHi {

    @RequestMapping(value = "/hi",method = RequestMethod.GET)
    String sayHiFromClientOne(@RequestParam(value = "name") String name);

}

3.需要創建一個fallback指定的類SchedualServiceHiHystric,需要實現SchedualServiceHi 接口,並注入到Ioc容器中:

package com.example.demo_eureka_feign.service;

import org.springframework.stereotype.Component;

@Component
public class SchedualServiceHiHystric implements SchedualServiceHi {
    @Override
    public String sayHiFromClientOne(String name) {
        return "sorry "+name;
    }
}

4.啓動servcie-feign工程,不要啓動eureka-client-zyy-demo工程,瀏覽器打開http://localhost:8765/hi?name=forezp,顯示:

    sorry forezp

  啓動eureka-client-zyy-demo工程,再次訪問,瀏覽器顯示:

hello forezp ,I am from port:8762

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章