SpringCloud的服务降级

moran
2021-01-25 / 0 评论 / 12 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2021年04月14日,已超过59天没有更新,若内容或图片失效,请留言反馈。

SpringCloud

Hystrix

分布式系统面临的问题

Hystrix简介


Hystrix重要概念

服务降级


当某个服务响应时间超过一定时,就返回兜底的结果。
可以使用@HystrixCommand注解

@HystrixCommand(fallbackMethod = "paymentInfo_TimeoutHandler",commandProperties = {
            @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "3000")
    })
    public String paymentInfo_Timeout(Integer id){
        int timeNumber = 5;
        try{
            TimeUnit.SECONDS.sleep(timeNumber);
        }catch(InterruptedException e){
            e.printStackTrace();
        }
        return "线程池:"+Thread.currentThread().getName()+"paymentInfo_Timeout,id:  "+id+"O(∩_∩)O哈哈~"+"耗时(秒)"+timeNumber;
    }

    public String paymentInfo_TimeoutHandler(Integer id){
        return "线程池:"+Thread.currentThread().getName()+"paymentInfo_TimeoutHandler,id:  "+id+"o(╥﹏╥)o";
    }

启用@HystrixCommand注解需要在启动类上加上@EnableCircuitBreaker注解

package com.atguigu.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication
@EnableEurekaClient
@EnableCircuitBreaker
public class PaymentHystrixMain8001 {
    public static void main(String[] args) {
        SpringApplication.run(PaymentHystrixMain8001.class,args);
    }
}

当服务配置hystrix的服务降级后

@HystrixCommand(fallbackMethod = "paymentInfo_TimeoutHandler",commandProperties = {
            @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "3000")
    })
    public String paymentInfo_Timeout(Integer id){
        // int timeNumber = 5;
        int a = 10/0;
        // try{
        //     TimeUnit.SECONDS.sleep(timeNumber);
        // }catch(InterruptedException e){
        //     e.printStackTrace();
        // }
        return "线程池:"+Thread.currentThread().getName()+"paymentInfo_Timeout,id:  "+id+"O(∩_∩)O哈哈~"+"耗时(秒)";
    }

    public String paymentInfo_TimeoutHandler(Integer id){
        return "线程池:"+Thread.currentThread().getName()+"系统繁忙或者运行报错,请稍后再试,id:  "+id+"\to(╥﹏╥)o";
    }

不管是服务超时还是服务异常,都会进入兜底方法。

在有OpenFeign的依赖下,需要通过配置文件开启服务降级功能。

server:
  port: 80
eureka:
  client:
    register-with-eureka: true    #表识不向注册中心注册自己
    fetch-registry: true   #表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka/

spring:
  application:
    name: cloud-provider-hystrix-order
feign:
  hystrix:
    enabled: true

在主启动类上使用注解@EnableHystrix开启hystrix

package com.atguigu.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;
import org.springframework.cloud.openfeign.EnableFeignClients;

@SpringBootApplication
@EnableFeignClients
@EnableHystrix
public class OrderHystrixMain80 {
    public static void main(String[] args) {
        SpringApplication.run(OrderHystrixMain80.class,args);
    }
}

注意:服务降级通常用于消费端

代码膨胀问题

每个方法都有一个兜底方法,那么就会造成代码膨胀的问题。
解决:

  • 使用全局配置兜底方法
@DefaultProperties(defaultFallback = "payment_Global_FallbackMethod")
public class OrderHystrixController {

    @GetMapping("/consumer/payment/hystrix/timeout/{id}")
    // @HystrixCommand(fallbackMethod = "paymentTimeOutFallbackMethod",commandProperties = {
    //         @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "1500")  //3秒钟以内就是正常的业务逻辑
    // })
        @HystrixCommand
    public String paymentInfo_TimeOut(@PathVariable("id") Integer id){
        String result = paymentHystrixService.paymentInfo_Timeout(id);
        return result;
    }
    
     // 全局兜底
    public String payment_Global_FallbackMethod(){
        return "Global异常处理信息,请稍后再试,/(ToT)/~~";
    }
}

业务逻辑混乱

兜底方法和业务逻辑方法写在一个类中,显得代码很混乱
解决

  • 该类继承自该接口,实现其方法
    ![](https://moran.pblog.top/usr/uploads/2021/01/1879256706.png)
    其方法会成为兜底方法。
    这样就解决了代码混乱的问题。

服务熔断

服务限流

0

评论 (0)

取消