MSE 結合 Dragonwell,讓 Java Agent 更好用

語言: CN / TW / HK

背景

Cloud Native

隨著越來越多的雲原生微服務應用的大規模部署,大家對微服務治理的能力

Java Agent 技術能夠讓業務專注於業務邏輯,與此同時,中介軟體通過 Java Agent 支援無侵入修改程式行為,提供微服務治理能力。

此外,Java Agent 支援通過環境變數的方式注入,中介軟體、雲產品團隊可以通過設定環境變數來支援

所以目前基於 Java Agent 實現的雲原生可觀測、微服務治理能力被越來越多的採用。比如開源的 Skywalking、OpenTelemetry,商業化的阿里雲 MSE 等,都支援 Java Agent 接入。

問題

Cloud Native

我們以 MSE 微服務 demo 為例。

https://github.com/aliyun/alibabacloud-microservice-demo/tree/master/mse-simple-demo/helm/mse-simple-demo

先在 一個 Kubernetes 叢集中安裝好 ack-onepilot,然後部署上述 demo。

先可以訪問 demo 中的 gateway,驗證下可以正常工作:

您也可以參考 MSE 的幫助文件 體驗下全鏈路灰度等微服務治理能力。

https://mp.weixin.qq.com/s/95WZHL0HhFtzxMlfK-8jkg

我們登陸容器時,就能看到注入的 agent:

但這樣的結果是容器中所有的 JVM,都會掛載 Agent。

比如 java -version:

比如 jstack:

1. java/jps/jstack/jcmd 等 JDK 自帶的問題排查工具,都會去從環境變數載入 Java Agent

2. 因為 Java Agent 是在 JVM 初期載入的,所以 Java Agent 會先耗費 6-7s 來載入 agent 邏輯。

3. 但作為 JDK 工具,其實沒有任何業務邏輯,不需要微服務治理能力。可以不用載入 Java Agent 的

我們設想下這個場景:線上應用出現問題了,運維同學要抓現場,上去就想 jstack 拉一下 stacktrace 資訊。

結果先要載入 java agent,不但浪費了 CPU 和記憶體,更容易錯過問題排查的現場。

但,一邊要通過環境變數無侵入注入 Java Agent,一邊又要不在某些程序內注入。看起來無解了?

MSE 攜手 Dragonwell,讓微服務治理更友好

Cloud Native

首先,注入 Java Agent 與否,是 JVM 確定的。 我們只需要修改 JVM 即可。

在這一點上,Dragonwell 團隊有著豐富的經驗。

其次,我們看下 JVM 的行為,現有的開源行為如下:

  • JDK 相關命令,都會從 JAVA_TOOL_OPTIONS 載入 Java Agent

  • OpenJDK9 之後,引入了 JDK_JAVA_OPTIONS,這個環境變數只會被java命令使用。jps/jstack 等命令不會載入。

  • 有些 JDK 廠商,會有自己的擴充套件環境變數, 比如,IBM 會讀取  IBM_JAVA_OPTIONS ,開源後的 OpenJ9 開始使用  OPENJ9_JAVA_OPTIONS ,Oracle/OpenJDK 使用_JAVA_OPTIONS。

本來 JDK_JAVA_OPTIONS 能夠很好的滿足需求,但作為“你發任你發,我用 Java8”的業務開發同學,穩定為先,所以 Java 8 是一定要支援的。

經過和 Dragonwell 的討(si)論(bi),確定瞭如下修改:

  • DRAGONWELL_JAVA_OPTIONS,和  IBM_JAVA_OPTIONS 類似,設定某些只用於 Dragonwell 的 Java 引數。

  • DRAGONWELL_JAVA_TOOL_OPTIONS_JDK_ONLY,和 JDK_JAVA_OPTIONS 類似。

如果 DRAGONWELL_JAVA_TOOL_OPTIONS_JDK_ONLY=true,則 JAVA_TOOL_OPTIONS 只會被 java 命令載入。jps/jstack 不會載入環境變數、不會載入 Java Agent。

經過上面的改造,就可以做到只對業務 Java 程序載入 Java Agent。同時不影響 jps/jstack 等 JDK 自帶的運維命令。

當然,Dragonwell 作為開源專案,討論的整體流程都是在 GitHub Issue 上完成的,歡迎圍觀、吃瓜、吐槽:

https://github.com/alibaba/dragonwell8/issues/330#issuecomment-1138083844

最終效果

Cloud Native

讓我們使用最新的 Dragonwell 版本,跑一下業務應用,模擬一下運維場景:

可以看到,JDK 運維工具不會載入 Java Agent 了。

業務程序載入了 Java Agent(您也可以在 MSE 微服務治理控制檯上看到應用);也避免了 Java Agent 影響了  java -version 等運維指令碼。

MSE 給你帶來更強大的微服務治理能力

Cloud Native

阿里雲微服務引擎(MSE)通過 Java Agent/SDK/Service Mesh 等方式,給您帶來零接入成本、無侵入的、全生命週期的微服務治理能力。

通過 MSE 微服務治理,不用改一行程式碼即可享受全鏈路灰度、無損上下線、服務測試等微服務治理能力,為您的開發、測試、上線、運維保駕護航。

MSE 雲原生閘道器預付費、MSE 註冊配置預付費 首購 8 折,首購 1 年及以上 7 折

更多 MSE 特性,歡迎進釘釘群交流