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

一,高并发测试

模块生产者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(二)—服务熔断(基础案例)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值