当前位置:   article > 正文

springcloud第4季 springcloud-alibaba之sentinel(限流,熔断)_java 分布式 springcloud sentinel

java 分布式 springcloud sentinel

一 sentinel介绍

1.1 sentinel作用

sentinel是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障服务的稳定性。

1.2 组成部分

sentinel 的使用可以分为两个部分:

核心库(Java 客户端):不依赖任何框架/库,能够运行于 Java 8 及以上的版本的运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。

控制台(Dashboard):Dashboard 主要负责管理推送规则、监控、管理机器信息等。基于 Spring Boot 开发,打包后可以直接运行。

1.3 sentinel的搭建

中文文档:

quick-start | Sentinel

程序包下载:

Releases · alibaba/Sentinel · GitHub

启动jar包

F:\>java -jar sentinel-dashboard-1.8.6.jar

页面访问: sentinel /  sentinel

输入地址: http://localhost:8080/

二 sentinel的限流控制

2.1 工程搭建

1.pom文件

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4. <parent>
  5. <groupId>com.jurf.ms</groupId>
  6. <artifactId>mscloud-demo-2024</artifactId>
  7. <version>1.0-SNAPSHOT</version>
  8. </parent>
  9. <groupId>com.jurf.ms.alibaba.sentinel</groupId>
  10. <artifactId>ms-alibaba-sentinel-8888</artifactId>
  11. <packaging>jar</packaging>
  12. <name>ms-alibaba-sentinel-8888</name>
  13. <url>http://maven.apache.org</url>
  14. <properties>
  15. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  16. </properties>
  17. <dependencies>
  18. <!--SpringCloud ailibaba sentinel-datasource-nacos -->
  19. <dependency>
  20. <groupId>com.alibaba.csp</groupId>
  21. <artifactId>sentinel-datasource-nacos</artifactId>
  22. </dependency>
  23. <!--SpringCloud alibaba sentinel -->
  24. <dependency>
  25. <groupId>com.alibaba.cloud</groupId>
  26. <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
  27. </dependency>
  28. <!--nacos-discovery-->
  29. <dependency>
  30. <groupId>com.alibaba.cloud</groupId>
  31. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  32. </dependency>
  33. <!-- 引入自己定义的api通用包 -->
  34. <dependency>
  35. <groupId>com.jurf.ms.api</groupId>
  36. <artifactId>ms-api-commons</artifactId>
  37. <version>1.0-SNAPSHOT</version>
  38. </dependency>
  39. <!--SpringBoot通用依赖模块-->
  40. <dependency>
  41. <groupId>org.springframework.boot</groupId>
  42. <artifactId>spring-boot-starter-web</artifactId>
  43. </dependency>
  44. <dependency>
  45. <groupId>org.springframework.boot</groupId>
  46. <artifactId>spring-boot-starter-actuator</artifactId>
  47. </dependency>
  48. <!--hutool-->
  49. <dependency>
  50. <groupId>cn.hutool</groupId>
  51. <artifactId>hutool-all</artifactId>
  52. </dependency>
  53. <!--lombok-->
  54. <dependency>
  55. <groupId>org.projectlombok</groupId>
  56. <artifactId>lombok</artifactId>
  57. <version>1.18.28</version>
  58. <scope>provided</scope>
  59. </dependency>
  60. <!--test-->
  61. <dependency>
  62. <groupId>org.springframework.boot</groupId>
  63. <artifactId>spring-boot-starter-test</artifactId>
  64. <scope>test</scope>
  65. </dependency>
  66. </dependencies>
  67. </project>

2.application配置文件

  1. server:
  2. port: 8888
  3. spring:
  4. application:
  5. name: ms-alibaba-sentinel8888
  6. cloud:
  7. nacos:
  8. discovery:
  9. server-addr: localhost:8848 #Nacos服务注册中心地址
  10. sentinel:
  11. transport:
  12. dashboard: localhost:8080 #配置Sentinel dashboard控制台服务地址
  13. port: 8719 #默认8719端口,假如被占用会自动从8719开始依次+1扫描,直至找到未被占用的端口

