Spring Cloud Hystrix 服务降级限流策略详解
作者:Lxlxxx 发布时间:2022-05-02 15:20:27
前言
前面说到在我们应对高并发的场景,请求量过于大的情况下给我们服务器的压力很多,造成缓存穿透、击穿、雪崩,那么我们采用布隆过滤器,有兴趣的小伙伴可以去看看上篇文章,关于布隆过滤器的解析。Redis处理高并发之布隆过滤器
我们要从根源上解决问题,比如一个接口在同一时间内被多次请求,如果请求失败了,我们还要继续请求么,一直请求一直失败,一直的在给我们的服务器施加压力,这种情况下肯定是不行,这个时候我们就需要对接口服务提供降级策略,在服务请求达成一定失败率的情况下,就触发降级、熔断策略对服务进行保护,也可以去服务的每分钟请求次数做限制,从而保护我们的服务,给服务端减轻压力,可以更加效率去执行业务逻辑。
Hystrix简介
Hystrix 是一个用于解决分布式服务调用出现延迟、故障,在一个服务出现故障的时候,保护其他服务可以正常使用,避免整个系统出现问题,Hystrix作为开源库,以断路器的角色存在着。
Hystrix的使用
服务降级
服务超时或故障,Hystrix调用降级方法处理,首先构建两个服务,一个system服务,定义2个controller方法,一个是模拟超时的场景,一个模拟调用错误的场景,另外一个system2的服务,去模拟分布式场景下的调system服务的场景。
system服务控制层
@RestController
@RequestMapping("/hystrix")
@DefaultProperties(defaultFallback = "timeOutFallbackMethod")
public class HystrixController {
@Autowired
private IHystrixService iHystrixService;
@GetMapping("/error")
@HystrixCommand
public String errorMethod() {
int i = 10 / 0;
return iHystrixService.fallBackMethodOk();
}
@GetMapping("/timeOut")
@HystrixCommand(fallbackMethod = "timeOutFallbackMethod", commandProperties = {
//超过2秒及服务降级
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "2000")
})
public String timeOutMethod() throws InterruptedException {
//线程睡眠3秒
return iHystrixService.timeOutMethod();
}
/**
* 降级方法
*
* @return
*/
private String timeOutFallbackMethod() {
return "服务访问失败,降级处理";
}
}
@DefaultProperties 默认全局降级方法,在单纯只加@HystrixCommand注解的情况下,走默认的defaultFallback方法。
int i = 10 / 0; 接口异常情况下降级
超时降级,服务设置超时时间为2秒,调用线程睡眠3秒,超时调降级服务
System2调System降级场景
controller
@RestController
@AllArgsConstructor
@RequestMapping("/provider")
public class HystrixProviderController {
@Autowired
private HystrixService hystrixService;
/**
* 模拟接口错误场景
* @return
*/
@GetMapping("/executeProviderMethod1")
public String executeProviderMethod1(){
int i =5/0;
String result = hystrixService.errorMethod();
return result;
}
}
服务system feign接口,feign添加fallback,实现类是调用的降级方法。
@FeignClient(contextId = "hystrixService", value = "Lxlxxx-system", fallbackFactory = HystrixFallbackFactory.class)
public interface HystrixService {
/**
* 异常方法
*
* @return
*/
@GetMapping("/hystrix/error")
public String errorMethod();
/**
* 超时方法
*
* @return
*/
@GetMapping("/hystrix/timeOut")
public String timeOutMethod();
}
fallback降级方法。
@Component
@Slf4j
public class HystrixFallbackFactory implements FallbackFactory<HystrixService> {
@Override
public HystrixService create(Throwable cause) {
log.error("用户服务调用失败:{}", cause.getMessage());
return new HystrixService() {
@Override
public String errorMethod() {
return "触发system 服务的降级方法";
}
@Override
public String timeOutMethod() {
return null;
}
};
}
}
服务熔断
Service类里面的熔断方式,可以配置多个出发服务熔断的属性,从而更好的断路保护服务。
@Service
@Slf4j
public class HystrixServiceImpl implements IHystrixService {
//服务熔断
@HystrixCommand(fallbackMethod = "fallback",commandProperties = {
@HystrixProperty(name = "circuitBreaker.enabled",value = "true"), //是否开启断路器
@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "5"), //请求次数
@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "10000"), //时间范围
@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "60"), //失败率达到多少后跳闸
})
@Override
public String countError(Integer count){
//模拟报错
if (count > 0){
throw new RuntimeException("*****count 必须大于0");
}
return Thread.currentThread().getName()+"\t"+"调用成功";
}
public String fallback(Integer count){
return "count 必修大于0 count: " +count;
}
}
来源:https://juejin.cn/post/7182960606201266235


猜你喜欢
- 本文记录一下,我从AndroidStudio 2.3.3升级到3.0,再升级到3.0.1一路上遇到的输入法之坑以及解决方案。前些天把Andr
- 问题描述在使用 Matisse 与 glide 4.0.0 以及 4.0.0 之后的版本过程中,发现通过Matisse 的 wiki 代码调
- 1.launch启动协程fun main() = runBlocking { launch { &
- 前言对于数组遍历,基本上每个开发者都写过,遍历本身没什么好说的,但是当我们在遍历的过程中,有一些复杂的业务逻辑时,将会发现代码的层级会逐渐加
- 本文实例讲述了Java编程调用微信接口实现图文信息等推送功能。分享给大家供大家参考,具体如下:Java调用微信接口工具类,包含素材上传、获取
- 一、堆栈内存堆栈内存,顾名思义,指的是堆内存以及栈内存,其中,堆内存是由Java GC进行管理的内存区域,而栈内存则是线程内存。关于栈内存,
- Word中设置水印时,可使用预设的文字或自定义文字设置为水印效果,但通常添加水印效果时,会对所有页面都设置成统一效果,如果需要对每一页或者某
- Java注解(annotation)简单上手反射reflect:https://www.jb51.net/article/221282.ht
- 1、需求 在Java项目中,需要读取resource资源目录下的文件,以及遍历指定资源目
- JMMJMM是指Java内存模型,不是Java内存布局,不是所谓的栈、堆、方法区。每个Java线程都有自己的工作内存。操作数据,首先从主内存
- 定义定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户。解决的问题在有多种算法相似的情况下,
- 本文实例为大家分享了UnityShader百叶窗展示的具体代码,供大家参考,具体内容如下shader实现以上百叶窗效果,主要通过shader
- 博主说:有时候,我们需要对数据库中现有的数据进行大量处理操作(例如表中的某个字段需要全部更新等),如果直接使用select * from t
- 目录一、log4j简介1、Loggers2、Appenders3、Layouts二、配置详解1、配置根Logger:2、配置日志信息输出目的
- 首先引入pom <!--SpringBoot 2.1.0--> <parent>  
- LRU简介LRU是Least Recently Used 近期最少使用算法,它就可以将长时间没有被利用的数据进行删除。实现最近面了阿里的外包
- 排列组合的概念排列:从n个不同元素中取出m(m≤n)个元素,按照一定的顺序排成一列,叫做从n个元素中取出m个元素的一个排列(Arrangem
- 最近项目中需要实现定时执行任务,比如定时计算会员的积分、调用第三方接口等,由于项目采用spring框架,所以这里结合spring框架来介绍。
- 前言在实际开发中我们经常会与时间打交道,那这就会涉及到一个时间格式转换的问题。接下来会介绍几种在SpirngBoot中如何对时间格式进行转换
- CopyOnWriteArrayList介绍它相当于线程安全的ArrayList。和ArrayList一样,它是个可变数组;但是和Array