sentinel-前世今生

news/2024/10/14 14:18:01

方便理解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() {@Overridepublic Executor getExecutor() {return pool;}@Overridepublic 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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/52872.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

*2024.8.25 鲜花

没啥文采,写的不好。NTERNET OVERDOSE この混沌とした 令和のインターネットを照らす 一筋の光 電子の海を漂うオタクに笑顔を 未来の平和をお約束 躁鬱だけどまかせとけ インターネット・エンジェル ただいま降臨 社会をやめろ 家族をやめろ 人間関係をやめろ 今すぐ薄暗い部…

Neo-GNNs: Neighborhood Overlap-aware Graph Neural Networks for Link Prediction

目录概符号说明MotivationNeo-GNN代码Neo-GNNs: Neighborhood overlap-aware graph neural networks for link prediction. NeurIPS, 2021.概 一种计算上相对高效的, 同时利用结构信息和特征信息的链接预测模型. 符号说明\(\mathcal{G} = (\mathcal{V}, \mathcal{E})\), graph;…

LVS

问题LVS NAT模式必须设置默认路由指向DIR地址,如果不设置数据包RS服务器能否将数据包正确的返回给客户端。DR/TUN模式增加一条静态路由目标地址VIP地址,dev设备指向VIP的网口,如果不设置RS服务能否正确接收到Director Server发送的数据包 LVS DR/TUN模式,RS服务器一定配置V…

Thanos HA

ThanosHA组件HA组件Sidercar Receiver其它组件Querier Store Compactor RulerSidecar & Receiver工作方式Sidecar 为实现高可用,Sidecar组件与Prometheus运行在一个Pod中,双副本的Prometheus独立运行采集数据(scrape metrics),默认情况部署在Kubernetesk的Prometheus使…

063、Vue3+TypeScript基础,作用域插槽的使用

01、main.js代码如下:// 引入createApp用于创建Vue实例 import {createApp} from vue // 引入App.vue根组件 import App from ./App.vue// 引入emitter用于全局事件总线 // import emitter from @/utils/emitterconst app = createApp(App);// App.vue的根元素id为app app.mou…

使用AI识别语音和B站视频并通过GPT生成思维导图

AI脑图除了对文本、网页链接和文件生成思维导图外,现在也支持了对语音和B站视频的内容识别,并自动生成思维导图。AI脑图除了对文本、网页链接和文件生成思维导图外,现在也支持了对语音和B站视频的内容识别,并自动生成思维导图。 语音生成思维导图 直接发送语音:对AI脑图公…

C++函数调用栈从何而来

竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生~个人主页:rainInSunny | 个人专栏:C++那些事儿、Qt那些事儿目录写在前面原理综述x86架构函数调用栈分析如何获取rbp寄存器的值总结 写在前面程序员对函数调用栈是再熟悉不过了,无论是使用IDE调试还是GDB等工具进行调试,都离不开函数…

[COCI2017-2018#5] Planinarenje

这道题目是二分图博弈的板子 介绍一下二分图博弈:设两部的节点分别为\(x_1,x_2,...,x_n\)和\(y_1,y_2,...,y_m\),先手选择了\(x_i\)这个节点,则先手必胜当且仅当\(x_i\)是最大匹配的必须点(也就是说少了\(x_i\)的话最大匹配数会减少) 证明: 任选一个最大匹配,则\(x_i\)为…