服务容错性Sentinel

36 篇文章 0 订阅
34 篇文章 0 订阅
服务容错机制防止服务雪崩,通过超时处理、限流和断路器等方式确保系统稳定性。Sentinel作为流行的Java服务容错框架,提供流量控制、熔断降级、系统负载保护等功能,广泛应用于秒杀、削峰填谷等场景。Sentinel包含核心库和控制台,支持与其他开源框架如Spring Cloud、Dubbo的整合,并具备丰富的扩展接口和实时监控能力。
摘要由CSDN通过智能技术生成

服务容错

为什么需要服务容错?

服务之间存在调用关系,如果被调用服务down掉,处理不及时的话,就会造成雪崩效应,又称之为级联故障、级联失效(cascading failure)。

解决方案

当前流行框架

Hystrix

Sentinel

官网WIKI

what's sentinel?

Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

主要特征

  • 丰富的应用场景

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

  • 完备的实时监控

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

  • 广泛的开源生态

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

  • 完善的SPI拓展点

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


Sentinel 2大模块

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

如何整合Sentinel

        <!--整合Sentinel-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>

启动应用就可以看到 /actuator/sentinel.(需要暴露endpoint)

management:
  endpoints:
    web:
      exposure:
        include: sentinel

配置Sentinel控制台

下载地址

spring: 
    cloud:
    sentinel:
      transport:
        # 指定sentinel 控制台的地址
        dashboard: localhost:8080

流控规则

官方wiki

  • 流量模式

    • 直接
    • 关联(设定关联资源之后,主资源将会收到关联资源的流量限制影响)
    • 链路(只记录指定链路上的流量)
  • 流控效果

    • 快速失败(com.alibaba.csp.sentinel.slots.block.flow.controller.DefaultController)
    • Warm Up(预热) 限流---冷启动com.alibaba.csp.sentinel.slots.block.flow.controller.WarmUpController
      • 场景:秒杀
    • 排队等待com.alibaba.csp.sentinel.slots.block.flow.controller.RateLimiterController
      • 场景:突发请求
  • 代码添加流控规则

    @GetMapping("/test-code-flow-rule")
        public String testCodeQPSRule() {
            initFlowQpsRule("/share/1");
            return "success";
        }
    
        /**
         * 代码添加流控规则 -> QPS
         *
         * @param resourceName 需要限制的资源名称
         */
        private void initFlowQpsRule(String resourceName) {
            List<FlowRule> ruleList = new ArrayList<>();
            FlowRule rule = new FlowRule(resourceName);
            // set limit qps to 20
            rule.setCount(20);
            rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
            rule.setLimitApp("default");
            ruleList.add(rule);
            FlowRuleManager.loadRules(ruleList);
        }
    

降级规则

源码:com.alibaba.csp.sentinel.slots.block.degrade.DegradeRule#passCheck

  • 平均响应时间 - RT - ResponseTime

    • RT默认最大4900ms(通过 -Dcsp.sentinel.statistic.max.rt=xxx 修改)


  • 异常比例


  • 异常数


热点规则

源码:com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowChecker#passCheck

可对固定参数或者参数值进行限流

  • 注意点

    • 参数索引 开始索引的参数类型必须是 基本类型或者String
  • 适用场景

    • 适用于存在特定的热点参数

系统规则

源码:link

  • Load

    当系统load1(1分钟的load)超过阈值,且并发线程数超过系统容量时触发,建议设置为CPU核心数 * 2.5(仅适用于Linux / Unix 机器生效)

    使用uptime命令查看load

    • 系统容量 = maxQPS * min RT
  • RT

    所有入口流量的平均响应时间达到阈值触发

  • 线程数

    所有入口流量的并发线程数达到阈值触发

  • 入口QPS

    所有入口流量的QPS达到阈值触发

授权规则

Sentinel组件与控制台通信原理


  • 注册/心跳发送

    源码:com.alibaba.csp.sentinel.transport.heartbeat.SimpleHttpHeatbeatSender

  • 通信API

    源码:com.alibaba.csp.sentinel.command.CommandHandler

控制台配置

  • 应用连接控制台配置信息

    spring:
        cloud:
            sentinel:
          transport:
            # 指定sentinel 控制台的地址
            dashboard: localhost:8080
            # 指定和控制台通信的IP
            # 如不配置,会自动选择一个IP注册
            client-ip: 127.0.0.1
            # 指定和控制台通信的端口,默认值为8719
            # 如不设置,会自动从8719开始扫描,依次+1,直到找到未被使用的端口
            port: 8719
            # 心跳发送周期,默认值为null
            # 但在SimpleHttpHeartbeatSender 会使用默认值10s
            heartbeat-interval-ms: 10000
    
  • 控制台配置信息

配置项默认值最小值描述
server.port8080 指定端口
csp.sentinel.dashboard.serverlocalhost:8080 指定地址
project.name  指定程序名称
sentinel.dashboard.auth.username [version>=1.6]sentinel Dashboard登陆账户
sentinel.dashboard.auth.password[version>=1.6]sentinel Dashboard登陆密码
server.servlet.session.timeout[version>=1.6]30 mins 登陆Session过期时间 配置为7200表示7200s 配置为60m表示60分钟

使用方法

java -jar -Dsentinel.dashboard.auth.username=isaac -Dsentinel.dashboard.auth.password=isaac -Dserver.port=1111 sentinel-dashboard-1.6.2.jar

了解更多

资料领取

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值