本文是《容器中的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:
- java/jps/jstack/jcmd等JDK自带的问题排查工具,都会去从环境变量加载Java Agent
- 因为Java Agent是在JVM初期加载的,所以Java Agent会先消耗6-7s来加载agent逻辑。
- 但作为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。
从用意上来说:
- 如果须要给java和jps等运维工具设置参数,而且这些参数是java通用的,那么应该设置给环境变量JAVA_TOOL_OPTIONS。
- 如果须要给javaj和jps等运维工具j设置参数,而且这些参数是jvm厂商相干j的,比方是dragonwell特有的开关,那么应该设置DRAGONWELL_JAVA_OPTIONS。
- 如果须要给java设置参数,然而不给运维工具设置,而且参数是java通用的,那么应该设置环境变量JAVA_TOOL_OPTIONS,并设置DRAGONWELL_JAVA_TOOL_OPTIONS_JDK_ONLY=true。
3.1. 如果是jdk9及以上,则应该应用更加规范的JDK_JAVA_OPTIONS。 - 如果须要给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
点击此处查看微服务引擎详情