1. 概述
通常的做法是監控 Java 應用程序的性能和穩定性。Spring Boot 通過 Actuators 提供此監控功能。然而,我們可能需要更精細的控制或一種輕量級的實現方式來達到相同的目的。
Jolokia 幫助我們通過 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. 版本 命令
請導航到以下端點:
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=false4.2. 使用安全規則限制訪問
我們可以通過創建 jolokia-access.xml文件並將其放置在類路徑中來配置安全規則。
讓我們創建一個,以通過用户 IP 地址來安全地啓用 Jolokia 訪問:
<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 和其屬性/操作。