Hystrix熔断
熔断其实是在降级的基础上引入了重试的机制。当某个时间内失败的次数达到了多少次就会触发熔断机制,具体的流程如下
案例演示
1.创建项目
创建一个普通的SpringCloud项目
2.导入依赖
在基础依赖之外我们只需要导入Hystrix的依赖即可
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix</artifactId> <version>1.3.2.RELEASE</version> </dependency>
3.配置文件修改
配置文件中设置名称,端口及eureka注册
4.启动类
添加对应的注解即可
@EnableCircuitBreaker // 开启熔断 断路器 @EnableEurekaClient @SpringBootApplication public class SpringcloudEurekaConsumerApplication { public static void main(String[] args) { SpringApplication.run(SpringcloudEurekaConsumerApplication.class, args); } }
5.业务层修改
注意@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; } }
6.启动测试
启动provider和consumer访问查看
正常访问,可以从provider获取到数据。
异常访问。获取到的是托底数据,而且我们快速访问的话5秒内都返回的托底数据(同一个请求),5秒后会尝试重试连接,这个测试的细心点可以看到这个效果的