將 Jolokia 與 Spring Boot 集成
1. 概述
監控 Java 應用程式的效能和穩定性是一種常見的做法。 Spring Boot 透過 Actuators 提供這種監控功能。然而,我們可能需要更細粒度的控製或輕量級的方法來實現相同的目的。
J olokia幫助我們透過 API 端點監控應用程序,同時提供批量操作和安全機制等功能。
在本教程中,我們將研究如何將 Jolokia 整合到 Spring Boot 應用程式中。
2. 設定
我們現在來看看在我們的應用程式中啟用 Jolokia 所需的步驟。
2.1.依賴
首先,我們需要新增Jolokia依賴項才能使用 Jolokia,它會新增傳遞依賴項和服務庫:
<dependency>
<groupId>org.jolokia</groupId>
<artifactId>jolokia-support-spring</artifactId>
<version>2.2.1</version>
</dependency>
2.2.啟用 Jolokia
預設情況下,Spring Boot Actuator 僅公開有限的端點。為了啟用 Jolokia,我們需要在應用程式的屬性檔案中進行設定:
management.endpoints.web.exposure.include=jolokia
現在,新增了依賴項並配置了應用程序,當我們啟動 Spring Boot 應用程式時就可以存取 Jolokia。
3. 參觀 Jolokia
Jolokia 提供了幾個指令來完成各種任務:
-
read
:讀取 MBean 屬性 -
write
:設定 MBean 屬性 -
exec
:在 MBean 上執行操作 -
list
:列出可用的 MBean 及其屬性和操作 -
search
:搜尋 MBean -
version
:版本和伺服器訊息 -
notification
:訂閱並接收通知
接下來,讓我們看看其中一些命令。
3.1. version
命令
讓我們導航到以下端點:
http://localhost:8080/actuator/jolokia/version
我們應該得到以下回應:
我們可以看到,我們獲得了一些有關版本的信息,例如它是否安全,是否有代理等等。
3.2. list
指令
現在,讓我們透過執行list
命令來取得所有可用 MBean 的清單:
http://localhost:8080/actuator/jolokia/list
我們可以看到可用 bean 的列表,以及每個 bean 上允許的操作:
3.3. read
命令
我們將嘗試使用read
命令來獲取有關堆記憶體使用情況的資訊:
http://localhost:8080/actuator/jolokia/read/java.lang:type=Memory/HeapMemoryUsage
正如我們在回應中看到的, HeapMemoryUsage
屬性的不同值是可見的:
3.4. exec
指令
讓我們透過執行exec
指令來啟動垃圾收集:
http://localhost:8080/actuator/jolokia/exec/java.lang:type=Memory/gc
我們收到了200
狀態代碼,這表示垃圾收集指令已被接受:
獲取資訊或對任何公開的 MBean 發起操作都很容易。然而,我們需要確保只有有限數量具有存取權限的人員才能執行預期的操作。
4. 保護 Jolokia
正如我們所觀察到的,Jolokia 預設公開所有 JMX 資源。這肯定會帶來問題,因為所有用戶都被允許執行可能危害應用程式的所有操作。為了避免這種情況,我們需要保護端點。
4.1.停用 Jolokia 端點
在生產伺服器上,我們可以透過在應用程式屬性中設定以下內容來完全停用 Jolokia:
management.endpoint.jolokia.enabled=false
4.2.使用安全規則限制訪問
我們可以透過建立jolokia-access.xml
檔案並將其放在 classpath 中來設定安全規則。
讓我們建立一個,以便 Jolokia 存取由使用者的 IP 位址保護:
<restrict>
<remote>
<host>127.0.0.1</host>
</remote>
</restrict>
當我們嘗試存取 Jolokia 端點時,我們得到了預期的錯誤:
接下來,我們將嘗試限制某些命令或操作。例如,我們只允許read
和list
命令:
<commands>
<command>read</command>
<command>list</command>
</commands>
現在,讓我們嘗試 POST 我們之前嘗試過的垃圾收集的exec
命令:
我們可以看到,由於我們只允許read
和list
操作,因此exec
命令是被禁止的。
最後,我們還可以允許或拒絕某些 MBean 操作,這些操作甚至可以覆寫commands
部分中的條目。
<allow>
<mbean>
<name>java.lang:type=Memory</name>
<operation>gc</operation>
</mbean>
</allow>
<deny>
<mbean>
<name>jdk.management.jfr:type=FlightRecorder</name>
<attribute>*</attribute>
<operation>*</operation>
</mbean>
</deny>
我們已經允許在Memory
MBean 上進行gc
操作。此外,在deny
部分,我們拒絕了FlightRecorder
MBean 上的所有屬性和操作。
5. 結論
在本文中,我們學習如何將 Jolokia 與 Spring Boot 整合。首先,我們了解了初始設定和一些基本命令。
接下來,我們探討如何保護各種 MBean 的存取和操作,即透過限制 IP 位址、將命令列入白名單以及允許或拒絕某些 MBean 及其屬性/操作。
與往常一樣,完整的原始程式碼可在 GitHub 上取得。