【520,送你一个降级小能手】--【名企大厂必备手册】Hystrix服务降级详细说明

前言:

本篇博客主要是通过注解的形式进行服务降级,通过demo展示,巩固自己的技术掌握,同时为大家提供参考方案:


@HystrixCommand

设置自身调用超时时间的峰值,峰值内可以正常运行,超过了需要有兜底的方法处理,作服务降级fallback,(我们要知道一旦调用服务方法失败并抛出了错误信息后,会自动调用@HystrixCommand标注好的fallbackMethod调用类中的指定的方法)

服务提供者

修改业务类:
【520,送你一个降级小能手】--【名企大厂必备手册】Hystrix服务降级详细说明_第1张图片

package com.zcw.springcloud.service;

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import org.springframework.stereotype.Service;

import java.util.concurrent.TimeUnit;

/**
 * @ClassName : PaymentService
 * @Description :
 * @Author : Zhaocunwei
 * @Date: 2020-05-19 15:48
 */
@Service
public class PaymentService {

    public String paymentInfo_OK(Integer id){
        return "线程池: "+ Thread.currentThread().getName()+"         paymentInfo_OK,id:"+id+"\t"+"O(∩_∩)O哈哈~";
    }

    @HystrixCommand(fallbackMethod ="paymentInfo_TimeOutHandler" ,commandProperties = {
            @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value = "3000")
    })
    public String paymentInfo_TimeOut(Integer  id){
        try {
            TimeUnit.SECONDS.sleep(5);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return " 线程池:   "+Thread.currentThread().getName()+" paymentInfo_TimeOut,id:"+id+"\t"+"O(∩_∩)O哈哈~"+ "耗时3秒钟";
    }
    public String paymentInfo_TimeOutHandler(Integer id ){
        return "线程池:"+Thread.currentThread().getName()+"paymentInfo_TimeOutHandler,id: "+ id+"\t"+"┭┮﹏┭┮";
    }
}


修改启动类:进行激活

@EnableCircuitBreaker

【520,送你一个降级小能手】--【名企大厂必备手册】Hystrix服务降级详细说明_第2张图片

  • 测试
    【520,送你一个降级小能手】--【名企大厂必备手册】Hystrix服务降级详细说明_第3张图片
    【520,送你一个降级小能手】--【名企大厂必备手册】Hystrix服务降级详细说明_第4张图片
    通过如上截图,发现兜底方法已经触发了,进行了超时的设置。
    【520,送你一个降级小能手】--【名企大厂必备手册】Hystrix服务降级详细说明_第5张图片

服务使用者

客户端降级保护:一般服务降级设置到客户端

  • 修改YML文件
    【520,送你一个降级小能手】--【名企大厂必备手册】Hystrix服务降级详细说明_第6张图片
feign:
  hystrix:
    enabled: true

  • 修改启动类:
@EnableHystrix

【520,送你一个降级小能手】--【名企大厂必备手册】Hystrix服务降级详细说明_第7张图片

  • 修改controller类:
    【520,送你一个降级小能手】--【名企大厂必备手册】Hystrix服务降级详细说明_第8张图片
 @GetMapping("/consumer/payment/hystrix/timeout/{id}")
    @HystrixCommand(fallbackMethod = "paymentTimeOutFallbackMethod",commandProperties = {
            @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value = "1500")
    })
    public String paymentInfo_TimeOut(@PathVariable("id") Integer id){
        return paymentHystrixService.paymentInfo_TimeOut(id);
    }
    public String paymentTimeOutFallbackMethod(@PathVariable("id") Integer id){
        return "消费者兜底方法┭┮﹏┭┮";
    }

  • 测试
    【520,送你一个降级小能手】--【名企大厂必备手册】Hystrix服务降级详细说明_第9张图片
    【520,送你一个降级小能手】--【名企大厂必备手册】Hystrix服务降级详细说明_第10张图片

总结

我们上面的demo,是通过服务提供者这边与使用服务者这两个地方进行分别配置的我们服务降级策略,虽然上面只是一个demo展示,但是代码里面耦合度非常的高,在实际的项目开发中,进行不要把业务代码与我们兜底的方法融合一个类中,如果我们每个一个方法,都有一个兜底的方法,最后整个类,代码太膨胀了,臃肿不堪。

  • 归结一下:
    【1】每个业务方法对应一个兜底的方法,代码膨胀。
    【2】统一和自定义的需要我们后期分开

    解决每个方法配置一个兜底方法的膨胀策略:

    • fegin 接口系列
      配置全局通用的兜底方法:
      【520,送你一个降级小能手】--【名企大厂必备手册】Hystrix服务降级详细说明_第11张图片
      【520,送你一个降级小能手】--【名企大厂必备手册】Hystrix服务降级详细说明_第12张图片
      【520,送你一个降级小能手】--【名企大厂必备手册】Hystrix服务降级详细说明_第13张图片
    • 测试
      【520,送你一个降级小能手】--【名企大厂必备手册】Hystrix服务降级详细说明_第14张图片
      解决代码耦合度高的问题:使用Feign的Fallback方法
      • 创建一个类:

package com.zcw.springcloud.service;

import org.springframework.stereotype.Component;

/**
 * @ClassName : PaymentFallbackService
 * @Description :
 * @Author : Zhaocunwei
 * @Date: 2020-05-20 17:46
 */
@Component
public class PaymentFallbackService implements PaymentHystrixService {
    @Override
    public String paymentInfo_OK(Integer id) {
        return "PaymentFallbackService ------- fall back ,┭┮﹏┭┮";
    }

    @Override
    public String paymentInfo_TimeOut(Integer id) {
        return "PaymentFallbackService ------- fall back ,┭┮﹏┭┮";
    }
}


  • 配置兜底类
    把我们上面刚创建的类配置到,下面的类中:
    【520,送你一个降级小能手】--【名企大厂必备手册】Hystrix服务降级详细说明_第15张图片
package com.zcw.springcloud.service;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

/**
 * @ClassName : PaymentHystrixService
 * @Description :
 * @Author : Zhaocunwei
 * @Date: 2020-05-19 17:20
 */
@Component
@FeignClient(value = "CLOUD-PROVIDER-HYSTRIX-PAYMENT",fallback = PaymentFallbackService.class)
public interface PaymentHystrixService {
    @GetMapping("/payment/hystrix/ok/{id}")
    String paymentInfo_OK(@PathVariable("id") Integer id);

    @GetMapping("/payment/hystrix/timeout/{id}")
    String paymentInfo_TimeOut(@PathVariable("id")Integer id);
}



  • 测试
    【520,送你一个降级小能手】--【名企大厂必备手册】Hystrix服务降级详细说明_第16张图片
    关闭服务提供者,然后我们再次测试,查看是否有兜底策略:
    【520,送你一个降级小能手】--【名企大厂必备手册】Hystrix服务降级详细说明_第17张图片

你可能感兴趣的:(Spring,#)