sentinel-前世今生

news/2024/11/15 7:18:37/文章来源:https://www.cnblogs.com/LQBlog/p/18378992

方便理解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.hqwc.cn/news/787077.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024.8.25 鲜花

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

zabbix-grafana配置

一、grafana 安装配置 安装grafana # yum install -y https://dl.grafana.com/oss/release/grafana-11.1.4-1.x86_64.rpm启动grafana # systemctl start grafana-servergrafana 在线安装 zabbix 插件,重启grafana服务 # grafana-cli plugins list-remote | grep -i zabbix id:…

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;…

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\)为…

C# StartsWith 字符串的实例方法解析

原文链接:https://www.jb51.net/program/317525q14.htm 在 C# 中,StartsWith 是一个字符串的实例方法,用于检查字符串是否以指定的前缀开头。它返回一个布尔值,指示字符串是否以指定的前缀开始。

062、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…

ZBlog的数据库表是可以设置前缀-修改ZBlog数据库前缀

ZBlog的数据库表是可以设置前缀,程序安装的时候默认是 zbp_,所以很多同学也就默认用了 zbp_,但是因为某些原因需要修改ZBlog数据的前缀。 例如烽烟前几天搭建了几个演示站,多个演示站都使用的是一个数据库,但是由于之前的演示站数据表也是默认的zbp_,这样的话就与现在存在…

ZBlog后台密码忘记该如何找回

应 网友留言‘ZBlog后台密码忘记该如何找回?’ 每个人都会健忘,而且会忘记某些重要的东西,例如老婆的生日(很严重),银行卡密码(着急),当然也会忘记ZBlog管理员账号的密码。。。那么当我们忘记了后台的登录密码要怎么办呢?不要着急,接下来烽烟就来说下ZBlog找回管理员…