熔断限流渐渐从Hystrix转为Sentinel

前言

现在的微服务渐渐在版本更新迭代中,在框架升级方面,涉及到服务的限流方面渐渐的从最早的Spring Cloud的Hystrix组件,慢慢转变为阿里开源的微服务熔断限流技术组件Sentinel,那么为什么要用Sentinel呢,它跟Hystrix的区别性能方面到底差距在哪?

Hystrix

Hystrix是Spring Cloud生态下的一个对服务提供,熔断、接口降级、限流的一个组件,是Netflix开源的限流组件 ,如今已经不在更新新的功能了;

Hystrix两个比较核心概念就是:线程池隔离 和信号量隔离

线程池隔离

在微服务的调用过程中,如果所有接口都在一个线程池中调用,某些接口在大规模请求的情况下,就会导致服务的资源耗尽,导致服务的崩溃; 所有遇到这种场景下,Hystrix会将不同接口放到不同的线程池中进行处理,线程池之前相互不干扰,可以避免一个线程池出现故障,不影响其他的服务调用;

下面来看具体线程池隔离使用,可以看到作用在方法上还是需要很多的配置,不同的方法可以使用不同的线程池进行执行,相互隔离;

信号量隔离

Hystrix通过设置信号量,这个信号量可以代表接口同时访问的最大请求数,如果超过了这个信号量阀值将会触发失败机制,或者进行阻塞等待;

下面是Hystrix信号量配置,也是使用@HystrixCommand注解,配置指定隔离策略;

Sentinel

Sentinel 和Hystrix对比,总体看下来还是Sentinel更香一点;

实时监控 :Sentinel提供实时监控页面,可以在控制台看到注册服务的QPS; 开源生态整合 :经常使用的微服务框架 Spring Cloud、Dubbo、grpc,只需要引入相应的依赖即可; 扩展度:易于扩展,可对SPI进行定制适配逻辑;

Sentinel通信原理

Sentinel服务端搭建

  • 执行命令获取sentinel镜像
bash 复制代码
docker pull alibaba/sentinel-dashboard
  • 运行sentinel容器
  • docker run -d -p 8858:808858---name sentinel-dashboard alibaba/sentinel-dashboard
  • 默认账户/密码:sentinel ,登录进来可以看到Sentinel控制台(dashboard)

Spring-Cloud Alibaba整合Sentinel

引入Sentinel依赖

xml 复制代码
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

Gateway网关接入Sentinel,一般服务的调用都要经过网关的转发,所以在网关层面做客户端的接入;

yaml 复制代码
sentinel:
  # 取消控制台懒加载
  eager: true
  transport:
    # 控制台地址
    dashboard: 127.0.0.1:8858
  # nacos配置持久化
  datasource:
    ds1:
      nacos:
        server-addr: 127.0.0.1:8848
        dataId: sentinel-pms-gateway
        groupId: DEFAULT_GROUP
        data-type: json
        rule-type: gw-flow
  • Sentinel降级处理类
kotlin 复制代码
public class SentinelFallbackHandler implements WebExceptionHandler {

    private Mono<Void> writeResponse(ServerResponse response, ServerWebExchange exchange) {
        return ServletUtils.webFluxResponseWriter(exchange.getResponse(), "请求超过最大数,请稍候再试");
    }

    @Override
    public Mono<Void> handle(ServerWebExchange exchange, Throwable ex) {
        if (exchange.getResponse().isCommitted()) {
            return Mono.error(ex);
        }
        if (!BlockException.isBlockException(ex)) {
            return Mono.error(ex);
        }
        return handleBlockedRequest(exchange, ex).flatMap(response -> writeResponse(response, exchange));
    }

    private Mono<ServerResponse> handleBlockedRequest(ServerWebExchange exchange, Throwable throwable) {
        return GatewayCallbackManager.getBlockHandler().handleRequest(exchange, throwable);
    }
}
  • 配置GatewayConfig,使用SentinelFallbackHandler策略
less 复制代码
@Configuration
public class GatewayConfig {

    @Bean
    @Order(Ordered.HIGHEST_PRECEDENCE)
    public SentinelFallbackHandler sentinelGatewayExceptionHandler(){
        return new SentinelFallbackHandler();
    }
}
  • sentinel-pms-gateway,Sentinel限流策略配置持久化在nacos中;
css 复制代码
[    {        "resource": "pms-system",        "count": 1000,        "grade": 1,        "limitApp": "default",        "strategy": 0,        "controlBehavior": 0    }]

定义规则

具体限流、降级策略可以在控制台进行配置;

当然也可以在代码里通过FlowRule类进行配置

scss 复制代码
@PostConstruct
public static void initFlowRules() {
    List<FlowRule> flowRules = new ArrayList<>();
    FlowRule flowRule = new FlowRule();
    // 设置受保护的资源
    flowRule.setResource("RESOURCE_NAME");
    // 设置流控规则 QPS
    flowRule.setGrade(RuleConstant.FLOW_GRADE_QPS);
    // 设置受保护的资源阈值
    // Set limit QPS to 20.
    flowRule.setCount(1);
    flowRules.add(flowRule);
    // 加载配置好的规则
    FlowRuleManager.loadRules(flowRules);
}

总结

总体来说现在接口限流方面,基本很多公司优先会选择Sentinel,其功能更加完善,使用相对更加简单,主要可以直观看到服务的各种信息,所以很多公司在基础架构升级方面将限流方面的框架从Hystrix升级为Sentinel;

相关推荐
the局外人2 分钟前
FastAPI中jwt的基本使用与实践
后端·python·fastapi
FullStackGeek25 分钟前
微信缴费APIV3接入
后端
灯澜忆梦31 分钟前
【Go Zap 日志库】#1 |快速上手 + 配置详解
开发语言·后端·golang
m0_5873830036 分钟前
无人自助拼豆系统从需求分析到落地部署全流程实战开发指南
java·经验分享·后端·struts·小程序·架构·需求分析
Rain的Java大神之路1 小时前
被问麻了!Function Calling、MCP、Skill 到底啥关系?一张图讲透三层架构,附 Java 生产落地全流程+30个坑
java·后端·ai编程
云和数据.ChenGuang2 小时前
用 Claude Code 重构遗留系统:从评估到落地的完整指南
java·人工智能·spring boot·后端·重构·springai
豆角焖肉2 小时前
SpringBoot 集成腾讯 AI 人脸识别
人工智能·spring boot·后端·人脸识别·腾讯 ai·base64 图片
付威20232 小时前
如果你想拥有自己的 Agent,为什么值得从 rpi 开始
后端
可乐ea3 小时前
2000 个智能体把 Agent 重写成 Rust:编排流水线拆解
开发语言·后端·rust·多智能体协作·ai编程助手·智能体编排·rust重写
用户72757483196503 小时前
02-变量、常量和字符串:len("Hello, 世界") 为什么不是 9?
后端