简介
断路器Hystrix是容错管理工具,作用是通过隔离、控制服务从而对延迟和故障提供更强大的容错能力。在微服务中,服务与服务之间的接口调用可能会出现问题。断路器可以在这个时候发挥作用
隔离实现:Hystrix使用命令命令模式HystrixCommand包装依赖调用逻辑,每个命令在单线程中执行。可以配置超时阈值,在超过阈值时fallback逻辑。对每一次的调用结果,包括异常、拒绝、超时、短路执行时执行fallback(降级)逻辑。并且提供熔断器组件,可以自动运行或调用。
Hystrix断路器的依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
</dependency>
启动类中使用@EnableCircuitBreaker ,开启熔断处理功能。
@SpringBootApplication
@EnableDiscoveryClient //表示Eureka的客户端
@EnableCircuitBreaker //开启熔断处理功能
@EnableFeignClients
public class OrderserviceApplication {
public static void main(String[] args) {
SpringApplication.run(OrderserviceApplication.class, args);
}
@Bean
@LoadBalanced
RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
由于服务发现主要用的是RestTemplate和@FeignClient两种方式的熔断处理。
RestTemplate熔断实现
涉及的服务:eureka、order-service、product-service。在order-service中做熔断处理。调用product-service的接口
RestTemplate的熔断处理主要是在服务调用的方法计入注解@HystrixCommand,并且指定(fallbackmethod)服务调用失败、超时时的处理方法。例如:
@HystrixCommand(fallbackMethod = "productServiceFallback")
public Object hystrixTest(){
return restTemplate.getForEntity("http://product-service/product-service/hello", String.class).getBody();
}
public Object productServiceFallback(){
return "product-service/hello接口调用失败";
}
这样当调用其他的服务失败时,就会调用productServiceFallback()方法。
测试以下,把eureka服务和其他两个服务都起起来。通过postman调用接口。
正常时:
现在把product-service停掉,再测试。可以看到,调用失败的时候就会调用熔断处理方法,返回指定内容。
FeignClient熔断实现
@FeignClient的方法实现熔断处理。首先需要在注解中加入属性fallback。值为class,指定熔断处理的实现类。实现类实现了@FeignClient注释的接口。实现每一个方法,在接口调用失败时就会调用对应的方法。
例如写一个接口ProductServiceFeign.java
@FeignClient(name = "product-service", path = "/product-service", fallback = ProductServiceFeignHystrix.class)
public interface ProductServiceFeign {
@RequestMapping(value = "/hello2", method = RequestMethod.GET)
String hello();
@RequestMapping(value = "/hello3", method = RequestMethod.POST)
ReturnBean hello1(QueryBean bean);
}
写实现类ProductServiceFeignHystrix.java
@Component
public class ProductServiceFeignHystrix implements ProductServiceFeign {
@Override
public String hello() {
return "/hello2 - 接口欧调用失败";
}
@Override
public ReturnBean hello1(QueryBean bean) {
ReturnBean returnBean = new ReturnBean();
returnBean.setLocation( "product-service3接口代用失败,参数:" + JSONObject.toJSONString(bean));
return returnBean;
}
}
@FeignClient服务发现需要导入依赖。并在启动类中加入@EnableFeignClients,开启服务发现。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
测试一下,正常的情况下。
停掉product-service,再测试。可以知道接口调用失败之后就会进入处理类。
以上就是RestTemplate和FeignClient的熔断处理简要实现。具体的例子我已经上传。需要的朋友可以看一下。