如何使用JMX來管理程序?

什麼是JMX

JMX,全稱Java Management Extensions,用於咱們管理和監控java應用程序。JMX有如下用途:html

  1. 監控應用程序的運行狀態和相關統計信息。
  2. 修改應用程序的配置(無需重啓)。
  3. 狀態變化或出錯時通知處理。

舉個例子,咱們能夠經過jconsole監控應用程序的堆內存使用量、線程數、類數,查看某些配置信息,甚至能夠動態地修改配置。另外,有時還能夠利用JMX來進行測試。java

本文將介紹如下內容:git

  1. 什麼是JMX
  2. JMX的基礎架構;
  3. 如何使用JMX

JMX的基礎架構

首先,看下這種圖:github

JMX的基礎架構

這裏簡單介紹下這三層結構:安全

層次 描述
Instrumentation 主要包括了一系列的接口定義和描述如何開發MBean的規範。在JMXMBean表明一個被管理的資源實例,經過MBean中暴露的方法和屬性,外界能夠獲取被管理的資源的狀態和操縱MBean的行爲
Agent 用來管理相應的資源,而且爲遠端用戶提供訪問的接口。該層的核心是MBeanServer,全部的MBean都要向它註冊,才能被管理。註冊在MBeanServer上的MBean並不直接和遠程應用程序進行通訊,他們經過協議適配器(Adapter)和鏈接器(Connector)進行通訊。
Distributed 定義了一系列用來訪問Agent的接口和組件,包括AdapterConnector的描述。注意,AdapterConnector的區別在於:Adapter是使用某種Internet協議來與Agent得到聯繫,Agent端會有一個對象 (Adapter)來處理有關協議的細節。好比SNMP AdapterHTTP Adapter。而Connector則是使用相似RPC的方式來訪問Agent,在Agent端和客戶端都必須有這樣一個對象來處理相應的請求與應答。好比RMI Connector

怎麼使用JMX

需求

  1. 測試本地鏈接管理MBean
  2. 測試遠程鏈接管理MBean,包括代碼實現、啓動參數、啓動參數+配置文件等方式。
  3. 如何開啓帳號密碼認證。

工程環境

JDK:1.8.0_231架構

maven:3.6.1eclipse

IDE:eclipse 4.12maven

主要步驟

  1. 定義MBean接口,並編寫實現類;
  2. 註冊MBeanMBeanServe
  3. 啓動程序;
  4. 使用jconsole鏈接管理該程序。

建立項目

項目類型Maven Project,打包方式jar測試

引入依賴

入門案例暫時不須要引入外部依賴。this

編寫MBean接口

注意,接口名格式必須爲:被管理的類的類名+MBean

public interface UserMBean {

    String getName();

    void setName(String name);

    Integer getAge();

    void setAge(Integer age);

    String getAddress();

    void setAddress(String address);
    
    String sayHello();
    
}

編寫實現類

這裏簡單實現下就行。當屬性被設置時,會在控制檯打印相關內容。

public class User implements UserMBean {

    private String name;

    private Integer age;

    private String address;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        System.err.println("set name to " + name);
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        System.err.println("set age to " + age);
        this.age = age;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        System.err.println("set address to " + address);
        this.address = address;
    }

    public String sayHello() {
        return "Hello!";
    }

}

本地鏈接

註冊MBean

路徑爲test目錄下的cn.zzs.jmx,類名JMXTest。只有將MBean註冊到MBeanServerMBean才能被管理。MBean的對象名格式爲:域名:type=MBean類型,name=MBean名稱。其中,域名MBean名稱能夠隨便取,對象名中除了type,咱們還能夠自定義其餘條目,以方便管理。

注意,爲了讓這個程序持續工做,這裏強制線程睡眠。

public static void main(String[] args) throws Exception {
        // 設置MBean對象名,格式爲:「域名:type=MBean類型,name=MBean名稱」
        String jmxName = "cn.zzs.jmx:type=user,name=user001";
        // 得到MBeanServer
        MBeanServer server = ManagementFactory.getPlatformMBeanServer();
        // 建立ObjectName
        ObjectName objectName = new ObjectName(jmxName);
        // 建立並註冊MBean
        server.registerMBean(new User(), objectName);
        Thread.sleep(60 * 60 * 1000);
    }

測試

啓動程序,打開jconsole(在JDK安裝路徑的bin目錄下),出現以下界面,這時能夠看到咱們測試的程序:

jconsole_01.png

選擇JMXTest後,點擊鏈接,這時若是彈窗「安全鏈接失敗,是否以不安全的方式重試」,這是由於咱們沒有開啓ssl加密,能夠不去理會它。點擊不安全的鏈接,便可進入如下頁面:

jconsole_02.png

經過這個窗口咱們能夠查看程序的堆內存使用量、線程、類等信息,咱們再點擊MBean選項卡,能夠看到咱們編寫的MBean,咱們定義的對象名爲cn.zzs.jmx:type=user,name=user001,其中cn.zzs.jmx做爲第一級目錄,type=user做爲第二級目錄,name=user001對應具體的對象,它具有屬性和操做。其中,usersettergetter方法被合併在了一塊兒。

jconsole_03.png

經過這個界面,咱們能夠查看和設置user的屬性,或調用它的方法。例如,我先設置name的值,經過程序控制臺能夠看到該方法被調用了:

