目录
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