MSE结合Dragonwell,让Java Agent更好用

本文涉及的产品
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 微服务引擎MSE面向业界主流开源微服务项目, 提供注册配置中心和分布式协调(原生支持Nacos/ZooKeeper/Eureka)、云原生网关(原生支持Ingress/Envoy)、微服务治理(原生支持Spring Cloud/Dubbo/Sentinel,遵循 OpenSergo 服务治理规范)能力。

背景


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

Java Agent技术能够让业务专注于业务逻辑,与此同时,中间件通过Java Agent支持无侵入修改程序行为,提供微服务治理能力。

此外,Java Agent支持通过环境变量的方式注入,中间件、云产品团队可以通过设置环境变量来支持

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


问题


我们以MSE微服务demo为例(https://github.com/aliyun/alibabacloud-microservice-demo/tree/master/mse-simple-demo/helm/mse-simple-demo)。

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

先可以访问demo中的gateway,验证下可以正常工作:

image.png

您也可以参考MSE的帮助文档( https://mp.weixin.qq.com/s/95WZHL0HhFtzxMlfK-8jkg )体验下全链路灰度等微服务治理能力。

我们登陆容器时,就能看到注入的agent:

image.png

但这样的结果是容器中所有的JVM,都会挂载Agent。

比如java -version:

image.png

比如jstack:

image.png

  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,开源后的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


最终效果


让我们使用最新的Dragonwell版本,跑一下业务应用,模拟一下运维场景:

image.png

可以看到,业务进程加载了Java Agent(您也可以在MSE微服务治理控制台上看到应用);也避免了Java Agent影响了 java -version等运维脚本。


MSE给你带来更强大的微服务治理能力


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

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


更多 MSE 特性,欢迎进钉钉群交流

image.png

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
4月前
|
Java 关系型数据库 MySQL
GraalVM 静态编译下 OTel Java Agent 的自动增强方案与实现
在 2024 OpenTelemetry Community Day 会议中,阿里云可观测工程师张乎兴(望陶)和饶子昊(铖朴)为大家带来了《GraalVM 静态编译下 OTel Java Agent 的自动增强方案与实现》的演讲分享,介绍阿里云在相关领域的探索方案,本文是相关分享对应的中文整理。
248 15
|
3月前
|
数据采集 人工智能 监控
【Azure 应用程序见解】Application Insights Java Agent 3.1.0的使用实验,通过修改单个URL的采样率来减少请求及依赖项的数据采集
【Azure 应用程序见解】Application Insights Java Agent 3.1.0的使用实验,通过修改单个URL的采样率来减少请求及依赖项的数据采集
|
6月前
|
监控 Java Maven
揭秘Java Agent技术:解锁Java工具开发的新境界
作为JDK提供的关键机制,Java Agent技术不仅为Java工具的开发者提供了一个强大的框架,还为性能监控、故障诊断和动态代码修改等领域带来了革命性的变革。本文旨在全面解析Java Agent技术的应用场景以及实现方式,特别是静态加载模式和动态加载模式这两种关键模式。
1029 0
|
2月前
|
安全 应用服务中间件 API
微服务分布式系统架构之zookeeper与dubbo-2
微服务分布式系统架构之zookeeper与dubbo-2
|
2月前
|
负载均衡 Java 应用服务中间件
微服务分布式系统架构之zookeeper与dubbor-1
微服务分布式系统架构之zookeeper与dubbor-1
|
2月前
|
存储 负载均衡 Dubbo
分布式-Zookeeper(一)
分布式-Zookeeper(一)
|
4月前
|
监控 NoSQL Java
分布式锁实现原理问题之ZooKeeper的观察器(Watcher)特点问题如何解决
分布式锁实现原理问题之ZooKeeper的观察器(Watcher)特点问题如何解决
|
27天前
|
分布式计算 NoSQL Java
Hadoop-32 ZooKeeper 分布式锁问题 分布式锁Java实现 附带案例和实现思路代码
Hadoop-32 ZooKeeper 分布式锁问题 分布式锁Java实现 附带案例和实现思路代码
40 2
|
27天前
|
分布式计算 Hadoop
Hadoop-27 ZooKeeper集群 集群配置启动 3台云服务器 myid集群 zoo.cfg多节点配置 分布式协调框架 Leader Follower Observer
Hadoop-27 ZooKeeper集群 集群配置启动 3台云服务器 myid集群 zoo.cfg多节点配置 分布式协调框架 Leader Follower Observer
39 1
|
2月前
分布式-Zookeeper-数据订阅
分布式-Zookeeper-数据订阅

相关产品

  • 微服务引擎