Spring Cloud——Hystrix——服务降级

目录

hystrix:处理分布式系统的延迟和容错的开源库

服务降级:(fallback)

针对服务提供者

1、pom引入

2、主启动类上激活

 3、添加注解,写兜底方法

针对消费者

1、pom引入

2、修改yml

3、主启动

4、添加注解,写兜底方法

 存在问题

 解决问题


hystrix:处理分布式系统的延迟和容错的开源库

服务降级:(fallback)

服务发生故障,需要向客户端立刻返回一个友好的提示

导致服务降级:程序异常、超时、服务熔断、线程池/信号量打满

使用JMeter测试高并发会发现两个测试都会转圈圈

针对服务提供者

1、pom引入

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

2、主启动类上激活

@EnableCircuitBreaker//激活

 3、添加注解,写兜底方法

//服务降级
    @HystrixCommand(fallbackMethod = "payment_timeout_fallback",commandProperties = {
            @HystrixProperty(
                    name = "execution.isolation.thread.timeoutInMilliseconds",value = "2000"//超时时长
            )
    })
    public String payment_timeout(){
        //超时异常
        long timeNum=5;
//        Thread.sleep(timeNum);
        try {
            TimeUnit.SECONDS.sleep(timeNum);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return Thread.currentThread().getName()+"睡眠时长:"+timeNum;

        //运行异常
//        int i=10/0;
//        return String.valueOf(i);
    }
    //兜底方法
    public String payment_timeout_fallback(){
        return Thread.currentThread().getName()+"服务器响应超时或发生错误,请稍后再试!!!";
    }

针对消费者

1、pom引入

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

2、修改yml

  #开启
feign:
  hystrix:
    enabled: true

3、主启动

@EnableHystrix

4、添加注解,写兜底方法

@GetMapping("/consumer/payment/hystrix/timeout")
    @HystrixCommand(fallbackMethod = "payment_timeout_fallback",commandProperties = {
            @HystrixProperty(
                    name = "execution.isolation.thread.timeoutInMilliseconds",value = "1000"//超时时长
            )
    })
    public String payment_err(){
        return paymentHystrixService.payment_err();
    }
    //兜底方法
    public String payment_timeout_fallback(){
        return "对方支付系统繁忙,请稍后再试!!!";
    }

 存在问题

上述方法存在问题,代码膨胀,耦合度高,业务逻辑混乱

 解决问题

使用注解@DefaultProperties+@HystrixCommand解决代码膨胀问题

@RestController
@Slf4j
@DefaultProperties(defaultFallback = "payment_global_fallback")
public class OrderHystrixController {
    @Resource
    private PaymentHystrixService paymentHystrixService;

    @GetMapping("/consumer/payment/hystrix/ok/{id}")
    @HystrixCommand
    public String payment_ok(@PathVariable("id") Integer id){
        int i=10/0;
        return paymentHystrixService.payment_ok(id);
    }

    @GetMapping("/consumer/payment/hystrix/timeout")
    @HystrixCommand(fallbackMethod = "payment_timeout_fallback",commandProperties = {
            @HystrixProperty(
                    name = "execution.isolation.thread.timeoutInMilliseconds",value = "1000"//超时时长
            )
    })
    public String payment_err(){
        return paymentHystrixService.payment_err();
    }
    //兜底方法
    public String payment_timeout_fallback(){
        return "对方支付系统繁忙,请稍后再试!!!";
    }
    public String payment_global_fallback(){
        return "这是全局处理";
    }

实现接口+fallback解耦

@Component
public class PaymentHystrixFallbackService implements PaymentHystrixService{
    @Override
    public String payment_ok(Integer id) {
        return "this is PaymentHystrixFallbackService=====》payment_ok";
    }

    @Override
    public String payment_err() {
        return "this is  PaymentHystrixFallbackService=====》payment_err";
    }
}

@Component
@FeignClient(value = "CLOUD-PROVIDER-HSYTRIX-PAYMENT8001",fallback = PaymentHystrixFallbackService.class)
public interface PaymentHystrixService {
    @GetMapping("/payment/hystrix/ok/{id}")
    public String payment_ok(@PathVariable("id") Integer id);

    @GetMapping("/payment/hystrix/timeout")
    public String payment_err();


}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值