Actuator通過REST端點提供了不少非常有用的信息。另一個深入運行中應用程序內部的方式是使用遠程shell。Spring Boot集成了CRaSH,一種能嵌入任意Java應用程序的shell。Spring Boot還擴展了CRaSH,添加了不少Spring Boot特有的命令,提供了與Actuator端點類似的功能。
要使用遠程shell,只需加入遠程shell的起步依賴即可。你需要這樣的Gradle依賴:
compile(\"org.springframework.boot:spring-boot-starter-remote-shell\")
如果用Maven構建項目,你需要在pom.xml文件裡添加如下依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-remote-shell</artifactId>
</dependency>
如果要用Spring Boot CLI來運行你所開發的應用程序,則需要如下@Grab
註解:
@Grab(\"spring-boot-starter-remote-shell\")
添加了遠程shell依賴後,就可以構建並運行應用程序了。在啟動的時候,可以看到要寫進日誌的一行密碼。這行密碼所在的行大概是這樣的:
Using default security password: efe30c70-5bf0-43b1-9d50-c7a02dda7d79
與這個密碼搭配使用的用戶名是user。密碼本身是隨機生成的,每次運行應用程序時都會有所變化。
現在你可以通過SSH工具連接shell了,它監聽的端口號是2000。如果你用的是Unix的ssh
命令,那麼它看起來大概是這樣的:
~% ssh user@localhost -p 2000
Password authentication
Password:
. ____ _ __ _ _
/\\ / ___\'_ __ _ _(_)_ __ __ _
( ( )___ | \'_ | \'_| | \'_ / _` |
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
\' |____| .__|_| |_|_| |___, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v1.3.0.RELEASE) on habuma.local
>
太棒了!你已經連上shell了。現在應該做什麼?
遠程shell提供了24個可以在運行應用程序上下文中執行的命令,其中大部分都是CRaSH自帶的。但Spring Boot也添加了一些。表7-4列出了這些Spring Boot特有的命令。
表7-4 Spring Boot提供的CRaSH shell命令
命令
描述
autoconfig
生成自動配置說明報告,和/autoconfig端點輸出的內容類似,只是把JSON換成了純文本
beans
列出Spring應用程序上下文裡的Bean,與/beans端點輸出的內容類似
endpoint
調用Actuator端點
metrics
顯示Spring Boot的度量信息,與/metrics端點類似,但顯示的是實時更新的數據
讓我們看看如何使用這些Spring Boot添加的shell命令。
7.2.1 查看autoconfig
報告
autoconfig
命令生成了一個與Actuatord的/autoconfig端點類似的報告。圖7-1是autoconfig
命令輸出的內容截取。
圖 7-1 autoconfig
命令的輸出
如你所見,結果分為兩組——匹配和不匹配,和/autoconfig端點的結果一樣。實際上,唯一的顯著區別在於,autoconfig
命令輸出的是文本,而/autoconfig端點輸出的是JSON,其他都一樣。
我不打算去講CRaSH自己提供的shell命令,但你可能想把autoconfig
命令的輸出和CRaSH的less
命令用管道串起來:
> autoconfig | less
less
命令和Unix shell裡的同名命令很相似,能讓你穿梭於文件中。autoconfig
的輸出很長,但less
命令會讓它更容易讀取和查閱。
7.2.2 列出應用程序的Bean
autoconfig
shell命令的輸出和/autoconfig端點的輸出類似,但也有不同。對比之下,你會發現beans
命令的輸出和/beans端點的輸出一樣。截屏如圖7-2所示。
圖 7-2 beans
命令的輸出
和/beans端點一樣,beans
命令會以JSON格式列出Spring應用程序上下文裡所有的Bean,包括所依賴的Bean。
7.2.3 查看應用程序的度量信息
metricsshell
命令會輸出與Actuator的/metrics端點一樣的信息。/metrics端點以JSON格式輸出當前度量信息的快照,而metrics
命令則會接管shell,以實時儀表盤顯示結果。圖7-3就是metrics
命令的儀表盤。
圖 7-3 metrics
命令的儀表盤
metrics
命令的實時儀表盤很難在書裡以靜態圖片演示。但你可以試著想像一下,內存、堆、線程在不斷消耗和釋放,隨著類的加載,儀表盤裡顯示的數量也會隨之變化,以反映當前值。
一旦看完了metrics
命令提供的度量信息,按Ctrl+C就能回到shell了。
7.2.4 調用Actuator端點
你現在應該已經意識到了,並非所有的Actuator端點都有對應的shell命令。這是否意味著shell不能完全代替Actuator端點呢?是否仍要直接查詢這些端點來獲取Actuator提供的內部信息呢?雖然shell沒能完全匹配上這些端點,但endpoint
命令可以讓你在shell裡調用Actuator的端點。
首先,你要知道自己想調用哪個端點。在shell提示符中鍵入endpoint list
就能獲得端點的列表,如圖7-4所示。請注意,列表中的端點用的是它們的Bean名稱,而非URL路徑。
圖 7-4 獲得端點列表
如果想在shell裡調用其中某個端點,你可以使用endpoint invoke
命令,傳入不帶Endpoint後綴的Bean名稱。舉例來說,要調用健康檢查端點,可以在shell提示符裡鍵入endpoint invoke health
,如圖7-5所示。
圖 7-5 調用健康檢查端點
請注意,這些端點返回的信息都是原始格式的,即未格式化過的JSON文檔。雖然在shell裡調用Actuator的端點不錯,但輸出結果很難閱讀。就這個問題,自帶的功能幫不上忙。但如果愛折騰,你也可以創建一個自定義的CRaSH shell命令,通過管道接受未格式化的JSON,然後美化輸出。你總是可以剪切黏貼endpoint
命令的輸出,將其放入你喜歡的工具進行閱讀或格式化。