当前位置: 移动技术网 > IT编程>开发语言>Java > Hystrix(一)---服务降级(基础案例)

Hystrix(一)---服务降级(基础案例)

2020年07月17日  | 移动技术网IT编程  | 我要评论

一,高并发测试

模块生产者8001的pom.xml

<dependencies>
        <!--hystrix-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
        <!--eureka client-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <!--web-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.1.0</version>
        </dependency>
    </dependencies>

application.yml

server:
  port: 8001

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

eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka

PaymentService

@Service
public class PaymentService {

    //正常访问
    public String paymentIndo_OK(Integer id) {
        return "线程池:" + Thread.currentThread().getName() + "paymentIndo_OK,id" + id + "\t" + "O(∩_∩)O哈哈~";
    }
    //延时访问
    public String paymentIndo_TimeOut(Integer id) {
        try {
            TimeUnit.SECONDS.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "线程池:" + Thread.currentThread().getName() + "paymentIndo_TimeOut,id" + id + "\t" + "O(∩_∩)O哈哈~";
    }
}

PaymentController

@RestController
public class PaymentController {

    @Resource
    private PaymentService paymentService;

    @Value("${server.port}")
    private String serverport;

    @GetMapping("/payment/htstrix/ok/{id}")
    public String paymentIndo_OK(@PathVariable("id") Integer id){
        String s = paymentService.paymentIndo_OK(id);
        return s;
    }

    @GetMapping("/payment/htstrix/timeout/{id}")
    public String paymentIndo_TimeOut(@PathVariable("id") Integer id){
        String s = paymentService.paymentIndo_TimeOut(id);
        return s;
    }
}

启动类PaymentHystrixMain8001

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

模块消费者80的PaymentHystrixService

@Component
@FeignClient(value = "CLOUD-PROVIDER-HYSTRIX-PAYMENT")
public interface PaymentHystrixService {

    @GetMapping("/payment/htstrix/ok/{id}")
    public String paymentIndo_OK(@PathVariable("id") Integer id);

    @GetMapping("/payment/htstrix/timeout/{id}")
    public String paymentIndo_TimeOut(@PathVariable("id") Integer id);
}

模块消费者80的OrderHystrixController

@RestController
public class OrderHystrixController {

    @Resource
    private PaymentHystrixService paymentHystrixService;

    @GetMapping("/consumer/payment/htstrix/ok/{id}")
    public String paymentInfo_OK(@PathVariable("id") Integer id){
        String s = paymentHystrixService.paymentIndo_OK(id);
        return s;
    }

    @GetMapping("/consumer/payment/htstrix/timeout/{id}")
    public String paymentIndo_TimeOut(@PathVariable("id") Integer id){
        String s = paymentHystrixService.paymentIndo_TimeOut(id);
        return s;
    }
 }
Jmeter测试

几万个并发,请求生产者8001都去访问paymentIndo_TimeOut,再访问一个http://localhost:8001/payment/htstrix/ok/2

Jmeter结论

生产者8001自己测试,消费者80也同时访问,消费者只能等待

导致原因

8001同一层次的其它接口服务被困死,因为tomcat线程池里面的工作线程已经被挤占完毕,80此时调用8001,客户端访问响应缓慢

解决办法
  • 对方服务(8001)超时了,调用者(80)不能一直卡死等待,必须有服务降级
  • 对方服务(8001)down机了,调用者(80)不能一直卡死等待,必须有服务降级
  • 对方服务(8001)OK,调用者(80)自己出故障或有自我要求( 自己的等待时间小于服务提供者)

二,服务降级

1.8001fallback

修改8001的PaymentService的paymentIndo_TimeOut方法

//降级配置
@HystrixCommand(fallbackMethod = "paymentIndo_TimeOutHandler",commandProperties = {
            @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value="3000")
    })
    public String paymentIndo_TimeOut(Integer id) {
        try {
            TimeUnit.SECONDS.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "线程池:" + Thread.currentThread().getName() + "paymentIndo_TimeOut,id" + id + "\t" + "O(∩_∩)O哈哈~";
    }

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

添加8001的主启动类的注解(主启动类激活)

@EnableCircuitBreaker

2.80fallback

80的application.xml添加配置

feign:
  hystrix:
    enabled: true

添加80的主启动类的注解(主启动类激活)

@EnableHystrix

更改80的OrderHystrixController

@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)
    {
        String result = paymentHystrixService.paymentIndo_TimeOut(id);
        return result;
    }
    public String paymentTimeOutFallbackMethod(@PathVariable("id") Integer id)
    {
        return "我是消费者80,对方支付系统繁忙请10秒钟后再试或者自己运行出错请检查自己,o(╥﹏╥)o";
    }
出现问题
  • 这时候每一个业务方法都要有一个备用方法,代码膨胀
  • 统一和自定义分开

更改80的OrderHystrixController

类上加上注解

@DefaultProperties(defaultFallback = "payment_Global_FallbackMethod")

更改方法paymentInfo_TimeOut

@GetMapping("/consumer/payment/hystrix/timeout/{id}")
@HystrixCommand
    public String paymentInfo_TimeOut(@PathVariable("id") Integer id)
    {
        String result = paymentHystrixService.paymentIndo_TimeOut(id);
        return result;
    }
    public String paymentTimeOutFallbackMethod(@PathVariable("id") Integer id)
    {
        return "我是消费者80,对方支付系统繁忙请10秒钟后再试或者自己运行出错请检查自己,o(╥﹏╥)o";
    }
    // 下面是全局fallback方法
    public String payment_Global_FallbackMethod()
    {
        return "Global异常处理信息,请稍后再试,/(ㄒoㄒ)/~~";
    }

Hystrix(二)—服务熔断(基础案例)

本文地址:https://blog.csdn.net/qq_43959546/article/details/107354540

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网