一 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.测试
请求为负数,服务熔断,走服务降级
请求为正数,多请求几次,后恢复正常请求