SpringCloud——熔斷器Hystrix(一)
阿新 • • 發佈:2019-01-23
為什麼用熔斷器
假如服務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);
}
}
三 為服務指定預設的失敗方法
這個失敗方式就是當呼叫的服務不可用時,就呼叫這個預設的方法返回。要注意的是,這個預設方法的引數必須和被註解的方法引數保持一致,否則會異常
@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...";
}
測試結果
啟動註冊中心,服務提供者,傳送請求
把服務提供者關閉,再次請求