首页 > 其他分享 >sentinel-前世今生

sentinel-前世今生

时间:2024-08-25 15:14:59浏览次数:6  
标签:dataId 今生 RateLimiter properties getColdChainShipmentOrder 前世 sentinel groupId

方便理解sentinel,假如我们自己要实现一套sentinel

sentinel前世今生

方便理解sentinel,假如我们自己要实现一套sentinel

第一阶段

一心助手业务服务出现异常,通过监控大盘,发现超过自身服务能够承载的流量,导致请求出现大量排队,服务阻塞,进而导致其他依赖服务出现雪崩效应。通过监控大盘我们发现在qps在200的时候开始出现请求时间增加。因为接口没有优化空间,我们意识到需要对接口进行限流200个QPS的请求。我们采用在服务内增加RateLimiter,采用令牌桶的方式记录时间线在1秒的请求(通过合理使用数据结构和算法解决快和省的问题)如果一秒内请求超过我们设置的阈值快速返回系统繁忙。

    @PostMapping("/1.0/getColdChainShipmentOrder")
    @ApiOperation(value = "获取发货单详情", notes = "物流人员/门店查看发货单详情")
    public ResponseBase<GetColdChainShipmentOrderResDTO> getColdChainShipmentOrder(
        GetColdChainShipmentOrderReqDTO param, OperateContext operateContext) {
        RateLimiter rateLimiter = RateLimiter.create(200);
        // 2、尝试获取令牌,不论是否能获取到都直接返回
        boolean res = rateLimiter.tryAcquire();
        if (res) {
            GetColdChainShipmentOrderResDTO coldChainShipmentOrder = coldChainShipmentOrderApplicationService.getColdChainShipmentOrder(
                GetColdChainShipmentOrderCommand.convert(param), operateContext);
            return ResponseBase.success(coldChainShipmentOrder);
        } else {
            throw new YxtRuntimeException(ResponseCodeType.BIZ_EXCEPTION, "系统繁忙请稍后重试");
        }
    }

第二阶段

一期限流符合预期,高并发接口不会被超过200的QPS的请求压垮,准备在别的服务推行,我们将这个RateLimiter独立成一个模块,其他服务通过引入jar包就可以快速接入使用

 

  <dependency>
            <artifactId>yxt-rate-core</artifactId>
            <groupId>com.yxt</groupId>
         <version>1.0.0</version>
        </dependency>

 

第三阶段

线上getColdChainShipmentOrder 频繁超时告警,我们发现根据业务迭代以前设置的200QPS,现在只能支持100QPS。如果我们要快速解决只能改代码再发版,我们期望系统能够支持不停机的情况动态修改,我们修改我们的core,资源和规则分离,定期去数据库轮询的方式拉去规则配置进行更新

insert flow_rule values("/1.0/getColdChainShipmentOrder",200)

insert rule values("/1.0/getColdChainShipmentOrder",200)

  @PostMapping("/1.0/getColdChainShipmentOrder")
    @ApiOperation(value = "获取发货单详情", notes = "物流人员/门店查看发货单详情")
    public ResponseBase<GetColdChainShipmentOrderResDTO> getColdChainShipmentOrder(
        GetColdChainShipmentOrderReqDTO param, OperateContext operateContext) {
        RateLimiter rateLimiter = RateLimiter.create("/1.0/getColdChainShipmentOrder");
        // 2、尝试获取令牌,不论是否能获取到都直接返回
        boolean res = rateLimiter.tryAcquire();
        if (res) {
            GetColdChainShipmentOrderResDTO coldChainShipmentOrder = coldChainShipmentOrderApplicationService.getColdChainShipmentOrder(
                GetColdChainShipmentOrderCommand.convert(param), operateContext);
            return ResponseBase.success(coldChainShipmentOrder);
        } else {
            throw new YxtRuntimeException(ResponseCodeType.BIZ_EXCEPTION, "系统繁忙请稍后");
        }
    }

第四阶段

通过数据库的方式,我们实现轮询拉去,可以实现动态的更改规则,但是发现,当流量冗余的时候,通过数据库配置的方式有一定滞后性,我们采用nacos或者zookeeper的方式进行配置,服务器启动的时候拉取一次规则进行配置,然后监听nacos进行配置。

 

  public NacosDataSource(final Properties properties, final String groupId, final String dataId,
                           Converter<String, T> parser) {
        super(parser);
        if (StringUtil.isBlank(groupId) || StringUtil.isBlank(dataId)) {
            throw new IllegalArgumentException(String.format("Bad argument: groupId=[%s], dataId=[%s]",
                groupId, dataId));
        }
        AssertUtil.notNull(properties, "Nacos properties must not be null, you could put some keys from PropertyKeyConst");
        this.groupId = groupId;
        this.dataId = dataId;
        this.properties = properties;
        this.configListener = new Listener() {
            @Override
            public Executor getExecutor() {
                return pool;
            }

            @Override
            public void receiveConfigInfo(final String configInfo) {
                RecordLog.info("[NacosDataSource] New property value received for (properties: {}) (dataId: {}, groupId: {}): {}",
                    properties, dataId, groupId, configInfo);
                T newValue = NacosDataSource.this.parser.convert(configInfo);
                // Update the new value to the property.
                getProperty().updateValue(newValue);
            }
        };
        initNacosListener();
        loadInitialConfig();
    }

