sentinel-1.8.6 基于生产实践遇到的坑

news/2024/12/5 7:07:20/

最近基于sentinel-1.8.6搭建了一套供生产使用。在开发的过程中遇到了一些问题并进行了改造,在此记录一下。

1、http访问支持ip级别限流

如果是基于servlet容器的,可以手动复制com.alibaba.csp.sentinel.adapter.servlet.CommonFilter,自定义一个filter,加载自定义的filter,重写com.alibaba.csp.sentinel.adapter.servlet.CommonFilter#parseOrigin方法

private String parseOrigin(HttpServletRequest request) {String origin = IPUtils.getIpAddress(request);if (StringUtil.isEmpty(origin)) {return EMPTY_ORIGIN;}return origin;}

如果是springmvc

@Configuration
public class SentinelInterceptorConfig extends WebMvcConfigurerAdapter {@Overridepublic void addInterceptors(InterceptorRegistry registry) {// Add Sentinel interceptoraddSpringMvcInterceptor(registry);}private void addSpringMvcInterceptor(InterceptorRegistry registry) {SentinelWebMvcConfig config = new SentinelWebMvcConfig();config.setBlockExceptionHandler(new CustomBlockExceptionHandler());config.setHttpMethodSpecify(true);config.setWebContextUnify(true);//设置来源解析config.setOriginParser(request -> {//针对IP解析return IPUtils.getIpAddress(request);});// Add sentinel interceptorregistry.addInterceptor(new SentinelWebInterceptor(config)).addPathPatterns("/**");}
}

2、热点参数、授权规则,数据结构不一致的情况

在原有的内存方式实现,dashboard会通过调用接口方式将rule传递到客户端,

com.gongdao.csp.sentinel.dashboard.client.SentinelApiClient#executeCommand(java.lang.String, java.lang.String, int, java.lang.String, java.util.Map<java.lang.String,java.lang.String>, boolean)

但是生产lz使用的是push模式,规则配置持久化至nacos,因此也就序列化了AuthorityRuleEntity这个实体,后来发现,授权规则,热点参数,与其他流控,熔断,系统保护规则不一致,授权/热点参数对应的序列化entity中存在rule字段,客户端进行反序列化的entity是对应的rule实体是没有rule字段,会导致rule字段丢失。

最小的改造成本就是在dashboard中保存热点参数规则以及授权规则的时候,将rule字段内的内容提升至最外围的entity字段层级(即模仿流控,熔断的实现方式)。

在dashboard的页面回显/传参等操作上也要处理。

3、实体id的持久化

在进行respository.save()方法时,会生成对应id,内存实现是维护了一个atomic,如果应用重启,会导致id丢失错乱的情况。

改造方法可以选择集中式持久化,比如db,redis等方式


http://www.ppmy.cn/news/5144.html

相关文章

Transformer17

还是transformer 这次还是谷歌哈 又在机器人领域发力 谷歌机器人团队等在机器人领域构建了一个多任务 transformer 模型&#xff0c;显著改进了对新任务、环境和对象的零样本泛化。轻松完成700多条指令、成功率达97%&#xff01;谷歌开源机器人领域 我们知道&#xff0c;机器…

MySQL 55题及答案【八】

1.数据库三范式是什么? 1. 第一范式&#xff08;1NF&#xff09;&#xff1a;字段具有原子性,不可再分。(所有关系型数据库系 统都满足第一范式数据库表中的字段都是单一属性的&#xff0c;不可再分) 2. 第二范式&#xff08;2NF&#xff09;是在第一范式&#xff08;1NF&a…

Qt+C++基本绘图(画线,画圆,矩形, 撤销,重做)

程序示例精选 QtC基本绘图(画线&#xff0c;圆&#xff0c;矩形画线&#xff09; 如需安装运行环境或远程调试&#xff0c;见文章底部微信名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《QtC基本绘图(画线&#xff0c;画圆&#xff0c;矩形, 撤销&am…

惠普Elite蜻笔记本系统损坏怎么U盘重装教学

惠普Elite蜻笔记本系统损坏怎么U盘重装教学&#xff0c;有用户使用的惠普Elite蜻笔记本系统受到了其他恶意程序的损坏&#xff0c;导致无法正常的开启使用。所以想要去进行电脑系统的重装。那么如何U盘重装电脑系统&#xff0c;一起来看看详细的重装步骤吧。 准备工作&#xff…

【Ctfer训练计划】——(二)

作者名&#xff1a;Demo不是emo 主页面链接&#xff1a;主页传送门创作初心&#xff1a;舞台再大&#xff0c;你不上台&#xff0c;永远是观众&#xff0c;没人会关心你努不努力&#xff0c;摔的痛不痛&#xff0c;他们只会看你最后站在什么位置&#xff0c;然后羡慕或鄙夷座右…

[第十三届蓝桥杯/java/算法]A——排列字母

&#x1f9d1;‍&#x1f393;个人介绍&#xff1a;大二软件生&#xff0c;现学JAVA、Linux、MySQL、算法 &#x1f4bb;博客主页&#xff1a;渡过晚枫渡过晚枫 &#x1f453;系列专栏&#xff1a;[编程神域 C语言]&#xff0c;[java/初学者]&#xff0c;[蓝桥杯] &#x1f4d6…

MySQL中这14个有用的小知识,快学起来吧

前言 我最近用MYSQL数据库挺多的&#xff0c;发现了一些非常有用的小玩意&#xff0c;今天拿出来分享到大家&#xff0c;希望对你会有所帮助。 1.group_concat 在我们平常的工作中&#xff0c;使用group by进行分组的场景&#xff0c;是非常多的。 比如想统计出用户表中&…

ContentProvider的介绍和使用

文章目录ContentProviderContentProvider简介运行时权限Android权限机制详解在程序运行时申请权限访问其他程序当中数据ContentResolver的基本用法读取系统联系人信息创建自己的ContentProvider创建ContentProvider的步骤实现跨程序数据共享ContentProvider 如果我们想要实现跨…