码迷,mamicode.com
首页 > 其他好文 > 详细

13.Hystrix服务降级

时间:2021-03-29 12:33:12      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:ring   全局配置   trace   public   它的   enc   ble   acl   org   

一个接口对外提供服务,在某些特殊的场景下需要服务降级,这些场景包括:

1)当前服务响应太慢,超过某个时间的限制后

2)当前服务出现了异常

所谓的降级就是出现这些异常的时候,需要用另外一个方法来处理这些异常,最后用正确的方式对外。所以这里的降级和系统全局异常处理是两个概念,这里降级后对外就是一个正常的返回。

1.依赖,其中eureka-client是因为一般这样的服务需要在微服务体系中,所以加上它

    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
    </dependency>

    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>

2.配置 

server:
  port: 8005

spring:
  application:
    name: cloud-payment-hystrix-service

eureka:
  client:
    #false 表示是否将自己注册金eureka 默认true
    register-with-eureka: true
    #false 表示是否让eureka服务端抓取自己的注册信息,默认是true,集群必须设置为true 才能配合ribbon负载均衡
    fetch-registry: true
    service-url:
      #设置与eureka 交互的地址查询服务 和注册服务都需要依赖这个地址
      defaultZone: http://localhost:7001/eureka

  

3-1)接下来的部分就需要区分是服务的生产者还是消费者,如果这个服务是生产者,那么一般它不需要用的feign,那么它的启动类如下,且配置就是第2点的配置就好了

@SpringBootApplication
@EnableEurekaClient
@EnableCircuitBreaker
public class HystrixMain8005 {

  public static void main(String[] args) {
    SpringApplication.run(HystrixMain8005.class,args);
  }

}

3-2)如果这个服务是消费者,也就是该服务中用到了feign,那么它的启动类如下

@SpringBootApplication
@EnableFeignClients
@EnableHystrix
public class HystrixOrderMain7006 {

  public static void main(String[] args) {
    SpringApplication.run(HystrixOrderMain7006.class,args);
  }

}

  且配置中增加

feign:
  hystrix:
    enabled: true

  

4.单个方法的降级

1)系统异常的降级

  @HystrixCommand(fallbackMethod = "paymentTimeoutHandler")
  public String paymentTimeout(String id){
    int value = 19/0;
    return "线程池"+Thread.currentThread().getName()+"paymentTimeout 调用成功";
  }

  //服务降级,超时或者异常才产生降级,且超时是可配置的
  //参数不可少,不然系统认为找不到降级方法
  public String paymentTimeoutHandler(String id){
    return "8005调用超时或者系统异常";
  }

  注意降级方法的参数一定要和原有的方法一致,不然降级出现异常

2)系统响应超时的降级,这种里面同时包含了系统异常的降级,这里的超时时间配置的是5秒

@HystrixCommand(fallbackMethod = "paymentTimeoutHandler",commandProperties = {
      @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value = "5000")
  })
  public String paymentTimeout(String id){
    int timeout = 3000;
    try {
      Thread.sleep(timeout);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    //int value = 19/0;
    return "线程池"+Thread.currentThread().getName()+"paymentTimeout"+id+"超时"+timeout+"秒";
  }

  //服务降级,超时或者异常才产生降级,且超时是可配置的
  //参数不可少,不然系统认为找不到降级方法
  public String paymentTimeoutHandler(String id){
    return "8005调用超时或者系统异常";
  }

5.全局的降级配置

单个方法的降级当数量多了以后配置起来麻烦,这时候可以配置一个全局降级处理

1)把配置转移到类上

@Component
@DefaultProperties(defaultFallback = "overallHandler",commandProperties = {
    @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value = "2000")
})
public class PaymentService {

2)方法上的注解换成不带参数的

  @HystrixCommand
  public String paymentTimeout2(String id){
    int timeout = 3000;
    //int index = 10/0;
    try {
      Thread.sleep(timeout);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    return "线程池"+Thread.currentThread().getName()+"paymentTimeout"+id+"超时"+timeout/1000+"秒";
  }

3)添加全局配置的降级处理方法

  public String overallHandler(){
    return "这里是全局超时或者异常处理";
  }

  注意点:

   -1)全局降级配置在类上,它的生效范围就是当前类上,我想应该有整个系统的配置,有时间可以去研究下

   -2)全局的降级处理类overallHandler这个方法不需要带参数,这点和单个方法降级处理不一样

 

6.针对消费者使用feign的情况时,对feignClient下的所有接口做统一降级处理

这种情况就和前两种不一样,不需要用前两种的知识,只需要我们创建一个类去实现feignClient对应接口

@Component
@FeignClient(value = "CLOUD-PAYMENT-HYSTRIX-SERVICE",fallback = HystrixPaymentFallbackService.class)
public interface HystrixPaymentService {

  @GetMapping("hystrix/paymentOk/{id}")
  String paymentOk(@PathVariable("id") String id);

  @GetMapping("hystrix/paymentTimeout/{id}")
  public String paymentTimeout(@PathVariable("id") String id);
}
@Component
public class HystrixPaymentFallbackService implements HystrixPaymentService{

  @Override
  public String paymentOk(String id) {
    return "CLOUD-PAYMENT-HYSTRIX-SERVICE paymentOk 调用异常";
  }

  @Override
  public String paymentTimeout(String id) {
    return "CLOUD-PAYMENT-HYSTRIX-SERVICE paymentTimeout 调用异常";
  }
}

  这里说明下,3种情况会触发到降级里面

1)服务的生产者宕机

2)服务的生产者调用出现异常

3)调用超时,这里的超时是根据配置来看的,没有配置的话,默认一秒,配置如下

ribbon:
  ReadTimeout: 2000
  ConnectTimeout: 2000

  

最后总结下:

1.不管是消费者还是生产者,都可以对自己的服务进行降级处理

2.对于使用feign去调用别人的时候,降级处理方式有些不一样(启动类,配置)

 

13.Hystrix服务降级

标签:ring   全局配置   trace   public   它的   enc   ble   acl   org   

原文地址:https://www.cnblogs.com/johnzhao/p/14586424.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!