本文我们来演示下Hystrix中解决雪崩效应的第四种方式熔断的实现
熔断其实是在降级的基础上引入了重试的机制。当某个时间内失败的次数达到了多少次就会触发熔断机制,具体的流程如下
创建一个普通的SpringCloud项目
在基础依赖之外我们只需要导入Hystrix的依赖即可
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
<version>1.3.2.RELEASE</version>
</dependency>
配置文件中设置名称,端口及eureka注册
添加对应的注解即可
@EnableCircuitBreaker // 开启熔断 断路器
@EnableEurekaClient
@SpringBootApplication
public class SpringcloudEurekaConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(SpringcloudEurekaConsumerApplication.class, args);
}
}
注意@HystrixCommand注解的内容
@Service
public class UserService {
/**
* ribbon 负载均衡
* LoadBalancerClient 通过服务名称可以获取对应的服务的相关信息 ip port等
*/
@Autowired
private LoadBalancerClient loadBalancerClient;
@HystrixCommand(fallbackMethod = "fallback",
commandProperties = {
//默认 20 个;10s 内请求数大于 20 个时就启动熔断器,当请求符合熔断条件时将触发 getFallback()。
@HystrixProperty(name= HystrixPropertiesManager.CIRCUIT_BREAKER_REQUEST_VOLUME_THRESHOLD,
value="10"),
//请求错误率大于 50%时就熔断,然后 for 循环发起请求,当请求符合熔断条件时将触发 getFallback()。
@HystrixProperty(name=HystrixPropertiesManager.CIRCUIT_BREAKER_ERROR_THRESHOLD_PERCENTAGE,
value="50"),
//默认 5 秒;熔断多少秒后去尝试请求
@HystrixProperty(name=HystrixPropertiesManager.CIRCUIT_BREAKER_SLEEP_WINDOW_IN_MILLISECONDS,
value="5000"),
})
public List<User> getUsers(Integer id){
System.out.println("--------->"+id);
if(id == 1){
throw new RuntimeException();
}
// ServiceInstance 封装的有服务的基本信息 IP和端口等
ServiceInstance si = this.loadBalancerClient.choose("eureka-ribbon-provider");
StringBuilder sb = new StringBuilder();
sb.append("http://")
.append(si.getHost())
.append(":")
.append(si.getPort())
.append("/user");
System.out.println("服务地址:"+sb.toString());
// SpringMVC RestTemplate
RestTemplate rt = new RestTemplate();
ParameterizedTypeReference<List<User>> type = new ParameterizedTypeReference<List<User>>() {};
// ResponseEntity:封装了返回值的信息
ResponseEntity<List<User>> response = rt.exchange(sb.toString(), HttpMethod.GET,null,type);
List<User> list = response.getBody();
return list;
}
/**
* 服务降级
* 返回托底数据的方法
* @return
*/
public List<User> fallback(Integer id){
List<User> list = new ArrayList<>();
list.add(new User(3,"我是托底数据",22));
return list;
}
}
启动provider和consumer访问查看
正常访问,可以从provider获取到数据。
异常访问。获取到的是托底数据,而且我们快速访问的话5秒内都返回的托底数据(同一个请求),5秒后会尝试重试连接,这个测试的细心点可以看到这个效果的