SpringCloud 斷路器(Hystrix)

介紹

  • 雪崩效應
    在微服務架構中服務與服務之間能夠相互調用,因爲網絡緣由或者自身的緣由,服務並不能保證100%可用,若是單個服務出現問題,調用這個服務就會佔用愈來愈多的系統資源,致使服務癱瘓。因爲服務與服務之間的依賴性,故障會傳播,會對整個微服務系統形成影響,這就是服務故障的「雪崩」效應。
  • 斷路器
    「斷路器」是一種開關裝置,當某個服務發生故障監控(相似熔斷保險絲),向調用方法返回一個備選的響應,而不是長時間的等待或者拋出調用方法沒法處理的異常,這樣就保證了服務調用方的線程不會被長時間、沒必要要地佔用,從而避免了故障在分佈式系統中的蔓延,乃至雪崩。
  • 熔斷模式
    在對某個服務調用不可用達到一個閾值,5秒內20次調用失敗就會就會啓動熔斷模式。熔斷器的開關是由服務的健康情況(服務的健康情況 = 請求失敗數 / 請求總數)決定的。當斷路器開關關閉時請求能夠經過,一但服務器健康情況低於設定閾值斷路器就會打開,請求會被禁止經過。當斷路器處於打開狀態時,一段時間後會進入半開狀態,這時只容許一個請求經過,若是該請求成功熔斷器恢復到關閉狀態,若是調用失敗斷路器繼續保持打開。
  • 服務降級
    服務降級,通常是從總體符合考慮,就是當某個服務熔斷以後,服務器將再也不被調用,此刻客戶端能夠本身準備一個本地的fallback回調,返回一個缺省值。

Ribbon中使用Hystrix

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
         </dependency>
  • 修改HelloServiceRibbonSer類
@Service
public class HelloServiceRibbonSer {
    @Autowired
    RestTemplate restTemplate;

    @HystrixCommand(fallbackMethod = "helloError")
    public String helloServiceRibbon(String helloName) {
        return restTemplate.getForObject("http://say-hello/sayHello?helloName="+helloName,String.class);
    }

    public String helloError(String helloName) {
        return "hello,"+helloName+",error!";
    }
}
@Autowired
    private HelloServiceRibbonSer helloServiceRibbonSer;

    @GetMapping("/ribbonHello")
    public String ribbonHelloCtr(@RequestParam("helloName")String helloName){
        return helloServiceRibbonSer.helloServiceRibbon(helloName);
    }
在helloServiceRibbon方法的頭上加了@HystrixCommand(fallbackMethod = "helloError")註解,表明對這個方法使用了Hystrix相關的功能,fallbackMethod屬性是調用回調以後的處理方法。
  • 修改啓動類
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient //向服務中心註冊
@EnableHystrix //啓動Hystrix
public class ServiceRibbonApplication {

    public static void main(String[] args) {
        SpringApplication.run(ServiceRibbonApplication.class, args);
    }

}
  • 啓動項目
    啓動註冊中心和service-ribbon,不啓動say-hello項目(服務提供者),在瀏覽器地址欄訪問http://localhost:3333/ribbonHello?helloName=aaa發現調用了fallbackMethod中的方法。

Feign中使用Hystrix

@FeignClient(value = "say-hello",fallback = SayHelloFeignSerHiHystric.class)
public interface SayHelloFeignSer {
    @RequestMapping(value = "/sayHello",method = RequestMethod.GET)
    String feignSayHelloSer(@RequestParam(value = "helloName") String helloName);
}
@Component
public class SayHelloFeignSerHiHystric implements SayHelloFeignSer{

    @Override
    public String feignSayHelloSer(String helloName) {
        return "發生錯誤 !"+helloName;
    }
}
  • 修改配置文件
#打開斷路器,D版本以後默認關閉
feign.hystrix.enabled=true
  • 啓動項目
    啓動註冊中心,service-feign,不啓動say-hello項目。在瀏覽器地址欄訪問:http://localhost:4444/feignSayHello?helloName=adaad,發現調用了fallback中的方法。
  • fallbackFactory使用
    若是要熔斷的功能或者業務比較複雜可使用一個工廠來封裝,而後直接使用fallbackFactory來標註。
    修改SayHelloFeignSer
@FeignClient(value = "say-hello",fallbackFactory = HystrixFallBackFactory.class/*fallback = SayHelloFeignSerHiHystric.class*/)
public interface SayHelloFeignSer {
    @RequestMapping(value = "/sayHello",method = RequestMethod.GET)
    String feignSayHelloSer(@RequestParam(value = "helloName") String helloName);
}
public interface UserFeignWithFallBackFactoryClient extends SayHelloFeignSer {
}
@Component
public class HystrixFallBackFactory implements FallbackFactory<SayHelloFeignSer> {
    @Override
    public SayHelloFeignSer create(Throwable throwable) {

        return new SayHelloFeignSer(){

            @Override
            public String feignSayHelloSer(String helloName) {
                return "error";
            }

            @Override
            public String manyParamsSer(String userName, String userPassword) {
                return "error";
            }

            @Override
            public Object objParamsCtr(Object user) {
                return "error";
            }
        };
    }
}
相關文章
相關標籤/搜索