當前位置:編程學習大全網 - 源碼下載 - 2018-05-27 Spring攔截器和Skywalking沖突

2018-05-27 Spring攔截器和Skywalking沖突

skywalking-5.0.0-alpha

已經修復的版本

skywalking-5.0.0-beta

在觀察項目中的日誌時,發現

有壹個攔截全部Controller方法的日誌切面WebRequestInterceptor類

該方法會攔截skywalking的某個方法。

導致每次Web請求,Controller雖然被執行壹次,但是doAround會被執行兩次。

如果在doAround中做了某些身份認證,Token校驗之類的,則產生了不必要的重復請求。

在doAround中打印:

會發現調用了getSkyWalkingDynamicField。

這個方法由skywalking-agent的InstMethodsInter 生成的:

SkyWalkingAgent通過

找到壹個具體實現類

然後調用define

然後生成了InstMethodsInter

這個類intercept的方法中:

interceptor.afterMethod對應

GetBeanInterceptor 的 afterMethod, 這裏會調用getSkyWalkingDynamicField ,但是 這裏會被WebRequestInterceptor攔截!!!

getSkyWalkingDynamicField出自EnhancedInstance

在InstMethodsInter.afterMethod調用getSkyWalkingDynamicField的時候,不小心會被Spring的Aspect攔截。

導致重復調用了壹次WebRequestInterceptor的doAround。

改寫JoinPoint,並排除getSkyWalkingDynamicField方法

果然壹個月之前官方已經修復了這個BUG

修復的原理就是把Spring的org.springframework.aop.support.MethodMatchers 的matches 靜態方法給增強了,那就是讓Spring忽略EnhancedInstance接口的所有方法!

這方法既粗暴,又優雅,非常值得學習。

相關鏈接

issue #1114

pull #1118

  • 上一篇:煉焦煤期貨合約主要質量指標設計說明
  • 下一篇:求API Hook 例子(VB的)
  • copyright 2024編程學習大全網