Arthas實踐--獲取到Spring Context,而後隨心所欲

背景
Arthas 是Alibaba開源的Java診斷工具,深受開發者喜好。html

https://github.com/alibaba/ar...
Arthas提供了很是豐富的關於調用攔截的命令,好比 trace/watch/monitor/tt 。可是不少時候咱們在排查問題時,須要更多的線索,並不僅是函數的參數和返回值。
好比在一個spring應用裏,想獲取到spring context裏的其它bean。若是能隨意獲取到spring bean,那就能夠「隨心所欲」了。git

下面介紹如何利用Arthas獲取到spring context。github

Demo: https://github.com/hengyunabc...web

Arthas快速開始:https://alibaba.github.io/art...spring

使用tt命令獲取到spring context
Demo是一個spring mvc應用,請求會通過一系列的spring bean處理,那麼咱們能夠在spring mvc的類裏攔截到一些請求。mvc

啓動Demo: mvn spring-boot:runapp

使用Arthas Attach成功以後,執行tt命令來記錄RequestMappingHandlerAdapter#invokeHandlerMethod的請求ide

tt -t org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter invokeHandlerMethod
而後訪問一個網頁: http://localhost:8080/函數

能夠看到Arthas會攔截到這個調用,index是1000,而且打印出:spring-boot

$ watch com.example.demo.Test * 'params[0]@sss'
$ tt -t org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter invokeHandlerMethod
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 101 ms.
INDEX TIMESTAMP COST(ms IS-RE IS-EX OBJECT CLASS METHOD

)        T      P

1000 2019-01-27 16:31 3.66744 true false 0x4465cf70 RequestMappingHandlerAda invokeHandlerMethod

:54                                                   pter

那麼怎樣獲取到spring context?

能夠用tt命令的-i參數來指定index,而且用-w參數來執行ognl表達式來獲取spring context:

$ tt -i 1000 -w 'target.getApplicationContext()'
@AnnotationConfigEmbeddedWebApplicationContext[

reader=@AnnotatedBeanDefinitionReader[org.springframework.context.annotation.AnnotatedBeanDefinitionReader@35dc90ec],
scanner=@ClassPathBeanDefinitionScanner[org.springframework.context.annotation.ClassPathBeanDefinitionScanner@72078a14],
annotatedClasses=null,
basePackages=null,

]
Affect(row-cnt:1) cost in 7 ms.
從spring context裏獲取任意bean
獲取到spring context以後,就能夠獲取到任意的bean了,好比獲取到helloWorldService,並調用getHelloMessage()函數:

$ tt -i 1000 -w 'target.getApplicationContext().getBean("helloWorldService").getHelloMessage()'
@String[Hello World]
Affect(row-cnt:1) cost in 5 ms.
更多的思路
在不少代碼裏都有static函數或者static holder類,順滕摸瓜,能夠獲取不少其它的對象。好比在Dubbo裏經過SpringExtensionFactory獲取spring context:

$ ognl '#context=@com.alibaba.dubbo.config.spring.extension.SpringExtensionFactory@contexts.iterator.next, 
#context.getBean("userServiceImpl").findUser(1)'
@User[
    id=@Integer[1],
    name=@String[Deanna Borer],
]

本文做者:橫雲斷嶺

閱讀原文

本文爲雲棲社區原創內容,未經容許不得轉載。

相關文章
相關標籤/搜索