当前位置:   article > 正文

SpringCloud-服务熔断,降级和限流_customizer

customizer

一.熔断和降级的参考标准

(1)平均响应时间:

    请求某个方法时,在某个时间段内,有N个请求的请求时间都超过了平均请求时间,那么在接下来的某个时间窗口内,对这个请求的调用将自动熔断

(2)异常比例

  请求某个方法时,在某个时间段内,异常的数量超过了某个阈值,那么在接下来的某个时间窗口内,对这个请求的调用将自动熔断

二.Resilience4j的使用

1.  添加依赖

  1. <!-- Resilience4j服务熔断和降级-->
  2. <dependency>
  3. <groupId>org.springframework.cloud</groupId>
  4. <artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId>
  5. </dependency>

2.修改接口的代码

   (1)restTemplate

  1. @GetMapping("/book")
  2. public String getBook(){
  3. String url = "http://bookservice/book/1";
  4. // return restTemplate.getForObject(url+"/1",String.class);
  5. //测试服务的熔断
  6. return circuitBreakerFactory.create("testResilience4j").run(()->
  7. restTemplate.getForObject(url,String.class),throwable -> "熔断该服务了!");
  8. }

(2)Feign

  1. @GetMapping("/slow")
  2. public String testSlowResilience4j(){
  3. return circuitBreakerFactory.create("slow").run(()->bookServiceClient
  4. .getOneBookById(2),throwable -> "熔断返回值");
  5. }

这里的“testRescilience4j”是熔断的ID

3.自定义熔断配置

(1)将熔断时间改为4S

  1. //服务熔断和降级时间自定义配置
  2. @Bean
  3. public Customizer<Resilience4JCircuitBreakerFactory> defaultCustomizer(){
  4. return factory->factory.configureDefault(id->new
  5. Resilience4JConfigBuilder(id).timeLimiterConfig(TimeLimiterConfig.custom().
  6. timeoutDuration(Duration.ofSeconds(4)).build())
  7. .circuitBreakerConfig(CircuitBreakerConfig.ofDefaults()).build());
  8. }

(2)个性化熔断策略

  1. @Bean
  2. public Customizer<Resilience4JCircuitBreakerFactory> slowCustomizer(){
  3. return factory->factory.configure(builder->builder
  4. .circuitBreakerConfig(CircuitBreakerConfig.ofDefaults())
  5. .timeLimiterConfig(TimeLimiterConfig.custom().timeoutDuration(Duration.ofSeconds(1))
  6. .build()),"slow");
  7. }

"slow"就是该熔断的ID,当响应时间超过4s时触发熔断

三.限流

 1.限流算法

  (1)计数器(固定窗口)算法

   在指定的时间周期内,累加访问的次数达到设定的阈值时,触发的限流策略,

实现方法: 可以使用Redis的incr原子自增,在结合key的过期时间实现

缺点:    会有一个临界问题

(2)滑动时间窗口算法

  类似于TCP的滑动窗口,将时间周期分割为多个小的时间窗口,分别在每个小的时间窗口内记录访问次数,然后根据时间将窗口向前滑动并删除过期的小时间窗口,最终只需要统计滑动窗口范围内的小时间窗口的总的请求数即可。

(3)漏桶限流算法

  维持一个漏斗,使其具有恒定的流出速度,不管水流入的速度有多快,出水的速度始终保持不变,类似消息中间件,不管消息的生产者请求量有多大,消息的处理能力取决于消费者

缺点: 当系统在短时间内有突发的大流量时,漏桶算法就处理不了了

(4)令牌桶限流算法

  为了改进漏桶限流算法引入令牌,增加一个大小固定的容器,令牌桶,系统以恒定的速度向令牌桶中放入令牌,如果有客户端来请求,需要先从令牌桶中拿一个令牌,拿到了令牌才有资格访问系统,这时令牌桶中相应的少了一个令牌,当令牌桶满的时候,再向令牌桶生成令牌,令牌就会被抛弃。

四.Sentinel使用

1.使用步骤:

 (1)定义资源

 (2)定义规则

(3检验规则是否生效

2.Sentinel安装

 官网:https://github.com/alibaba/Sentinel/releases 

运行:

 java -jar -Dserver.port=18080 sentinel-dashboard-1.8.1.jar

f9d8edb1716c447cbb508591ccf9cba0.png

f74e8c33b1ed4497a7532419232643c4.png

3.引入Sentinel依赖

  1. <dependency>
  2. <groupId>com.alibaba.cloud</groupId>
  3. <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
  4. <!-- <version>2021.1</version>-->
  5. </dependency>

4.修改配置文件

  1. spring:
  2. application:
  3. name: book-service
  4. cloud:
  5. nacos:
  6. server-addr: localhost:8848
  7. #限流
  8. sentinel:
  9. eager: true
  10. transport:
  11. dashboard: localhost:18080

5.编写接口测试

  1. /**
  2. * 测试sentinel流控
  3. * @return
  4. */
  5. @GetMapping("/sentinel")
  6. public String testSentinel(){
  7. return "successs!";
  8. }

e6e4efb2cddb4f798c8f89fb8a23a74f.png

可以看到该接口成功返回结果

下面对该接口设置限流

18617aaab4ea40d3a4bd79a375f3b58d.png

再次测试快速点击鼠标:

cf96c99a2ed44861b3bf9ff61bf938a2.png

 

可以发现已经被限流了!

1160218186d74815b4b6c2ffc29a6d93.png

QPS:    请求在进入服务之前限制
线程数: 请求到达服务后,当服务线程处理不完时进行限制

 

6.Sentinel热点规则

设置热点规则:

b1451c8b552b4125b3c323b4d9a896c3.png

 

修改代码:

  1. public class CustomHandler {
  2. public static String handleException1(BlockException e){
  3. return "异常1";
  4. }
  5. public static String handleException2(BlockException e){
  6. return "异常2";
  7. }
  8. }
  1. @SentinelResource(value = "test-custom",blockHandlerClass = CustomHandler.class,
  2. blockHandler = "handleException1")
  3. @GetMapping("/{id}")
  4. public Book getOneByid(@PathVariable("id")Integer id){
  5. return bookService.getOneByid(id);
  6. }

这样当服务触发限流时就会进入类CustomHandler中的handleExecption1方法处理

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/536991
推荐阅读
相关标签
  

闽ICP备14008679号