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