熔断限流渐渐从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;

相关推荐
2401_854391088 分钟前
Spring Boot大学生就业招聘系统的开发与部署
java·spring boot·后端
虽千万人 吾往矣29 分钟前
golang gorm
开发语言·数据库·后端·tcp/ip·golang
这孩子叫逆1 小时前
Spring Boot项目的创建与使用
java·spring boot·后端
coderWangbuer2 小时前
基于springboot的高校招生系统(含源码+sql+视频导入教程+文档+PPT)
spring boot·后端·sql
攸攸太上2 小时前
JMeter学习
java·后端·学习·jmeter·微服务
Kenny.志2 小时前
2、Spring Boot 3.x 集成 Feign
java·spring boot·后端
sky丶Mamba3 小时前
Spring Boot中获取application.yml中属性的几种方式
java·spring boot·后端
妍妍的宝贝3 小时前
k8s 中微服务之 MetailLB 搭配 ingress-nginx 实现七层负载
nginx·微服务·kubernetes
千里码aicood4 小时前
【2025】springboot教学评价管理系统(源码+文档+调试+答疑)
java·spring boot·后端·教学管理系统
程序员-珍4 小时前
使用openapi生成前端请求文件报错 ‘Token “Integer“ does not exist.‘
java·前端·spring boot·后端·restful·个人开发