乐趣区

关于阿里云:让-Java-Agent-在-Dragonwell-上更好用

本文是《容器中的 Java》系列文章之 3/n,欢送关注后续连载 :)。1

背景

随着越来越多的云原生微服务利用的大规模部署,大家对微服务治理的能力需要越来越强。

Java Agent 技术可能让业务专一于业务逻辑,与此同时,中间件通过 Java Agent 反对无侵入批改程序行为,提供微服务治理能力。

此外,Java Agent 反对通过环境变量的形式注入,中间件、云产品团队能够通过设置环境变量来反对

所以目前基于 Java Agent 实现的云原生可观测、微服务治理能力被越来越多的采纳。比方开源的 Skywalking、OpenTelemetry,商业化的阿里云 MSE 等,都反对 Java Agent 接入。

问题

咱们以 MSE 微服务 demo [ 1] 为例。

先在一个 Kubernetes 集群中装置好 ack-onepilot,而后部署上述 demo。

先能够拜访 demo 中的 gateway,验证下能够失常工作:

您也能够参考 MSE 的帮忙文档 [ 2] 体验下全链路灰度等微服务治理能力。

咱们登陆容器时,就能看到注入的 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,让微服务治理更敌对

首先,注入 Java Agent 与否,是 JVM 确定的。咱们只须要批改 JVM 即可。

在这一点上,Dragonwell 团队有着丰盛的教训。

其次,咱们看下 JVM 的行为,现有的开源行为如下:

  • JDK 相干命令,都会从 JAVA_TOOL_OPTIONS 加载 Java Agent
  • OpenJDK9 之后,引入了 JDK_JAVA_OPTIONS,这个环境变量只会被 java 命令应用。jps/jstack 等命令不会加载。
  • 有些 JDK 厂商,会有本人的扩大环境变量,比方,IBM 会读取IBM_JAVA_OPTIONS [ 3] ,开源后的 OpenJ9 开始应用OPENJ9_JAVA_OPTIONS [ 4] ,Oracle/OpenJDK 应用_JAVA_OPTIONS。

原本 JDK_JAVA_OPTIONS 可能很好的满足需要,但作为“你发任你发,我用 Java8”的业务开发同学,稳固为先,所以 Java 8 是肯定要反对的。

通过和 Dragonwell 的讨(si)论(bi),确定了如下批改:

  • DRAGONWELL_JAVA_OPTIONS,和 IBM_JAVA_OPTIONS [ 3] 相似,设置某些只用于 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。

从用意上来说:

  1. 如果须要给 java 和 jps 等运维工具设置参数,而且这些参数是 java 通用的,那么应该设置给环境变量 JAVA_TOOL_OPTIONS。
  2. 如果须要给 javaj 和 jps 等运维工具 j 设置参数,而且这些参数是 jvm 厂商相干 j 的,比方是 dragonwell 特有的开关,那么应该设置 DRAGONWELL_JAVA_OPTIONS。
  3. 如果须要给 java 设置参数,然而不给运维工具设置,而且参数是 java 通用的,那么应该设置环境变量 JAVA_TOOL_OPTIONS,并设置 DRAGONWELL_JAVA_TOOL_OPTIONS_JDK_ONLY=true。
    3.1. 如果是 jdk9 及以上,则应该应用更加规范的 JDK_JAVA_OPTIONS。
  4. 如果须要给 java 设置参数,然而不给运维工具设置,而且参数是 jvm 厂商相干的,那么应该设置环境变量 DRAGONWELL_JAVA_OPTIONS,并设置 DRAGONWELL_JAVA_TOOL_OPTIONS_JDK_ONLY=true。

通过下面的革新,就能够做到只对业务 Java 过程加载 Java Agent。同时不影响 jps/jstack 等 JDK 自带的运维命令。

当然,Dragonwell 作为开源我的项目,探讨的整体流程都是在 GitHub Issue [ 5] 上实现的,欢送围观、吃瓜、吐槽。**

最终成果

让咱们应用最新的 Dragonwell 版本,跑一下业务利用,模仿一下运维场景:

能够看到,JDK 运维工具不会加载 Java Agent 了。

业务过程加载了 Java Agent(您也能够在 MSE 微服务治理管制台上看到利用);也防止了 Java Agent 影响了 java -version 等运维脚本。

5MSE 给你带来更弱小的微服务治理能力

阿里云微服务引擎(MSE)通过 Java Agent/SDK/Service Mesh 等形式,给您带来零接入老本、无侵入的、全生命周期的微服务治理能力。

通过 MSE 微服务治理,不必改一行代码即可享受全链路灰度、无损高低线、服务测试等微服务治理能力,为您的开发、测试、上线、运维保驾护航。

相干链接

[1]MSE 微服务 demo

https://github.com/aliyun/ali…

[2]MSE 的帮忙文档

https://mp.weixin.qq.com/s/95…

[3]IBM_JAVA_OPTIONS

https://www.ibm.com/docs/en/z…

[4]OPENJ9_JAVA_OPTIONS

https://www.eclipse.org/openj…

[5]GitHub Issue

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

点击此处查看微服务引擎详情

退出移动版