springcloud3 hystrix实现服务熔断的案例配置3

一 hystrix的熔断原理

1.1  hystrix的熔断原理

在springcloud的框架里,熔断机制是通过hystrix实现,hystrix会监控服务之间的调用。当失败调用达到一定的阈值,默认是5s内失败20次,就会启用hystrix的熔断机制,使用命@HystrixCommand。

1.2 触发原则

断路器涉及3个重要参数: 快照时间窗口,请求总数阈值,错误百分比阈值
1.快照时间窗口:断路器确定是否打开需要统计一些请求和错误数据,开始统计时间范围为快照时间窗口,默认为最近的10s。
2.请求总数阈值:在快照时间窗内,必须满足请求总数阈值才能有资格熔断。默认为20,也就是说10s内,
调用异常的次数大于20则满足熔断资格,否则调用次数不足20次,及时所有的请求都超时或者其他原因失败,断路器都不会打开。

3.错误百分比阈值:当请求总数在快照时间范围内超出了阈值。比如发生了30次,如果这30次中,有15次发生超时异常,也就是超过了50%的错误百分比
在默认设定50%阈值情况下,这时候断路器将打开。

总结:3个条件是与的关系。

springcloud3 hystrix实现服务熔断的案例配置3_第1张图片

 二 案例操作

2.1 controller代码配置

1.截图

springcloud3 hystrix实现服务熔断的案例配置3_第2张图片

 2.代码

package com.ljf.mscloud.controller;

import com.alibaba.nacos.common.utils.UuidUtils;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.json.JsonMapper;
import com.ljf.mscloud.model.User;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import org.springframework.web.bind.annotation.*;

/**
 * @ClassName: ProviderController
 * @Description: TODO
 * @Author: admin
 * @Date: 2023/08/15 19:58:46 
 * @Version: V1.0
 **/
@RestController
public class ProviderController {
    @GetMapping(value = "/ljf/getinfo/{id}")
    @HystrixCommand(fallbackMethod = "dealFallBackInfo",commandProperties = {
            @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value="3000")
    })
    public String getPayment(@PathVariable("id") Integer id)
    {
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        int k=10/0;
        System.out.println("================服务9009 获取到的参数id:"+id);
        return "服务9009 获取到的参数id:"+id;
    }

    @PostMapping("/path")
   public  String postQueryParams(@RequestBody User user) throws JsonProcessingException {

       String str=  new JsonMapper().writeValueAsString(user);
       System.out.println("post提交....");
       return str;
    }

    public String dealFallBackInfo(@PathVariable("id") Long id)
    {
        return "我是消费者9009,服务出错了,进行服务降级"+id;
    }
    /***  服务熔断    **/
    @HystrixCommand(fallbackMethod = "paymentCircuitBreaker_fallback",commandProperties = {
            @HystrixProperty(name = "circuitBreaker.enabled",value = "true"),// 是否开启断路器
            @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "10"),// 请求次数
            @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "10000"), // 时间窗口期
            @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "60"),// 失败率达到多少后跳闸
    })
    @GetMapping(value = "/breakdown/info/{id}")
    public String getBeakDown(@PathVariable("id") Integer id){
        if(id<0){
            throw new RuntimeException("参数为负数.....");
        }
        String serialNumber = UuidUtils.generateUuid();

        return Thread.currentThread().getName()+"\t"+"调用成功,流水号: " + serialNumber;
    }
    public String paymentCircuitBreaker_fallback(@PathVariable("id") Integer id)
    {
        return "id 不能负数,请稍后再试,/(ㄒoㄒ)/~~   id: " +id;
    }
}

2.2 启动服务测试

1.启动nacos,启动sleuth

springcloud3 hystrix实现服务熔断的案例配置3_第3张图片

 2.启动provider9009 服务

springcloud3 hystrix实现服务熔断的案例配置3_第4张图片

 3.测试

请求为负数,服务熔断,走服务降级

springcloud3 hystrix实现服务熔断的案例配置3_第5张图片

 请求为正数,多请求几次,后恢复正常请求

springcloud3 hystrix实现服务熔断的案例配置3_第6张图片

 

你可能感兴趣的:(springcloud3,spring,cloud)