讀古今文學網 > Spring Boot實戰 > 7.2 連接Actuator的遠程shell >

7.2 連接Actuator的遠程shell

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命令的輸出,將其放入你喜歡的工具進行閱讀或格式化。