1.1 JMX概述
JMX--Java Management Extensions,即Java管理擴展,是一個(gè)為應用程序、設備、系統等植入管理功能的框架。JMX可以跨越一系列異構操作系統平臺、系統體系結構和網(wǎng)絡(luò )傳輸協(xié)議,靈活的開(kāi)發(fā)無(wú)縫集成的系統、網(wǎng)絡(luò )和服務(wù)管理應用。
JMX體系結構分為以下四個(gè)層次:
1)設備層(Instrumentation Level):主要定義了信息模型。在JMX中,各種管理對象以管理構件的形式存在,需要管理時(shí),向MBean服務(wù)器進(jìn)行注冊。該層還定義了通知機制以及一些輔助元數據類(lèi)。
2)代理層(Agent Level):主要定義了各種服務(wù)以及通信模型。該層的核心是一個(gè)MBean服務(wù)器,所有的管理構件都需要向它注冊,才能被管理。注冊在MBean服務(wù)器上管理構件并不直接和遠程應用程序進(jìn)行通信,它們通過(guò)協(xié)議適配器和連接器進(jìn)行通信。而協(xié)議適配器和連接器也以管理構件的形式向MBean服務(wù)器注冊才能提供相應的服務(wù)。
3)分布服務(wù)層(Distributed Service Level):主要定義了能對代理層進(jìn)行操作的管理接口和構件,這樣管理者就可以操作代理。然而,當前的JMX規范并沒(méi)有給出這一層的具體規范。
4)附加管理協(xié)議API:定義的API主要用來(lái)支持當前已經(jīng)存在的網(wǎng)絡(luò )管理協(xié)議,如SNMP、TMN、CIM/WBEM等。
1.2 設備層(Instrumentation Level)
該層定義了如何實(shí)現JMX管理資源的規范。一個(gè)JMX管理資源可以是一個(gè)Java應用、一個(gè)服務(wù)或一個(gè)設備,它們可以用Java開(kāi)發(fā),或者至少能用Java進(jìn)行包裝,并且能被置入JMX框架中,從而成為JMX的一個(gè)管理構件(Managed Bean),簡(jiǎn)稱(chēng)MBean。管理構件可以是標準的,也可以是動(dòng)態(tài)的,標準的管理構件遵從JavaBeans構件的設計模式;動(dòng)態(tài)的管理構件遵從特定的接口,提供了更大的靈活性。
該層還定義了通知機制以及實(shí)現管理構件的輔助元數據類(lèi)。
1.2.1 管理構件(MBean)
在JMX規范中,管理構件定義如下:它是一個(gè)能代表管理資源的Java對象,遵從一定的設計模式,還需實(shí)現該規范定義的特定的接口。該定義了保證了所有的管理構件以一種標準的方式來(lái)表示被管理資源。
管理接口就是被管理資源暴露出的一些信息,通過(guò)對這些信息的修改就能控制被管理資源。一個(gè)管理構件的管理接口包括:
1)能被接觸的屬性值;
2)能夠執行的操作;
3)能發(fā)出的通知事件;
4)管理構件的構建器。
管理構件通過(guò)公共的方法以及遵從特定的設計模式封裝了屬性和操作,以便暴露給管理應用程序。例如,一個(gè)只讀屬性在管理構件中只有Get方法,既有Get又有Set方法表示是一個(gè)可讀寫(xiě)的屬性。
其余的JMX的構件,例如JMX代理提供的各種服務(wù),也是作為一個(gè)管理構件注冊到代理中才能提供相應的服務(wù)。
JMX對管理構件的存儲位置沒(méi)有任何限制,管理構件可以存儲在運行JMX代理的Java虛擬機的類(lèi)路徑的任何位置,也可以從網(wǎng)絡(luò )上的任何位置導入。
JMX定義了四種管理構件:標準、動(dòng)態(tài)、開(kāi)放和模型管理構件。每一種管理構件可以根據不同的環(huán)境需要進(jìn)行制定。
1.標準管理構件 標準管理構件的設計和實(shí)現是最簡(jiǎn)單的,它們的管理接口通過(guò)方法名來(lái)描述。標準管理構件的實(shí)現依靠一組命名規則,稱(chēng)之為設計模式。這些命名規則定義了屬性和操作。檢查標準管理構件接口和應用設計模式的過(guò)程被稱(chēng)為內?。↖ntrospection)[22]。JMX代理通過(guò)內省來(lái)查看每一個(gè)注冊在MBean 服務(wù)器上的管理構件的方法和超類(lèi),看它是否遵從一定設計模式,決定它是否代表了一個(gè)管理構件,并辨認出它的屬性和操作。
2.動(dòng)態(tài)管理構件 動(dòng)態(tài)管理構件提供了更大的靈活性,它可以在運行期暴露自己的管理接口。它的實(shí)現是通過(guò)實(shí)現一個(gè)特定的接口DynamicMBean(如下圖)。
JMX代理通過(guò)getMBeanInfo方法來(lái)獲取該動(dòng)態(tài)管理構件暴露的管理接口,該方法返回的對象是MbeanInfo類(lèi)的實(shí)例,包含了屬性和操作的簽名。由于該方法的調用是發(fā)生在動(dòng)態(tài)管理構件向MBean服務(wù)器注冊以后,因此管理接口是在運行期獲取的。不同于標準管理構件,JMX代理不需要通過(guò)內省機制來(lái)確定動(dòng)態(tài)管理構件的管理接口。由于DynamicMBean的接口是不變的,因此可以屏蔽實(shí)現細節。由于這種在運行期獲取管理接口的特性,動(dòng)態(tài)管理構件提供了更大的靈活性。
3.開(kāi)放管理構件 開(kāi)放管理構件是一種專(zhuān)門(mén)化的動(dòng)態(tài)管理構件,其中所有的與該管理構件相關(guān)的參數、返回類(lèi)型和屬性都圍繞一組預定義的數據類(lèi)型(String、Integer、Float 等)來(lái)建立,并且通過(guò)一組特定的接口來(lái)進(jìn)行自我描述。JMX代理通過(guò)獲得一個(gè)OpenMBeanInfo對象來(lái)獲取開(kāi)放管理構件的管理接口,OpenMBeanInfo是MbeanInfo的子類(lèi)。
4.模型管理構件 模型管理構件也是一種專(zhuān)門(mén)化的動(dòng)態(tài)管理構件。它是預制的、通用的和動(dòng)態(tài)的 MBean 類(lèi),已經(jīng)包含了所有必要缺省行為的實(shí)現,并允許在運行時(shí)添加或覆蓋需要定制的那些實(shí)現。JMX規范規定該類(lèi)必須實(shí)現為javax.management.modelmbean.RequiredModelMBean,管理者要做的就是實(shí)例化該類(lèi),并配置該構件的默認行為并注冊到JMX代理中,即可實(shí)現對資源的管理。JMX代理通過(guò)獲得一個(gè)ModelMBeanInfo對象來(lái)獲取管理接口。
模型管理構件具有以下新的特點(diǎn)[23]:
1)持久性
定義了持久機制,可以利用Java的序列化或JDBC來(lái)存儲模型MBean的狀態(tài)。
2)通知和日志功能
能記錄每一個(gè)發(fā)出的通知,并能自動(dòng)發(fā)出屬性變化通知。
3)屬性值緩存
具有緩存屬性值的能力。
1.2.2 通知模型
一個(gè)管理構件提供的管理接口允許代理對其管理資源進(jìn)行控制和配置。然而,對管理復雜的分布式系統來(lái)說(shuō),這些接口只是提供了一部分功能。通常,管理應用程序需要對狀態(tài)變化或者當特別情況發(fā)生變化時(shí)作出反映。
為此,JMX定義了通知模型。通知模型僅僅涉及了在同一個(gè)JMX代理中的管理構件之間的事件傳播。JMX通知模型依靠以下幾個(gè)部分:
1)Notification,一個(gè)通用的事件類(lèi)型,該類(lèi)標識事件的類(lèi)型,可以被直接使用,也可以根據傳遞的事件的需要而被擴展。
2)NotificationListener接口,接受通知的對象需實(shí)現此接口。
3)NotificationFilter接口,作為通知過(guò)濾器的對象需實(shí)現此接口,為通知監聽(tīng)者提供了一個(gè)過(guò)濾通知的過(guò)濾器。
4)NotificationBroadcaster接口,通知發(fā)送者需實(shí)現此接口,該接口允許希望得到通知的監聽(tīng)者注冊。
發(fā)送一個(gè)通用類(lèi)型的通知,任何一個(gè)監聽(tīng)者都會(huì )得到該通知。因此,監聽(tīng)者需提供過(guò)濾器來(lái)選擇所需要接受的通知。
任何類(lèi)型的管理構件,標準的或動(dòng)態(tài)的,都可以作為一個(gè)通知發(fā)送者,也可以作為一個(gè)通知監聽(tīng)者,或兩者都是。
1.2.3 輔助元數據類(lèi)
輔助元數據類(lèi)用來(lái)描述管理構件。輔助元數據類(lèi)不僅被用來(lái)內省標準管理構件,也被動(dòng)態(tài)管理構件用來(lái)進(jìn)行自我描述。這些類(lèi)根據屬性、操作、構建器和通告描述了管理接口。JMX代理通過(guò)這些元數據類(lèi)管理所有管理構件,而不管這些管理構件的類(lèi)型。
部分輔助元類(lèi)如下:
1)MBeanInfo--包含了屬性、操作、構建器和通知的信息。
2)MBeanFeatureInfo--為下面類(lèi)的超類(lèi)。
3)MBeanAttributeInfo--用來(lái)描述管理構件中的屬性。
4)MBeanConstructorInfo--用來(lái)描述管理構件中的構建器。
5)MBeanOperationInfo--用來(lái)描述管理構件中的操作。
6)MBeanParameterInfo--用來(lái)描述管理構件操作或構建器的參數。
7)MBeanNotificationInfo--用來(lái)描述管理構件發(fā)出的通知。
1.3 代理層
代理層是一個(gè)運行在Java虛擬機上的管理實(shí)體,它活躍在管理資源和管理者之間,用來(lái)直接管理資源,并使這些資源可以被遠程的管理程序所控制。代理層由一個(gè)MBean服務(wù)器和一系列處理被管理資源的服務(wù)所組成。下圖表示了代理層的組成:
1.3.1 MBean服務(wù)器
Mbean服務(wù)器為代理層的核心,設備層的所有管理構件都在其注冊,管理者只用通過(guò)它才能訪(fǎng)問(wèn)管理構件。
管理構件可以通過(guò)以下三種方法實(shí)例化和注冊:
1)通過(guò)另一個(gè)管理構件
2)管理代理本身
3)遠程應用程序
注冊一個(gè)管理構件時(shí),必須提供一個(gè)唯一的對象名。管理應用程序用這個(gè)對象名進(jìn)行標識管理構件并對其操作。這些操作包括:
1)發(fā)現管理構件的管理接口
2)讀寫(xiě)屬性值
3)執行管理構件中定義的操作
4)獲得管理構件發(fā)出的通告
5)基于對象名和屬性值來(lái)查詢(xún)管理構件
1.3.2 協(xié)議適配器和連接器
MBean服務(wù)器依賴(lài)于協(xié)議適配器和連接器來(lái)和運行該代理的Java虛擬機之外的管理應用程序進(jìn)行通信。協(xié)議適配器通過(guò)特定的協(xié)議提供了一張注冊在MBean服務(wù)器的管理構件的視圖。例如,一個(gè)HTML適配器可以將所有注冊過(guò)的管理構件顯示在Web 頁(yè)面上。不同的協(xié)議,提供不同的視圖。
連接器還必須提供管理應用一方的接口以使代理和管理應用程序進(jìn)行通信,即針對不同的協(xié)議,連接器必須提供同樣的遠程接口來(lái)封裝通信過(guò)程。當遠程應用程序使用這個(gè)接口時(shí),就可以通過(guò)網(wǎng)絡(luò )透明的和代理進(jìn)行交互,而忽略協(xié)議本身。
適配器和連接器使MBean服務(wù)器與管理應用程序能進(jìn)行通信。因此,一個(gè)代理要被管理,它必須提供至少一個(gè)協(xié)議適配器或者連接器。面臨多種管理應用時(shí),代理可以包含各種不同的協(xié)議適配器和連接器。
當前已經(jīng)實(shí)現和將要實(shí)現的協(xié)議適配器和連接器包括:
1)RMI連接器
2)SNMP協(xié)議適配器
3)IIOP協(xié)議適配器
4)HTML協(xié)議適配器
5)HTTP連接器
1.3.3 代理服務(wù)
代理服務(wù)可以對注冊的管理構件執行管理功能。通過(guò)引入智能管理,JMX可以幫助我們建立強有力的管理解決方案。代理服務(wù)本身也是作為管理構件而存在,也可以被MBean服務(wù)器控制。
JMX規范定義了代理服務(wù)有:
1)動(dòng)態(tài)類(lèi)裝載--通過(guò)管理小程序服務(wù)可以獲得并實(shí)例化新的類(lèi),還可以使位于網(wǎng)絡(luò )上的類(lèi)庫本地化。
2)監視服務(wù)--監視管理構件的屬性值變化,并將這些變化通知給所有的監聽(tīng)者。
3)時(shí)間服務(wù)--定時(shí)發(fā)送一個(gè)消息或作為一個(gè)調度器使用。
4)關(guān)系服務(wù)--定義并維持管理構件之間的相互關(guān)系。
1.動(dòng)態(tài)類(lèi)裝載 動(dòng)態(tài)類(lèi)裝載是通過(guò)m-let(management applet)服務(wù)來(lái)實(shí)現的,它可以從網(wǎng)絡(luò )上的任何URL處下載并實(shí)例化管理構件,然后向MBean服務(wù)器注冊。在一個(gè)M-let服務(wù)過(guò)程中,首先是下載一個(gè)m-let文本文件,該文件是XML格式的文件,文件的內容標識了管理構件的所有信息,比如構件名稱(chēng)、在MBean服務(wù)器中唯一標識該構件的對象名等。然后根據這個(gè)文件的內容,m-let服務(wù)完成剩余的任務(wù)。下圖例示這一過(guò)程:
2.監視服務(wù) 通過(guò)使用監視服務(wù),管理構件的屬性值就會(huì )被定期監視,從而保證始終處于一個(gè)特定的范圍。當監視的屬性值的變化超出了預期定義的范圍,一個(gè)特定的通告就會(huì )發(fā)出。JMX規范當前規定了三種監視器:
1)計數器監視器,監視計數器類(lèi)型的屬性值,通常為整型,且只能按一定規律遞增。
2)度量監視器,監視度量類(lèi)型的屬性值,通常為實(shí)數,值能增能減。
3)字符串監視器,監視字符串類(lèi)型的屬性值。
每一個(gè)監視器都是作為一個(gè)標準管理構件存在的,需要提供服務(wù)時(shí),可以由相應的管理構件或遠程管理應用程序動(dòng)態(tài)創(chuàng )建并配置注冊使用。
下圖例示了計數器監視器的使用情況:
3.時(shí)間服務(wù) 時(shí)間服務(wù)可以在制定的時(shí)間和日期發(fā)出通告,也可以定期的周期性的發(fā)出通告,依賴(lài)于管理應用程序的配置。時(shí)間服務(wù)也是一個(gè)管理構件,它能幫助管理應用程序建立一個(gè)可配置的備忘錄,從而實(shí)現智能管理服務(wù)。
4.關(guān)系服務(wù) JMX規范定義了管理構件之間的關(guān)系模型。一個(gè)關(guān)系是用戶(hù)定義的管理構件之間的N維聯(lián)系。
關(guān)系模型定義如下一些術(shù)語(yǔ):
1)角色:就是是一個(gè)關(guān)系中的一類(lèi)成員身份,它含有一個(gè)角色值。
2)角色信息:描述一個(gè)關(guān)系中的一個(gè)角色。
3)關(guān)系類(lèi)型:由角色信息組成,作為創(chuàng )建和維持關(guān)系的模板。
4)關(guān)系:管理構件之間的當前聯(lián)系,且必須滿(mǎn)足一個(gè)關(guān)系類(lèi)型的要求。
5)角色值:在一個(gè)關(guān)系中當前能滿(mǎn)足給定角色的管理構件的列表。
6)關(guān)系服務(wù):是一個(gè)管理構件,能接觸和維持所有關(guān)系類(lèi)型和關(guān)系實(shí)例之間的一致性。
在關(guān)系服務(wù)中,管理構件之間的關(guān)系由通過(guò)關(guān)系類(lèi)型確定的關(guān)系實(shí)例來(lái)維護。僅僅只有注冊到MBean服務(wù)器上并且能被對象名標識的管理構件才能成為一個(gè)關(guān)系的成員。關(guān)系服務(wù)從來(lái)就不直接操作它的成員--管理構件,為了方便查找它僅僅提供了對象名。
關(guān)系服務(wù)能鎖定不合理關(guān)系類(lèi)型的創(chuàng )建,同樣,不合理的關(guān)系的創(chuàng )建也會(huì )被鎖定。角色值的修正也要遵守一致性檢查。
由于關(guān)系是定義在注冊的管理構件之間的聯(lián)系,所以當其中的管理構件卸載時(shí),就會(huì )更改關(guān)系。關(guān)系服務(wù)會(huì )自動(dòng)更改角色值。所有對關(guān)系實(shí)例的操作比如創(chuàng )建、更新、刪除等都會(huì )使關(guān)系服務(wù)發(fā)出通告,通告會(huì )提供有關(guān)這次操作的信息。
JMX關(guān)系模型只能保證所有的管理構件滿(mǎn)足它的設計角色,也就是說(shuō),不允許一個(gè)管理構件同時(shí)出現在許多關(guān)系中。
1.4 分布服務(wù)層
當前,SUN并沒(méi)有給出這一層的具體規范,下面給出的只是一個(gè)簡(jiǎn)要描述。
該層規定了實(shí)現JMX應用管理平臺的接口。這一層定義了能對代理層進(jìn)行操作的管理接口和組件。這些組件能:
1)為管理應用程序提供一個(gè)接口,以便它通過(guò)一個(gè)連接器能透明和代理層或者JMX管理資源進(jìn)行交互。
2)通過(guò)各種協(xié)議的映射(如SNMP、HTML等),提供了一個(gè)JMX代理和所有可管理組件的視圖。
3)分布管理信息,以便構造一個(gè)分布式系統,也就是將高層管理平臺的管理信息向其下眾多的JMX代理發(fā)布。
4)收集多個(gè)JMX 代理端的管理信息并根據管理終端用戶(hù)的需要篩選用戶(hù)感興趣的信息并形成邏輯視圖送給相應的終端用戶(hù)。
5)提供了安全保證。
通過(guò)管理應用層和另一管理代理和以及他的設備層的聯(lián)合,就可以為我們提供一個(gè)完整的網(wǎng)絡(luò )管理的解決方案。這個(gè)解決方案為我們帶來(lái)了獨一無(wú)二的一些優(yōu)點(diǎn):輕便、根據需要部署、動(dòng)態(tài)服務(wù)、還有安全性。
1.5 附加管理協(xié)議API
該層提供了一些API來(lái)支持當前已經(jīng)存在的一些管理協(xié)議。
這些附加的協(xié)議API并沒(méi)有定義管理應用的功能,或者管理平臺的體系結構,他們僅僅定義了標準的Java API和現存的網(wǎng)絡(luò )管理技術(shù)通信,例如SNMP。
網(wǎng)絡(luò )管理平臺和應用的開(kāi)發(fā)者可以用這些API來(lái)和他們的管理環(huán)境進(jìn)行交互,并將這個(gè)交互過(guò)程封裝在一個(gè)JMX管理資源中。例如,通過(guò)SNMP可以對一個(gè)運行有SNMP代理的交換機進(jìn)行管理,并將這些管理接口封裝成為一個(gè)管理構件。在動(dòng)態(tài)網(wǎng)絡(luò )管理中,可以隨時(shí)更換這些管理構件以適應需求。
這些API可以幫組開(kāi)發(fā)者根據最通常的工業(yè)標準來(lái)部署他們的管理平臺和應用。新的網(wǎng)路管理的解決方案可以和現存的基礎結構合為一體,這樣,現存的網(wǎng)絡(luò )管理也能很好的利用基于Java技術(shù)的網(wǎng)絡(luò )管理應用。
這些API目前在JCP(Java Community Process)內作為獨立的JSR(Java Specification Request)開(kāi)發(fā)。
他們包括:
1)SNMP Manager API
2)CIM/WBEM manager and protocol API
1.6 JMX的當前實(shí)現及應用
自從SUN發(fā)布了JMX規范,許多大公司紛紛行動(dòng)起來(lái),實(shí)現規范或者實(shí)現相應的基于JMX的網(wǎng)絡(luò )管理系統,下面列出了當前的主要實(shí)現及應用情況:
1)SUN為JMX規范了作出了相應的參考實(shí)現,并在此基礎上開(kāi)發(fā)了一個(gè)全新的用于網(wǎng)絡(luò )管理的產(chǎn)品JDMK(Java動(dòng)態(tài)管理工具集),其中定義了資源的開(kāi)發(fā)過(guò)程和方法、動(dòng)態(tài)JMX代理的實(shí)現、遠程管理應用的實(shí)現。同時(shí),JDMK也提供了一個(gè)完整的體系結構用來(lái)構造分布式的網(wǎng)絡(luò )管理系統,并提供了多種協(xié)議適配器和連接器,如SNMP協(xié)議適配器、HTML協(xié)議適配器、HTTP連接器、RMI連接器。
2)IBM Tivoli實(shí)現了JMX規范的產(chǎn)品為T(mén)ivoliJMX,它為JAVA管理應用程序和網(wǎng)絡(luò )提供了架構、設計模式、一些API集和一些服務(wù)。
3)Adventnet開(kāi)發(fā)的關(guān)于JMX的產(chǎn)品為AdventNet Agent Toolkit,它使得定義新的SNMP MIB、開(kāi)發(fā)JMX和Java SNMP Agent的過(guò)程自動(dòng)化。
4)JBoss實(shí)現的J2EE應用服務(wù)器以JMX為微內核,各個(gè)模塊以管理構件的形式提供相應的服務(wù)。
5)BEA的Weblogic應用服務(wù)器也將JMX技術(shù)作為自己的管理基礎。
6)金蝶的Apusic也是一個(gè)以JMX為內核開(kāi)發(fā)出的J2EE應用服務(wù)器。
1.7 小結
本文詳細介紹了JMX規范。JMX體系結構分為四層,即設備層、代理層、分布服務(wù)層和附加協(xié)議API。但SUN當前只實(shí)現了前兩層的具體規范,其余的規范還在制定當中。JMX代理要和遠程應用程序通信,需要提供至少一個(gè)連接器和協(xié)議適配器。