導語
JMX(Java Management Extensions,即Java管理擴展)是一個爲應用程序、設備、系統等植入管理功能的框架。JMX可以跨越一系列異構操作系統平臺、系統體系結構和網絡傳輸協議,靈活的開發無縫集成的系統、網絡和服務管理應用。
JMX在Java編程語言中定義了應用程序以及網絡管理和監控的體系結構、設計模式、應用程序接口以及服務。通常使用JMX來監控系統的運行狀態或管理系統的某些方面,比如清空緩存、重新加載配置文件等
優點是可以非常容易的使應用程序被管理
伸縮性的架構使每個JMX Agent服務可以很容易的放入到Agent中,每個JMX的實現都提供幾個核心的Agent服務,你也可以自己編寫服務,服務可以很容易的部署,取消部署。
主要作用是提供接口,允許有不同的實現
文章目錄
JMX簡介
JMX 最常見的場景是監控Java程序的基本運行狀況,任何Java程序都可以開啓JMX,然後使用Java監控工具來進行查看。爲Java應用程序開啓JMX非常簡單,之主要在運行的Java程序的命令後面加入下面這些命令即可
-Djava.rmi.server.hostname=127.0.0.1
-Dcom.sun.management.jmxremote.port=1000
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
然後就可以通過監控工具看到有關的內容。例如使用Java自帶JConsole 通過JMX展示的信息,可以獲取到內存情況、線程情況、類加載情況等等
當然在JMX中它所能提供的功能還遠遠不止這些,針對一些具體程序的專有信息也提供了響應的接口,並且可以在JConsole中進行展示。也就是說在編寫代碼的時候可以把信息封裝到一個MBean的Java 對象中,然後JConsole會連接到JMX服務,識別MBean並且在圖形化界面中進行展示。
從抽象的角度出發類似於瀏覽器發送一個請求給服務器,然後服務器返回對應的請求數據。從某種意義上講,所有的有關JVM的監控機器,與JMX的通信原理與這個類似,只不過不是通過HTTP協議,而是基於一種客戶端服務器的工作模式。這種工作模式相對於HTTP來說,JMX實現起來相對會比較簡單。例如如果需要知道服務器上運行中程序的相關信息,執行了多少次數據庫操作、任務隊列中有多少個任務等待處理等等。
在日常的工作中最常用的處理方式就是在應用程序中啓動一個HTTP服務,類似於SpringBoot的監控,當收到來自客戶端的請求的時候返回一些HTTP處理的信息,然後轉換成JSON格式的數據返回給客戶端,客戶端會解析這個JSON數據來進行展示。JMX也是基於這種模式,只不過就是數據交換方式有所不同。下面就來看看在Zookeeper中怎麼實現這個操作的。
在ZK中如何使用
首先在org.apache.zookeeper.jmx包中就是Zookeeper對於JMX的操作進行了封裝。如下代碼所示
第一步需要定義一個戰士MBean信息的接口類
由於在這裏是對JMX的擴展並沒有嚴格的按照MBean這種方式進行接口編寫。在代碼註釋中也看到了有關的說明。
/**
* Zookeeper MBean info interface. MBeanRegistry uses the interface to generate
* JMX object name.
*/
public interface ZKMBeanInfo {
/**
* @return a string identifying the MBean
*/
public String getName();
/**
* If isHidden returns true, the MBean won't be registered with MBean server,
* and thus won't be available for management tools. Used for grouping MBeans.
* @return true if the MBean is hidden.
*/
public boolean isHidden();
}
第二步基於接口實現具體的MBean
如圖所示在Zookeeper中其實對於很多的地方都進行了監控。所以具體實現的Bean對象也是有很多。可以根據Bean的名稱來獲取到具體都是支持哪些內容的監控
第三步在程序的某個地方需要啓動JMX的服務,並且將上面這些Bean註冊到其中。
在Zookeeper中的org.apache.zookeeper.jmx.MBeanRegistry 類就是提供了這個功能在這類中有一個register()方法,如圖所示,由於代碼複製在這個地方會變形,所以使用了圖片的方式。
上面代碼最爲關鍵的一個地方就是下面這行代碼,有了這行代碼,在JConsole中就可以看到其中有那些操作。
在上面代碼中加入一些LOG日誌,使用DEBUG級別啓動來查看最終的效果
結果如下
&emps;由於截圖的原因,這裏截圖比較小。需要的話可以點擊圖片進行放大。會看到這裏注入的是主線程本身和一個DataTreeBean。在上面截圖中也看到的DataTreeBean。但是實際上會看到 它的名稱是
其名稱 org.apache.ZooKeeperService:name0=StandaloneServer_port2181,name1=InMemoryDataTree 也就是說我們要使用JConsole連接之後找到這兩個其中一個就說明我們的分析是正確的。如果兩個都找到就說明這個機制是沒有問題的。
JConsole分析
在配置好Java環境變量的任意命令行中輸入
jconsole
然後就進入到了如下的頁面中
選擇對應的線程雙擊連接會看到如下的界面找到MBean即可
會看到確實有來自Zookeeper的MBean點擊之後會看到
到這裏所有的分析都很清楚,到這裏會看到,這裏爲什麼會使用這個機制,或者說在Zookeeper中使用這個機制是需要做什麼樣的操作,下面就進入分析階段
Zookeeper中爲什麼會使用JMX
前面的分析中提到了一個方法Zookeeper中的register()方法,下圖展示了都是在什麼地方調用了這個方法,調用這個方法之後分別都進行的操作是什麼。根據上面的分析知道,在啓動的時候注入了兩個MBean這個是通過單機模式啓動的。
開始注入 JMX MBean org.apache.zookeeper.server.ZooKeeperServerBean@670b40af 其名稱 org.apache.ZooKeeperService:name0=StandaloneServer_port2181
開始注入 JMX MBean org.apache.zookeeper.server.DataTreeBean@46daef40 其名稱 org.apache.ZooKeeperService:name0=StandaloneServer_port2181,name1=InMemoryDataTree
下面來看看集羣模式啓動的時候回注入那些操作,從下面的結果中可以看到,集羣模式啓動的時候,所注入MBean的內容要比單機模式啓動的時候注入的MBean要多,而這些MBean從內容上來看都是與Leader的選舉相關的東西。而在下面圖中展示的註冊方法調用的時候也確實前三個就是對Leader選舉操作有關的內容。也就是說其實在Zookeeper集羣中,是通過這種方式來管理集羣中所有的節點數據屬性存儲
開始注入 JMX MBean org.apache.zookeeper.server.quorum.QuorumBean@2c647f16 其名稱 org.apache.ZooKeeperService:name0=ReplicatedServer_id1
開始注入 JMX MBean org.apache.zookeeper.server.quorum.LocalPeerBean@6c0dc17b 其名稱 org.apache.ZooKeeperService:name0=ReplicatedServer_id1,name1=replica.1
開始注入 JMX MBean org.apache.zookeeper.server.quorum.RemotePeerBean@1356e8a 其名稱 org.apache.ZooKeeperService:name0=ReplicatedServer_id1,name1=replica.2
開始注入 JMX MBean org.apache.zookeeper.server.quorum.RemotePeerBean@7ff0e9e 其名稱 org.apache.ZooKeeperService:name0=ReplicatedServer_id1,name1=replica.3
開始注入 JMX MBean org.apache.zookeeper.server.quorum.LeaderElectionBean@2d9461d5 其名稱 org.apache.ZooKeeperService:name0=ReplicatedServer_id1,name1=replica.1,name2=LeaderElection
總結
通過JMX技術來支持整個的Zookeeper集羣的信息維護,可以減少通過網絡傳入或者是IO操作帶來的傳輸效率上的消耗,將更多的性能轉而提供給其他的操作。對於基礎信息的維護再也不用多消耗其他資源而是由語言本身的特性來完成。同時利用這種操作可以通過JConsole來管理進行監控操作。在很多的場景下都是比較適用的。這也爲後續系統性能監控提供了一種解決方案。當然有優勢就有這個優勢所來帶的不足,希望可以辯證的使用技術組合構建高效工具