熔断 降级 限流 区别

springboot整合sentinel实现熔断_java

 1、Sentinel具有以下特征:

丰富的应用场景:Sentinel承接了阿里巴巴近10年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。

完备的实时监控:Sentinel同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至500台以下规模的集群的汇总运行情况。

广泛的开源生态:Sentinel提供开箱即用的与其它开源框架/库的整合模块,例如与SpringCloud、Dubbo、gRPC的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入Sentinel。

完善的SPI扩展点:Sentinel提供简单易用、完善的SPI扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。

 2、Hystrix与Sentinel比较

springboot整合sentinel实现熔断_sentinel_02

 3、Sentinel介绍

Sentinel 分为两个部分:

核心库(Java 客户端)不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。控制台(Dashboard)基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器。

 重要规则定义 具体参考官方文档

springboot整合sentinel实现熔断_微服务_03

 4、SpringBoot整合Sentinel

4-1 添加启动器

<!--sentinel 场景启动器-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>

 4-2 控制台下载(使用文档)

Sentinel/sentinel-dashboard at master · alibaba/Sentinel · GitHub

本文核心包使用 1.6.3 版本,控制台也下载一样 

springboot整合sentinel实现熔断_spring_04

下载地址找相应版本

Releases · alibaba/Sentinel · GitHub

springboot整合sentinel实现熔断_spring_05

4-3 启动jar包 访问控制台

java -jar sentinel-dashboard-1.6.3.jar --server.port=8333

账号密码都是 sentinel

springboot整合sentinel实现熔断_java_06

 4-4 配置控制台信息

这里的 spring.cloud.sentinel.transport.port 端口配置会在应用对应的机器上启动一个 Http Server,该 Server 会与 Sentinel 控制台做交互。比如 Sentinel 控制台添加了一个限流规则,会把规则数据 push 给这个 Http Server 接收,Http Server 再将规则注册到 Sentinel 中。

#连接sentinel 控制台
spring.cloud.sentinel.transport.dashboard=localhost:8333
#sentinel传输端口
spring.cloud.sentinel.transport.port=8719

4-5 整合 Endpoint 支持

在使用 Endpoint 特性之前需要在 Maven 中添加 spring-boot-starter-actuator 依赖,并在配置中允许 Endpoints 的访问。

<!--actuator Endpoint 支持-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
  • Spring Boot 2.x 中添加配置 management.endpoints.web.exposure.include=*。暴露的 endpoint 路径为 /actuator/sentinel
  • springboot整合sentinel实现熔断_spring cloud_07

  •  Sentinel Endpoint 里暴露的信息非常有用。包括当前应用的所有规则信息、日志目录、当前实例的 IP,Sentinel Dashboard 地址,Block Page,应用与 Sentinel Dashboard 的心跳频率等等信息。
  • 新增流控规则

 限制1秒一个 ,超过访问次数后,如下

  • 图:sentinel会有默认返回。
  • 自定义sentinel的返回
/**
 * <简述>自定义阻塞返回方法
 * <详细描述>
 * @author syf
 * @date 2023/4/24 15:26
 * @return null
 */
@Configuration
public class GulimallSeckillSentinelConfig {

    public GulimallSeckillSentinelConfig() {

        WebCallbackManager.setUrlBlockHandler(new UrlBlockHandler() {
            @Override
            public void blocked(HttpServletRequest request, HttpServletResponse response, BlockException ex) throws IOException {
                R error = R.error(BizCodeEnum.TO_MANY_REQUEST.getCode(), BizCodeEnum.TO_MANY_REQUEST.getMsg());
                response.setCharacterEncoding("UTF-8");
                response.setContentType("application/json");
                response.getWriter().write(JSON.toJSONString(error));

            }
        });

    }

}

设置完QPS后,自定义返回如下

springboot整合sentinel实现熔断_微服务_08

 4-6 流量控制

地址 : 流量控制 · alibaba/Sentinel Wiki · GitHub

springboot整合sentinel实现熔断_spring cloud_09

https://github.com/alibaba/Sentinel/wiki/%E6%B5%81%E9%87%8F%E6%8E%A7%E5%88%B6

 4-6 -1浏览控制有三种方式   直接、链路、关联

链路是基于调用入口的控制如图  ,只有 /helllo 进来的请求才会限制

springboot整合sentinel实现熔断_spring_10

springboot整合sentinel实现熔断_sentinel_11

 4-6-2关联:

限制资源的争抢,A 服务read ,B 服务wirte ,如果限制A服务数量100,b压力大时就会限制A,B压力不大则不会限制A

springboot整合sentinel实现熔断_java_12

4-7 流控效果  快速失败 、warm up、 排队等如图

4-7-1 快速失败   

不用说,就是直接放弃

4-7-2 warm up  热启动模式

springboot整合sentinel实现熔断_sentinel_13

如上图,单机阈值 100 ,预热时常10。 服务会慢慢的将请求增长到 100. 比如前一秒 1个请求,后一秒 3个请求,10秒内达到100请求

4-7-3 排队等待 

springboot整合sentinel实现熔断_java_14

如上图,单机阈值 100 ,超时常10。进来 150请求,先放100请求,剩下50 排队,超过10s放弃掉