SpringMVC实践之集成Sentinel限流功能
背景 近期收到线上报警,发现个别新接口在同1s内被请求了接近上百次,对系统的稳定造成了一些影响,近期调研了一下通用的限流框架,打算将Sentinel的限流功能集成进新服务 Sentinel前置知识 Sentinel 限流主要涉及以下几方面 Resource 限流的资源,资源支持动态加载,核心类为: AbstractDataSource ,Sentinel 默认提供了市面常见的资源管理服务的实现,也可以自定义实现 Rule 对定义的 Resouce 应用的限流规则,基于QPS、响应时间与系统负载。Sentinel 是通过一系列的功能Slot来实现不同的统计/控制功能,对于限流功能对应的就是 FlowSlot FlowSlot 的功能实现需要依赖前面的 NodeSelectorSlot 和 ClusterBuilderSlot 等统计Slot,有了统计信息才可以针对配置进行限流操作,这里面借用一张官方的实现图 各Slot默认的顺序也可以在代码中找到 核心处理逻辑 核心逻辑是在执行调用chain的捕获Blockexcption然后执行后续操作 集成步骤 借助SpringMVC中提供的 HandlerInterceptor 拦截器功能 与 Sentinel 提供的SpringMVC框架集成类库可以方便快速的实现限流功能 引入Sentinel SpringMVC Adapter <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-spring-webmvc-adapter</artifactId> <version>1.8.8</version> </dependency> 配置SentinelWebInterceptor Sentinel SpringMVC Adapter中提供了 SentinelWebInterceptor 来实现限流功能,这个 Interceptor 支持一些自定义的行为,主要通过 SentinelWebMvcConfig 来实现 SentinelWebMvcConfig 常用配置说明 SentinelWebMvcConfig 支持以下配置能力 urlCleaner 自定义对请求url的处理,比如厂商此次需要通过请求的设备id维度进行限流,对于其它的请求参数都进行忽略,最终可定义效果为: /api/v1/test/ping?did=6308103f1026acf274bbcc1b10001291551xxX httpMethodSpecify 是否指定特定的Http请求方法,此设置是对资源的请求方法进行了细粒度的配置,默认为false不开启,配置为true后,会在设定好的资源名前加上请求的方法,类似效果: GET: /api/v1/test/ping?did=6308103f1026acf274bbcc1b10001291551xxX blockExceptionHandler 被Block的请求异常处理器,对Block的请求进行自定义处理,可以设置返回的值,如果未配置则需要服务自己捕获 BlockException,可以通过配置 ExceptionHandler 进行统一处理 originParser 请求来源处理器,针对请求的来源进行处理,在配置资源的规则的可以使用此解析的origin细粒度控制,例如可以解析ip、用户做为请求 origin ...