第五阶段

nacos通过json的方式配置,如果规则过多或者过于复杂就会导致越来越难维护,我们思考是否有图形化的界面方式更友好的配置和监控

我们新建一个UI项目,然后应用服务配置UI项目的地址,应用服务单独开启一个端口去跟UI项目进行交互,UI项目动态的根据业务服务额外暴露的端口拉取监控信息,UI项目修改规则后动态的推送到nacos,业务服务更新监听规则

 

第六阶段

我们发现入口流量都在接口的入口,出口流量依赖的外部服务。我们通过spring-mvc拦截器进行统一的资源埋点。对于open-fegin我们使用FeginBuilder进行扩展,调用时进行资源埋点,对于dubbo使用dubbo的拦截器进行埋点

第七阶段

我们发现每个服务都要写一个这样的埋点代码,我们封装成starter自动装配的方式配置

 

sentinel项目结构介绍

 

 

 

sentinel-starter

 

标签:dataId,今生,RateLimiter,properties,getColdChainShipmentOrder,前世,sentinel,groupId
From: https://www.cnblogs.com/LQBlog/p/18378992

相关文章

  • 图神经网络GNN的前世今生
    GNN图神经网络(GraphNeuralNetwork,简称GNN)已经成为处理图形结构数据的一种强大工具,广泛应用于社交网络分析、知识图谱、推荐系统等领域。在本文中,我们将深入探讨图神经网络的历史背景、关键的发展阶段以及未来可能的发展方向。一、背景介绍图(Graph)是一种数据结构,......
  • 【Java】从零到一使用Feign与Sentinel (详细图解)
    Java系列文章目录补充内容Windows通过SSH连接Linux第一章Linux基本命令的学习与Linux历史文章目录Java系列文章目录一、前言二、学习内容:三、问题描述四、解决方案:4.1认识依赖4.1.1Feign依赖4.1.2Sentinel依赖4.1.3负载均衡依赖4.2父子项目配置4.2.1项目结......
  • 探索 Sentinel:微服务架构中的流量防护神器
    引言随着微服务架构的流行,服务数量的急剧增加导致系统的复杂性和不确定性大幅提高。一个微小的服务失效都可能引发连锁反应,导致整个系统的崩溃。在这种情况下,如何保证系统的高可用性成为了关键问题。Sentinel作为阿里巴巴开源的高可用防护组件,为流量控制、熔断降级、系统......
  • 【中国数据库前世今生】数据存储管理的起源与现代数据库发展启蒙
    记录开启本篇的目的:作为1名练习时长2年半的DBA,工作大部分时间都在和数据库打交道,包括Oracle,Mysql,Postgresql,Opengauss等国内外数据库。但是对数据库的发展史却知之甚少。正好腾讯云开发者社区正在热播:【纪录片】中国数据库前世今生,借此机会了解数据库发展历史,和演变进程,......
  • Sentinel 规则持久化到 Nacos 实战
    前言:前面系列文章我们对Sentinel的作用及工作流程源码进行了分析,我们知道Sentinel的众多功能都是通过规则配置完成的,但是我们前面在演示的时候,发现Sentinel一重启,配置的规则就没有了,这是因为规则存储在内存中,本篇我们来实现Sentinel规则持久化到Nacos中。Sentin......
  • Sentinel 滑动时间窗口源码分析
    前言:Sentinel的一个重要功能就是限流,对于限流来说有多种的限流算法,比如滑动时间窗口算法、漏桶算法、令牌桶算法等,Sentinel对这几种算法都有具体的实现,如果我们对某一个资源设置了一个流控规则,并且选择的流控模式是“快速失败”,那么Sentinel就会采用滑动时间窗口算法来......
  • springcloud alibaba sentinel降级 @SentinelResource
    1.sentinel降级方法和主方法public且返回值、参数必须一致的情况下,必须加【BlockExceptionblockException】参数2、业务降级方法和主方法public且返回值、参数必须一致,Throwable参数可加可不加@RequestMapping("/consumer/fallback/{id}")@SentinelResource(value=......
  • Redis-Sentinel部署记录
    目录Sentinel哨兵模式介绍Sentinel状态持久化Sentinel作用Sentinel工作方式(每个Sentinel实例都执行的定时任务)三个定时监控任务Sentinel搭建过程所有主机创建sentinel目录所有主机创建sentinel配置文件启动sentinel模拟主库宕机Sentinel常用命令PINGSENTINELmasterSENTINELslave......
  • sentinel限流中阈值类型介绍
    限流阈值类型是指在进行限流时所依据的不同维度或条件。Sentinel支持多种阈值类型,每种类型适用于不同的场景。以下是一些主要的阈值类型:直接QPS限流(QPSThreshold)这是最简单的限流方式,直接根据每秒请求数(QueriesPerSecond,QPS)来设置阈值。例如,你可以设置一个资源的......
  • sentinel限流并发线程数限流 与 直接QPS限流 区别
    发线程数限流和直接QPS限流是Sentinel中两种不同的限流策略,它们分别从不同的角度来控制系统的流量和负载。下面详细解释这两种限流的区别:并发线程数限流(ConcurrencyLevelThreshold)定义:并发线程数限流关注的是某一时刻正在执行的请求的数量。当一个请求开始执行并......