一 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个条件是与的关系。
二 案例操作
2.1 controller代码配置
1.截图
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
2.启动provider9009 服务
3.测试
请求为负数,服务熔断,走服务降级
请求为正数,多请求几次,后恢复正常请求