前言
JMX 是 Java 環(huán)境下系統(tǒng)管理的標(biāo)準(zhǔn)解決方案,從 jdk 1.5 開始,JMX 在所有 JVM 中都可用,企業(yè)級(jí)應(yīng)用服務(wù)器中甚至通過(guò) JVM 進(jìn)行管理。JMX 是一個(gè)精心設(shè)計(jì)的規(guī)范,在其它 EJB 規(guī)范轟轟烈烈的失敗的時(shí)候創(chuàng)建。在創(chuàng)建之后十年,JMX 仍然是 Java 環(huán)境下唯一的管理解決方案。JMX 豐富的 MBeans 實(shí)現(xiàn)方式和層次是它設(shè)計(jì)的亮點(diǎn),從簡(jiǎn)單的 標(biāo)準(zhǔn) MBean 到非常靈活的開放 MBeans 和 MXBeans
然而,JMX 里的一些概念直到過(guò)時(shí)也沒有被正式使用,比如 JSR-77 沒有達(dá)到發(fā)布標(biāo)準(zhǔn),JSR-160 被設(shè)計(jì)用于遠(yuǎn)程訪問(wèn) JMX,希望能夠隱藏通信細(xì)節(jié),讓遠(yuǎn)程和本地訪問(wèn) JMX 沒有卻別,但不幸的是 RMI 協(xié)議和編程模型以 Java 為中心,導(dǎo)致在 Java 環(huán)境外并不適用。這就是 Jolokia 的切入點(diǎn),它是基于 Agent 的,與 JSR-160 并存,但是它使用更加開放的 HTPP 協(xié)議,通過(guò) Json 協(xié)議序列化數(shù)據(jù)內(nèi)容。這為 非 Java 環(huán)境的客戶端打開了嶄新的世界。在協(xié)議之外,Jolokia 也為 遠(yuǎn)程 JMX 帶來(lái)了新特性:一次通信完成多個(gè) JMX 操作;只允許某些 JMX 操作的安全機(jī)制,其它一些特性比如 代理模式和歷史跟蹤對(duì)于 Jolokia 也是定制的。
這篇參考手冊(cè)詳細(xì)介紹了 Jolokia,第二章 介紹 Jolokia 的整體架構(gòu),第三章介紹 安裝和配置不同的 Jolokia 客戶,接下來(lái)的兩章介紹安全機(jī)制和代理模式。在第六章介紹了 Jolokia 客戶端實(shí)現(xiàn)者最感興趣的協(xié)議定義。Jolikia 預(yù)置的 MBeans 列表在第七章介紹,第八章列舉了可用的 Jolokia 客戶端。
第二章 - 架構(gòu)
Jolokia 的架構(gòu)與 JSR-160 的連接器有所不同,其中最厲害的是 Jolokia 無(wú)類型的連接方式。JSR-160 是2003年釋放,其設(shè)計(jì)目標(biāo)是定義一個(gè)客戶端標(biāo)準(zhǔn),可以以透明的方式調(diào)用遠(yuǎn)程或本地的 MBeanServer 中的Mbean。這給 JMX 客戶端提供了方便,但同時(shí)隱藏遠(yuǎn)程調(diào)用細(xì)節(jié)也存在一定風(fēng)險(xiǎn)。調(diào)用者應(yīng)該至少了解調(diào)用過(guò)程。同時(shí),RMI 傳遞實(shí)體類型,所以調(diào)用者需要明確知道實(shí)體結(jié)構(gòu),這增大了開發(fā)成本,所以在遠(yuǎn)程調(diào)用方面,RMI 漸漸失去了市場(chǎng)。
JSR-160 的問(wèn)題是依賴于 RMI,需要完成的 Java 對(duì)象序列化/反序列化機(jī)制,限制了客戶端必須使用 Java 環(huán)境。Jolokia 是采用無(wú)類型、輕量級(jí)的 Json 傳輸數(shù)據(jù)。盡管這種方式也有弊端,但利大于弊。
Agent 模式
下圖展示了 Jolokia 的 Agent 模式,Agent 可以調(diào)用本地的 MBeanServer 暴露 json 接口供外部調(diào)用,在客戶端上可以應(yīng)用不同的技術(shù)來(lái)展示通過(guò) Http 獲取的 JMX 數(shù)據(jù)。Agent 可以放到一個(gè)輕量級(jí)的 Servlet 容器中,像 Tomcat、Jetty 之類的,它和普通的 Web 應(yīng)用的行為一致,所以對(duì)于 Web 應(yīng)用開發(fā)人員來(lái)講非常熟悉。

除了放到 Servlet 容器之外,Jolokia 也可以定義特殊的 Agent,比如實(shí)現(xiàn) OSGi 或者內(nèi)置 Jetty 服務(wù)器。Agent 的詳細(xì)內(nèi)容在第三章中描述。
Jolokia 也可以集成到 Web 應(yīng)用中,jolokia-core 庫(kù)作為一個(gè) Jar 包,提供一個(gè) Servlet,加入到 Web 應(yīng)用中之后就可以訪問(wèn)。
代理模式
代理模式為了解決不能向目標(biāo)應(yīng)用加入 Agent 的情況,可能由于不能改變目標(biāo)應(yīng)用,或者目標(biāo)應(yīng)用已經(jīng)暴露了 JMX 調(diào)用。一個(gè)專用的 Servlet 代理服務(wù)器來(lái)部署 jolokia.war, Tomcat 或 Jetty 是非常好的選擇。
下圖展示了代理模式,客戶端發(fā)送標(biāo)準(zhǔn)的 Jolokia 請(qǐng)求給 代理,請(qǐng)求中包含了路由信息,所以代理服務(wù)器中也不需要額外進(jìn)行配置。

綜上,代理模式應(yīng)該僅在必要時(shí)使用,Agent 模式比代理模式更為高效,因?yàn)榇砟J皆黾恿艘淮沃虚g轉(zhuǎn)發(fā),增加了復(fù)雜性,而且有些功能,比如合并 MBeanServers 在代理模式下不能使用。
第三章 - Agents
Jolokia 是基于 Agent 訪問(wèn) JMX 的方式,需要安裝 agent 來(lái)訪問(wèn) JMX,agent 可以安裝到目標(biāo)應(yīng)用上,也可以安裝到獨(dú)立的 Servlet 容器中,作為代理,訪問(wèn)目標(biāo)應(yīng)用。一共有四種不同類型的 agents.
War Agent: 以 War 包的形式分發(fā)和部署
OSGi Agent
Mule Agent
JVM Agent
應(yīng)用集成 Jolokia Agent:通過(guò)加入 jolokia-core 可以將 Agent 集成到 web 應(yīng)用中,方便使用