目錄
2、啓動類上加註解【服務調用方 】@EnableCircuitBreaker
服務熔斷
當某服務出現不可用或響應超時的情況時,爲了防止整個系統出現雪崩,暫時停止對該服務的調用。
服務降級
服務降級是從整個系統的負荷情況出發和考慮的,對某些負荷會比較高的情況,爲了預防某些功能(業務場景)出現負荷過載或者響應慢的情況,在其內部暫時捨棄對一些非核心的接口和數據的請求,而直接返回一個提前準備好的fallback(退路)錯誤處理信息。這樣,雖然提供的是一個有損的服務,但卻保證了整個系統的穩定性和可用性。【空閒出線程或資源】
共同點:保證了整個系統的穩定性和可用性
不同點:熔斷一般是下行程序故障,服務降級是爲了解決整體項目的負荷
熔斷器
三個狀態:打開、半打開、關閉
默認情況,在最近的20次請求中出現50%超時的情況,會斷開服務。如果仍有請求則會直接返回失敗信息fallback,該服務默認情況下會在關閉狀態持續5S,之後會放行一定的請求進入半打開狀態,如果放行的請求出現超時情況,重新進入關閉狀態。
Hystrix熔斷器的使用【在服務調用方配置】
1、引入依賴
<!--hystrix-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
2、啓動類上加註解【服務調用方 】@EnableCircuitBreaker
@EnableCircuitBreaker // 服務熔斷
@EnableDiscoveryClient // 內部既能兼容eurake又能兼容zookeeper
@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})
//@SpringCloudApplication
public class ConsumerApplication {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class);
}
}
3、配置降級策略
3.1、方法級別標註服務降級
@RestController
@RequestMapping("consumer")
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
@HystrixCommand(fallbackMethod = "queryByIdFallback")
public String queryById(@PathVariable("id")BigDecimal id){
String url = "http://user-service/user/" + id;
String user = restTemplate.getForObject(url, String.class);
return user;
}
public String queryByIdFallback(BigDecimal id){
return "服務器忙";
}
}
3.2、類級別默認降級策略
a.@DefaultProperties(defaultFallback = "queryByIdFallback")
b.queryByIdFallback方法此時不能寫參數,返回值也不用一致
@RestController
@RequestMapping("consumer")
@DefaultProperties(defaultFallback = "queryByIdFallback")
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
@HystrixCommand(commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "2000")
})
public String queryById(@PathVariable("id")BigDecimal id){
String url = "http://user-service/user/" + id;
String user = restTemplate.getForObject(url, String.class);
return user;
}
public String queryByIdFallback(){
return "服務器忙";
}
}
4、實現效果
觸發熔斷的最小請求次數10
觸發熔斷的失敗請求次數最小佔比60
休眠時長10S