项目的DEMO代码:https://github.com/heyu52/-spring-cloud
在微服务场景中,通常会有很多层的服务调用。如果一个底层服务出现问题,故障会被向上传播给用户。我们需要一种机制,当底层服务不可用时,可以阻断故障的传播。这就是断路器的作用。他是系统服务稳定性的最后一重保障。
Hystrix也是Netflix套件的一部分。他的功能是,当对某个服务的调用在一定的时间内(默认10s,由metrics.rollingStats.timeInMilliseconds配置),有超过一定次数(默认20次,由circuitBreaker.requestVolumeThreshold参数配置)并且失败率超过一定值(默认50%,由circuitBreaker.errorThresholdPercentage配置),该服务的断路器会打开。返回一个由开发者设定的fallback。
我们还是在上一节的代码goodspo中进行修改。
增加引用
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
修改启动类,增加@EnableCircuitBreaker
package com.csdn.GoodsPO;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
@EnableCircuitBreaker
public class GoodsPoApplication {
public static void main(String[] args) {
SpringApplication.run(GoodsPoApplication.class, args);
}
}
homeController 增加方法
private final Random rnd = new Random(System.currentTimeMillis());
@GetMapping("/findOrder/{orderNo}")
@HystrixCommand(fallbackMethod = "findOrderFallback", commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "1000")
})
public String findOrder(@PathVariable String orderNo) throws InterruptedException {
Thread.sleep(rnd.nextInt(2000));
return "订单" + orderNo + " 找到啦!";
}
public String findOrderFallback(String orderNo) {
return "订单查找失败!";
}
这里设置的是当方法执行时间超过1秒时,就触发断路,直接执行方法findOrderFallback
这里要特别提醒,我设设置了网关的超时时间为以下的配置
#设置网关调用超时时间限制
zuul.host.connect-timeout-millis=60000
zuul.host.socket-timeout-millis=60000
ribbon.ReadTimeout=10000
ribbon.ConnectTimeout=10000
因为它默认就是1秒,那我们的熔断就看不到效果了。
启动项目:http://127.0.0.1:8762/goodspo/findOrder/1,多次测试,会得到以下两个结果
这就是断路器的作用。