1. 程式人生 > >SpringCloud——熔斷器Hystrix(一)

SpringCloud——熔斷器Hystrix(一)

官網說明
演示程式碼

為什麼用熔斷器

假如服務A呼叫了服務B,服務B又呼叫了服務C,如果服務C發生異常或者其他原因導致服務C不可用,那麼導致服務B,不可用,又導致服務A不可用。如果服務C是個很底層的服務,那麼引起的其他不可用的服務可能就有很多,導致服務雪崩。而熔斷器相當於一個服務的保護開關,如果某個服務不可用,那麼這個開關開啟,返回一個設定好的靜態資料,或者空,或者另外一個被熔斷器保護的服務。當發生錯誤的服務恢復後,開關就自動關閉,這樣就不會導致大範圍的服務不可用。

如何做

這裡,我們先展示第一種方式的使用,第二種方式下一次在討論。

如何做

一新增依賴

因為如果服務不可用,那麼對不可用的服務的處理只能在呼叫端處理。所以,我們沿用之前的例子,在消費者工程中新增依賴

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

只需新增改依賴就可以了。

二 修改入口類

我們需要讓工程開啟熔斷器的支援,在主類中添加註解@EnableCircuitBreaker


@Configuration
@ComponentScan(basePackages = "com.lzw.**"
) @EnableAutoConfiguration @EnableFeignClients(basePackages = "com.lzw.**") @EnableCircuitBreaker public class SpringCloudCustomerApplication { public static void main(String[] args) { SpringApplication.run(SpringCloudCustomerApplication.class, args); } }

三 為服務指定預設的失敗方法

這個失敗方式就是當呼叫的服務不可用時,就呼叫這個預設的方法返回。要注意的是,這個預設方法的引數必須和被註解的方法引數保持一致,否則會異常

@HystrixCommand 只能用在方法上。

@PostMapping("/study/")
@HystrixCommand(commandProperties = {
            //可以這麼設定
            @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "5000"),
    },
            //也可以這樣設定
            threadPoolProperties = {
                   /* @HystrixProperty(name = "coreSize", value = "30"),
                    @HystrixProperty(name = "maxQueueSize", value = "101"),
                    @HystrixProperty(name = "keepAliveTimeMinutes", value = "2"),
                    @HystrixProperty(name = "queueSizeRejectionThreshold", value = "15"),*/
                    @HystrixProperty(name = "metrics.rollingStats.numBuckets", value = "20"),
                    @HystrixProperty(name = "metrics.rollingStats.timeInMilliseconds", value = "10000")
            },fallbackMethod = "defaultStudy")
  public String study(@RequestBody  String name){
       return study.study(name);
   }
   //如果引數與sdudy引數不一致,報錯
   public String defaultStudy1(){
       return "study...";
   }

   public String defaultStudy(@RequestBody  String name){
       return "study...";
   }

測試結果

啟動註冊中心,服務提供者,傳送請求
這裡寫圖片描述

把服務提供者關閉,再次請求
這裡寫圖片描述