深度解析微服务高并发:适配SpringMVC框架适配模块及实现原理
ccwgpt 2025-05-02 09:36 28 浏览 0 评论
适配主流框架
如果不借助Sentinel提供的适配主流框架的模块,则在使用Sentinel时需要借助try-catchfinally将要保护的资源(方法或代码块)包起来,在目标方法或代码块执行之前,调用ContextUtil#enter方法及SphU#entry方法;在抛出异常时,如果非BlockException异常需要调用Tracer#trace方法统计异常指标,则在finally中需要调用SphU#entry方法返回的Entry实例的exit方法,以及ContextUtil#exit方法。
为了节省这些步骤,Sentinel提供了对主流框架的适配,如适配Spring MVC、WebFlux、Dubbo、APIGateway等框架,在Sentinel源码之外,Alibaba的
spring-cloud-starter-alibabasentinel也为Sentinel提供了与OpenFeign框架整合的支持。
本篇内容主要包括以下几个方面。
o 适配Spring MVC框架。
o 适配OpenFeign框架。
o 适配Dubbo框架。
o 注解切面。
适配Spring MVC框架
Spring MVC框架是目前使用最多的一个Web框架(用Java语言编写),而Sentinel提供了与Spring MVC框架整合使用的适配模块。
本节将介绍如何使用Spring MVC适配模块并分析其实现原理。
使用步骤
要使用Sentinel提供的SpringMVC适配模块,只需要在项目中添加sentinel-springwebmvc-adapter模块的依赖即可,借助WebMvcConfigurer将SentinelWebInterceptor注册到Spring MVC框架中,步骤如下。
第一步,在项目中添加Spring MVC适配模块的依赖,代码如下。
第二步,编写WebMvcConfigurer,在addInterceptors方法中注入SentinelWebInterceptor,代码如下。
在创建SentinelWebInterceptor时,可以为SentinelWebInterceptor添加配置,使用SentinelWebMvcConfig封装这些配置。o setBlockExceptionHandler:配置BlockException处理器,如果不想配置BlockException处理器,则可以在Spring MVC的全局异常处理器中处理BlockException。
o setOriginParser:注册调用来源(origin)解析器,例如,从请求头中获取S-user参数的值作为调用来源名称,在向下游服务发起请求时在请求头写入S-user参数。
o setHttpMethodSpecify:是否需要给资源名称加上HttpMethod前缀,例如,对于GET接口/hello,如果将httpMethodSpecify配置为false,则资源名称为/hello,否则资源名称为GET:/hello。
适配原理
Sentinel适配Spring MVC框架是借助Spring MVC框架提供的方法拦截器实现的,通过方法拦截器在目标方法被调用之前、调用之后及发生异常时,分别调用ContextUtil#enter方法、SphU#entry方法、Tracer#trace方法、Entry#exit方法和ContextUtil#exit方法。
Spring MVC框架的方法拦截器(HandlerInterceptor)的定义如下。
HandlerInterceptor在DispatcherServlet#doDispatch方法中被调用,每个方法的调用时机如
下。
o preHandle:在调用接口方法之前被调用。
o postHandle:在接口方法执行完成并返回ModelAndView时被调用。
oafterCompletion:在接口方法执行完成时被调用,无论执行成功或发生异常都会被调用。
因此,Sentinel可以借助HandlerInterceptor与SpringMVC框架整合,在HandlerInterceptor#preHandle方法中调用ContextUtil#enter方法及SphU#entry方法,在afterCompletion方法中根据方法参数ex是否为空来处理异常情况,并且完成Entry#exit方法及ContextUtil#exit方法的调用。
SentinelWebInterceptor是
AbstractSentinelInterceptor的子类,而preHandle方法与afterCompletion方法在父类中实现,其自身只实现父类定义的一个获取资源名称的抽象方法,即getResourceName方法。getResourceName方法的源码如下。
资源名称的生成过程如下。
① 从HttpServletRequest参数的属性中获取HandlerMapping匹配的URL。
② 如果UrlCleaner不为空,则调用UrlCleaner的clean方法,该方法可将多个接口合并为一个接口。
③ 根据SentinelWebMvcConfig配置对象判断是否需要添加HttpMethod前缀,如果需要,则给资源名称拼接前缀。
提示:有些接口的名称形如“/hello/{name}”,如果直接从HttpServletRequest参数中获取请求路径,则每个请求获取的URL可能会不同,所以需要从HandlerMapping属性中获取。
UrlCleaner的clean方法可将多个接口合并为一个接口,例如,若借助UrlCleaner将接口/user/create、/user/del和/user/update都改为/user/**,则可以实现3个接口使用同一个限流规则。一般来说,不建议添加HttpMethod前缀,因为如果接口使用@RequestMapping注解声明,那么想对该接口限流就需要配置多个限流规则。旧项目大多使用@RequestMapping注解声明接口方法。例如,对于接口/user/create,用户可能需要为此接口配置GET:/user/create、POST:/user/create等多个资源的限流规则。
由于
AbstractSentinelInterceptor的源码较多,因此分步骤分析。
AbstractSentinelInterceptor#preHandle方法的源码如下。
① 获取资源名称。
② 调用OriginParser#parseOrigin方法解析调用来源,如从请求头中获取S-user参数的值。
③ 调用ContextUtil#enter方法,调用链入口名称为
sentinel_spring_web_context。
④ 调用SphU#entry方法,资源类型为COMMON_WEB,流量类型为IN。
⑤ 将SphU#entry方法返回的Entry实例放入HttpServletRequest参数的属性表中,方便在
AbstractSentinelInterceptor#afterCompletion方法中取出。
⑥ 如果抛出BlockException,则说明当前请求被拒绝,需要调用handleBlockException方
法处理BlockException。
AbstractSentinelInterceptor#handleBlockException方法的源码如下。
AbstractSentinelInterceptor#handleBlockException方法实现的功能:若SentinelWebMvcConfig配置了BlockExceptionHandler,则调用BlockExceptionHandler#handle方法处理BlockException,否则将抛出BlockException,并由全局处理器处理。
AbstractSentinelInterceptor#afterCompletion方法的源码如下。
① 从HttpServletRequest参数的属性表中获取preHandle方法中的Entry实例。
② 调用
AbstractSentinelInterceptor#traceExceptionAndExit方法。
③ 调用ContextUtil#exit方法。
AbstractSentinelInterceptor#traceExceptionAndExit方法的源码如下。
AbstractSentinelInterceptor#traceExceptionAndExit方法实现的功能:当方法执行抛出异常时,调用Tracer#traceEntry方法统计异常指标数据。
本文给大家讲解的内容是深度解析微服务高并发适配主流框架:适配Spring MVC框架
- 下篇文章给大家讲解的内容是深度解析微服务高并发适配主流框架:适配OpenFeign框架
- 觉得文章不错的话,可以点赞关注转发一下哈~
- 感谢大家的支持
相关推荐
- 用Deepseek扩写土木工程毕业论文实操指南
-
用Deepseek扩写毕业论文实操指南一、前期准备整理现有论文初稿/提纲列清楚论文核心框架(背景、现状、意义、方法、数据、结论等)梳理好关键文献,明确核心技术路线二、Deepseek扩写核心思路...
- 985学霸亲授,DeepSeek也能绘6大科研图表,5分钟就出图
-
在实验数据处理中,高效可视化是每个科研人的必修课。传统绘图软件操作复杂、耗时费力,而智能工具DeepSeek的出现彻底改变了这一现状。本文将详解如何用DeepSeek一键生成六大科研常用图表,从思维导...
- AI写论文刷屏?大学生正在丢掉的思考力
-
一、宿舍深夜:当论文变成"Ctrl+C+V"凌晨两点的大学宿舍,小王对着电脑屏幕叹气。本该三天前开始写的近代史论文,此刻还一片空白。他熟练打开某AI写作网站,输入"论五四运动的...
- Grok在辅助论文写作上能不能既“聪明”又“可怕”?!
-
AcademicIdeas-学境思源AI初稿写作随着人工智能技术的飞速发展,论文写作这一学术任务正迎来新的助力。2025年2月18日,美国xAI公司推出了备受瞩目的Grok3模型,其创始人埃隆·...
- 大四论文沟通场景!音频转文字难题听脑AI来化解
-
大四学生都知道,写论文时和导师沟通修改意见,简直是“过关斩将”。电话、语音沟通完,想把导师说的修改方向、重点要求记下来,麻烦事儿可不少。手写记不全,用普通录音转文字工具,转完还得自己慢慢找重点,稍不注...
- 论文写作 | 技术路线图怎么画?(提供经典优秀模板参考)
-
技术路线图是一种图表或文字说明,用于描述研究目标、方法和实施计划。它展示了研究的整体框架和步骤,有助于读者理解研究的逻辑和进展。在课题及论文中,技术路线图是常见的一部分,甚至是一个类似心脏一样的中枢器...
- 25年信息系统项目管理师考试第2批论文题目写作建议思路框架
-
25年信息系统项目管理师考试第2批论文题目写作建议思路框架--马军老师
- 微信购物应尽快纳入法律框架(微信购物管辖)
-
符向军近日,甘肃省工商行政管理局发布《2016年上半年信息分析报告》。报告显示,微信网购纠纷迅猛增长,网络购物投诉呈上升趋势。投诉的主要问题有出售的商品质量不过关、消费者通过微信付款后对方不发货、购买...
- 泛珠三角区域网络媒体与腾讯微信签署《战略合作框架协议》
-
新海南客户端、南海网7月14日消息(记者任桐)7月14日上午,参加第四届泛珠三角区域合作网络媒体论坛的区域网络媒体负责人及嘉宾一行到腾讯微信总部座谈交流,并签署《战略合作框架协议》(以下简称《框架协...
- 离线使用、植入微信-看乐心Mambo手环如何打破框架
-
从2014年开始智能手环就成功进入人们的生活,至今已经演变出数据监测、信息推送、心率监测等诸多五花八门的功能,人们选择智能手环并不指望其能够改变身体健康情况,更多的是通过数据来正视自身运动情况和身体健...
- 华专网络:如何零基础制作一个网站出来?
-
#如何零基础制作一个网站出来?#你是不是觉得网站建设很复杂,觉得自己是小白,需求不明确、流程搞不懂、怕被外包公司坑……这些问题我都懂!今天华专网络就用大白话给你捋清楚建站的全流程,让你轻松get网站制...
- WAIC2024丨明日上午9点,不见不散!共同探讨智能社会与全球治理框架
-
大咖云集,硕果闪耀WAIC2024世界人工智能大会智能社会论坛将于7月5日9:00-12:00与你相约直播间WAIC2024上海杨浦同济大学哔哩哔哩多平台同步直播探讨智能社会与全球治理框架WAIC...
- 约基奇:森林狼换来戈贝尔时大家都在嘲笑 他们的阵容框架很不错
-
直播吧5月4日讯西部季后赛半决赛,掘金将迎战森林狼,约基奇赛前接受采访。约基奇说道:“当蒂姆-康纳利(森林狼总经理、前掘金总经理&曾选中约基奇)做了那笔交易(换来戈贝尔)时,每个人都在嘲笑他...
- 视频号带货为什么一个流量都没有?顶级分析框架送给你
-
视频号带货为什么一个流量都没有?遇到问题,一定是步步来分析内容,视频号带货一个流量都没有,用另外一个意思来讲,就可以说是零播放。为什么视频号带货一个流量都没有?跟你说再多,都不如来个分析框架。1、是否...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- MVC框架 (46)
- spring框架 (46)
- 框架图 (58)
- flask框架 (53)
- quartz框架 (51)
- abp框架 (47)
- jpa框架 (47)
- laravel框架 (46)
- springmvc框架 (49)
- 分布式事务框架 (65)
- scrapy框架 (56)
- shiro框架 (61)
- 定时任务框架 (56)
- java日志框架 (61)
- JAVA集合框架 (47)
- grpc框架 (55)
- ppt框架 (48)
- 内联框架 (52)
- winform框架 (46)
- gui框架 (44)
- cad怎么画框架 (58)
- ps怎么画框架 (47)
- ssm框架实现登录注册 (49)
- oracle字符串长度 (48)
- oracle提交事务 (47)