jconsole_04.png

接着我再調用sayHello方法:

jconsole_05.png

經過以上例子,能夠看到,JMX仍是很是有用的,除了查看類的屬性外,咱們還能夠在不重啓程序的狀況下進行配置或執行某些方法。

以上例子中,咱們只能在本地訪問JMXTest,接下來介紹如何實現遠程鏈接。本文介紹三種方式,可根據實際場景選擇:

  1. 代碼實現;
  2. 啓動參數配置;
  3. 啓動參數+文件配置。

遠程鏈接方式一(代碼實現)

本例子在本地鏈接的基礎上修改。

開啓遠程鏈接

注意,這裏的localhost最好改成你的IP,否則可能鏈接不上。

public static void main(String[] args) throws Exception {
        // 設置MBean對象名,格式爲:「域名:type=MBean類型,name=MBean名稱」
        String jmxName = "cn.zzs.jmx:type=user,name=user001";
        // 得到MBeanServer
        MBeanServer server = ManagementFactory.getPlatformMBeanServer();
        // 建立ObjectName
        ObjectName objectName = new ObjectName(jmxName);
        // 建立並註冊MBean
        server.registerMBean(new User(), objectName);
        // 註冊一個端口
        LocateRegistry.createRegistry(9999);
        // URL路徑的結尾能夠隨意指定,但若是須要用Jconsole來進行鏈接,則必須使用jmxrmi
        JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:9999/jmxrmi");
        JMXConnectorServer jcs = JMXConnectorServerFactory.newJMXConnectorServer(url, null, server);
        jcs.start();
    }

測試

打開jconsole,使用遠程鏈接方式,輸入咱們設置好的ip和端口,點擊鏈接便可:

jconsole_06.png

遠程鏈接方式二(啓動參數)

本例子在本地鏈接的基礎上修改。在程序啓動時加入如下啓動參數,也能夠實現遠程鏈接:

-Djava.rmi.server.hostname=<your-ip> // 你的ip
-Dcom.sun.management.jmxremote.port=9999 // 開放端口號
-Dcom.sun.management.jmxremote.local.only=false // 是否只能本地鏈接
-Dcom.sun.management.jmxremote.ssl=false // 是否使用ssl加密
-Dcom.sun.management.jmxremote.authenticate=false // 是否須要帳號密碼認證

能夠看到,咱們關閉了ssl加密和帳號密碼認證。

遠程鏈接方式三(啓動參數+配置文件)

本例子在本地鏈接的基礎上修改。

啓動參數

在程序啓動時加入如下啓動參數,並結合配置文件,也能夠實現遠程鏈接:

-Dcom.sun.management.config.file=D:/growUp/git_repository/jdk-extend/02-jmx-demo/src/main/resources/config/management.properties // 配置文件路徑
-Djava.rmi.server.hostname=<your-ip>

配置文件

在配置文件中配置如下參數:

# 開放端口號
com.sun.management.jmxremote.port=9999
# 是否只能本地鏈接
com.sun.management.jmxremote.local.only=false
# 是否使用ssl加密
com.sun.management.jmxremote.ssl=false
# 是否須要帳號密碼認證
com.sun.management.jmxremote.authenticate=false

關於management.propertie的詳細配置,能夠在$JRE/lib/management/目錄下找到。其實,當咱們在啓動參數中存在如下參數時,默認會去讀取$JRE/lib/management/management.properties的配置文件。

#    -Dcom.sun.management.jmxremote.port=<port-number>
# or -Dcom.sun.management.snmp.port=<port-number>

設置帳戶密碼

實際使用中,咱們更但願採用安全加密的方式來監控程序,這個時候咱們能夠設置ssl加密或帳號密碼認證。ssl加密的本文暫時不擴展,這裏只介紹如何設置帳號密碼認證。

啓動參數

和上個例子同樣,須要設置以下啓動參數:

-Dcom.sun.management.config.file=D:/growUp/git_repository/jdk-extend/02-jmx-demo/src/main/resources/config/management.properties
-Djava.rmi.server.hostname=<your-ip>

配置文件

配置文件中加入如下內容:

# 開放端口號
com.sun.management.jmxremote.port=9999
# 是否只能本地鏈接
com.sun.management.jmxremote.local.only=false
# 是否使用ssl加密
com.sun.management.jmxremote.ssl=false
# 是否須要帳號密碼認證
com.sun.management.jmxremote.authenticate=true
# 密碼文件路徑
com.sun.management.jmxremote.password.file=D:/growUp/git_repository/jdk-extend/02-jmx-demo/src/main/resources/config/jmxremote.password
# 權限文件路徑
com.sun.management.jmxremote.access.file=D:/growUp/git_repository/jdk-extend/02-jmx-demo/src/main/resources/config/jmxremote.access

在此以前,咱們須要配置好密碼文件和權限文件:

密碼文件

ZhangZiSheng001 root

權限文件

ZhangZiSheng001 readwrite

測試

打開jconsole,選擇遠程鏈接,並輸入帳號密碼,點擊鏈接便可:

jconsole_07.png

參考資料

相關源碼請移步:https://github.com/ZhangZiSheng001/02-jmx-demo

本文爲原創文章,轉載請附上原文出處連接:http://www.javashuo.com/article/p-fmrknyqt-a.html

相關文章
相關標籤/搜索