【springcloud】Spring Cloud Hystrix 斷路器

Hystrix “豪豬”,具有自我保護的能力。hystrix 通過如下機制來解決雪崩效應問題。

在微服務架構中,我們把每個業務都拆成了單個服務模塊,然後當有業務需求時,服務間可互相調用,但是,由於網絡原因或者其他一些因素,有可能出現服務不可用的情況,當某個服務出現問題時,其他服務如果繼續調用這個服務,就有可能出現線程阻塞,但如果同時有大量的請求,就會造成線程資源被用完,這樣就可能會導致服務癱瘓,由於服務間會相互調用,很容易造成蝴蝶效應導致整個系統宕掉。因此,就有人提出來斷路器來解決這一問題。

資源隔離:包括線程池隔離和信號量隔離,限制調用分佈式服務的資源使用,某一個調用的服務出現問題不會影響其他服務調用。

降級機制:超時降級、資源不足時(線程或信號量)降級,降級後可以配合降級接口返回託底數據。

熔斷:當失敗率達到閥值自動觸發降級(如因網絡故障/超時造成的失敗率高),熔斷器觸發的快速失敗會進行快速恢復。

緩存:提供了請求緩存、請求合併實現。

 

Hystrix服務降級,其實就是線程池中單個線程障處理,防止單個線程請求時間太長,導致資源長期被佔有而得不到釋放,從而導致線程池被快速佔用完,導致服務崩潰。
Hystrix能解決如下問題
1.請求超時降級,線程資源不足降級,降級之後可以返回自定義數據
2.線程池隔離降級,分佈式服務可以針對不同的服務使用不同的線程池,從而互不影響
3.自動觸發降級與恢復
4.實現請求緩存和請求合併

 

springBoot使用的是2.0.2.RELEASE版本 springCloud使用的是Finchley.RELEASE版本。

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

在啓動類加上@EnableCircuitBreaker註解

//@SpringBootApplication
//@EnableDiscoveryClient
//@EnableCircuitBreaker

這三個註解相當於一個@SpringCloudApplication

 

@EnableFeignClients
//@SpringBootApplication
//@EnableDiscoveryClient
//@EnableCircuitBreaker
@SpringCloudApplication
public class OrderApplication {

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

設置斷路器超時時間(默認1s)

feign:
  hystrix: 
    enabled: true

  client:
    config:
      default:
        connectTimeout: 5000
        readTimeout: 5000

1.在方法的頭上加了@HystrixCommand(fallbackMethod = "hystrixMethod")註解,
代表對這個方法使用了Hystrix相關的功能,fallbackMethod屬性是調用回調之後的處理方法。

默認設置了5s超時: 

    @GetMapping("/test")
    @HystrixCommand(fallbackMethod = "hystrixMethod")
    public String test(){
        try {
            Thread.sleep(6000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "ok";
    }

    public String hystrixMethod(){
        return "請稍後再試";
    }

 

2.Feign是自帶斷路器的,只需要在FeignClient的接口的註解中加上fallback的指定類就行了。

@FeignClient(name = "product", fallback = OrderHystrix.class)
public interface OrderClient {

    @GetMapping("/product/list")
    public String getProductInfo();
}
@Component
public class OrderHystrix implements OrderClient {

    @Override
    public String getProductInfo() {
        return "商品服務忙,稍後再試。。。";
    }
}

 

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