3.业务类

  1. package com.jurf.ms.alibaba.sentinel.controller;
  2. import org.springframework.web.bind.annotation.GetMapping;
  3. import org.springframework.web.bind.annotation.RestController;
  4. /**
  5. * @ClassName: LimitFlowController
  6. * @Description: TODO
  7. * @Author: admin
  8. * @Date: 2024/06/11 09:23:45 
  9. * @Version: V1.0
  10. **/
  11. @RestController
  12. public class LimitFlowController {
  13. @GetMapping("/testA")
  14. public String testA()
  15. {
  16. return "------testA";
  17. }
  18. @GetMapping("/testB")
  19. public String testB()
  20. {
  21. return "------testB";
  22. }
  23. }

4.启动类

  1. package com.jurf.ms.alibaba.sentinel;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
  5. /**
  6. * Hello world!
  7. *
  8. */
  9. @EnableDiscoveryClient
  10. @SpringBootApplication
  11. public class App8081
  12. {
  13. public static void main( String[] args )
  14. {
  15. SpringApplication.run(App8081.class,args);
  16. System.out.println( "Hello World!" );
  17. }
  18. }

5.启动服务验证

a)启动nacos服务

E:\nacos-server2.2.3\bin>startup.cmd -m  standalone

b)启动sentinel服务

F:\>java -jar sentinel-dashboard-1.8.6.jar

c)启动业务服务

d)

nacos:                                  http://localhost:8848/nacos/

sentinel 访问地址:             http://localhost:8080/#/login

2.2 限流策略-直联

2.2.1 思想

sentinel能够对流量进行控制,主要是监控应用的QPS流量或者并发线程数等指标,如果达到制定的阈值时,就会被流量进行控制,以避免服务瞬时的高并发流量击垮,保证服务的高可靠性。

2.2.2 验证

1.配置

2.验证: 频繁快速刷新,超过1秒内超过2次,则进行限流

2.3 限流策略-关联

2.3.1 思想

当关联资源/testB的qps阈值超过1时,就限流/testA的rest访问地址,当关联资源达到阈值后限制配置的资源名,B惹事,A挂掉。

2.3.2 验证

1.jemter访问/testB

2.访问/testA

 

2.4 限流策略-链路(指定请求限流)

2.4.1 思想

指定请求地址进行限流

2.4.2 验证

1.增加c和d方法

2.访问地址

限流配置

3.进行访问:

2.5 限流策略-warnup 预热

2.5.1 思想

下图的配置如下:5s内qps的阈值为3,在5s后qps的阈值为10

2.5.2 验证

2.6 限流策略-排队等待

2.6.1 思想

按照单机阈值,1秒钟同构一个请求,10秒后的请求作为超时处理,放弃

2.6.2 验证

1.代码逻辑

2.配置

3.验证

2.7 限流策略-线程数

2.7.1 思想

单位时间内,限制通过的线程数。

2.7.2 验证

1.模拟100个线程并发访问

2.查看资源B

三 sentinel的熔断处理

3.1 熔断原理

sentinel熔断降级会在调用链路中某个资源出现不稳定状态时(例如调用超时或异常比例升高),对这个资源的调用进行限制,让请求快速失败,避免影响到其他的资源而导致级联错误。当资源被降级后,在接下来的降级时间窗口之内,对该资源的调用都自动熔断(默认行为是抛出DegradeException), 如下图所示:

3.2  熔断策略-慢调用比例

1.设置处理方法

2.配置策略

翻译就是: 在滑动窗口【5s内,请求数为3】,且相应时长大于30毫秒的请求比例大于0.4,则触发熔断,熔断时长为6s。

3.查看效果

3.3  熔断策略-异常比例

1.设置处理方法

 

2.配置策略

翻译就是: 在滑动窗口【2s内,请求数为2】,且异常比例大于0.1,则触发熔断,熔断时长为5s。

3.查看结果

3.4  熔断策略-异常数

1.设置处理方法

2.配置策略

翻译就是: 在滑动窗口【1s内,请求数为1】,且异常比例数大于1,则触发熔断,熔断时长为5s。

3.验证结果

 

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号