桥泰

导航

 

 



创建controller,会初始化context,顺带的创建了EntranceNode

spring-cloud-starter-alibaba-sentinel:2.2.6.RELEASSE
META-INF
spring.factories
SentinelWebAutoConfiguration.java 实现了WebMvcConfigurer(springMvc自动装配,拦截器)
  接口WebMvcConfigurer 可以进行实现springmvc自定义配置
  addInterceptor()

 


SentinelWebAutoConfiguration.java  ===》实例属性:SentinelWebInterceptor拦截器
addInterceptor()


SentinelWebInterceptor拦截器 ===》继承了AbstractSentinelInterceptor ===》实现了HandlerInterceptor

进入controller所有的请求被拦截

 

AbstractSentinelInterceptor ===》实现接口HandlerInterceptor 所有进入controller的请求都会被拦截

preHandle()  请求进入之前
afterCompletion 会在返回视图前执行

一、AbstractSentinelInterceptor#preHandle() 进入controller之前的动作
1、获取资源名
1.1 解析出origin,基于自定义的RequestOriginParser
2.1、统一资源名称webContextUnify默认为true,那么所有的springmvc请求路径会挂到“sentinel_spring_web_context”下,叫做统一入口,以“sentinel_spring_web_context”为contextName,
2.2 如果webContextUnify为false,那么就会以resourceName为contextName,也就是把controller作为入口EntranceNode
***流控模式下,链路模式,针对不同来源的两个链路做监控,采用默认的sentinel会给springmvc的所有请求设置同一个root资源(“sentinel_spring_web_context”),会导致链路模式失效。我们需要在application.yml中配置关闭web-context-unify: false,链路资源整合
3、构建上下文context
3.1 contextHolder是ThreadLocal,创建一个node(EntranceNode入口节点)
Constants.ROOT点击当前这个“sentinel_spring_web_context”节点为子元素,意味着一个微服务只有这一个ROOT
4、ContextUtil.enter(contextName, origin);执行完,入口有了
5、进入controller后,标记资源,创建SphU.entry(resourceName)
这里entry里面就会有一系列的插槽Slot,执行 ProcessorSlotChain 插槽链
数据统计==》创建节点==》限流判断

二、然后就是环绕执行

三、然后执行afterCompletion
释放 SphU.entry 本次入口请求

 



posted on 2025-06-10 12:32  桥泰  阅读(12)  评论(0)    收藏  举报