让 Java Agent 在 Dragonwell 上更好用

news2024/11/18 8:18:54

本文是《容器中的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/alibabacloud-microservice-demo/tree/master/mse-simple-demo/helm/mse-simple-demo

[2]MSE的帮助文档

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

[3]IBM_JAVA_OPTIONS

https://www.ibm.com/docs/en/zos/2.3.0?topic=runtime-java-options

[4]OPENJ9_JAVA_OPTIONS

https://www.eclipse.org/openj9/docs/cmdline_specifying/#precedence

[5]GitHub Issue

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/149453.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

kali渗透测试到底该如何学?

1、渗透测试是什么? 渗透测试,是为了证明网络防御按照预期计划正常运行而提供的一种机制。渗透测试是通过各种手段对目标进行一次渗透(攻击),通过渗透来测试目标的安全防护能力和安全防护意识。打个比方:比…

手写spring12(把aop动态代理整合到spring生命周期)

文章目录目标设计项目结构四、实现1、定义Advice拦截器链2、定义Advisor访问者3、方法前置拦截器——MethodBeforeAdviceInterceptor4、代理工厂——ProxyFactory5、融入Bean生命周期的自动代理创建者——InstantiationAwareBeanPostProcessor 、DefaultAdvisorAutoProxyCreato…

什么是3dMax中的“块”?如何在3dMax中使用“块”?

3dMax 块简介 3dMax 是一款用于设计 3d 模型的软件,在 3d 建模图形专业人士中最受欢迎。我们可以在此软件中导入不同类型的预设计 3d 模型,以简化我们的工作。块是不同类型的 3d 模型,您可以从互联网上下载,然后将它们导入到 3dMax 软件的项目工作中,以节省您的时间。在本…

Python和OpenCV创建超快的“for”像素循环

这篇博客将介绍如何使用Python和OpenCV创建超快的“for”像素循环(逐像素循环),即Cython快速优化for循环; 使用Python和OpenCV逐像素循环图像是一个非常缓慢的操作,即使图像在内部由NumPy数组表示。 为什么会这样&am…

C语言-指针进阶-qsort函数的学习与模拟实现(9.3)

目录 思维导图: 回调函数 qsort函数介绍 模拟实现qsort 写在最后: 思维导图: 回调函数 什么是回调函数? 回调函数是一个通过函数指针调用的函数。 将一个函数指针作为参数传递给一个函数,当这个指针被用来调用…

57、JDBC和连接池

目录 一、JDBC基本介绍 二、JDBC快速入门 三、JDBC API 1、ResultSet [结果集] 2、Statement 3、PreparedStatement 4、DriverManager 四、封闭JDBCUtils 五、事务 六、批处理 七、数据库连接池 4、数据库连接池种类 (1) c3p0数据库连接池&…

MacBookPro 遇到pip: command not found问题的解决

学习Pyhton的时候,需要安装第三方插件pyecharts,执行以下命令: pip install pyecharts总是报错 pip: command not found 我很郁闷,于是上网搜索尝试各种命令, 命令1:curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py 命…

Codeforces Round 507(div. 1) C(分类讨论,并查集)

题目链接: Problem - C - Codeforceshttps://codeforces.com/contest/1039/problem/C 题意: 计算机网络由个服务器组成,每个服务器有到范围内的加密秘钥。设是分配给第i台服务器的加密密钥。对服务器通过数据通信通道直接连接。由于加密算…

高性能分布式缓存Redis-第二篇章

高性能分布式缓存Redis-第二篇章一、持久化原理1.1、持久化流程(落盘)1.2、RDB详解1.2.1、介绍1.2.2、触发&原理1.2.3、实现1.2.4、RDB总结1.3、AOF详解1.3.1、概念1.3.2、AOF 持久化的实现1.3.2、开启1.3.4、命令追加1.3.5、文件写入和同步&#xf…

SQL 别名

通过使用 SQL,可以为表名称或列名称指定别名。 SQL 别名 通过使用 SQL,可以为表名称或列名称指定别名。 基本上,创建别名是为了让列名称的可读性更强。 列的 SQL 别名语法 SELECT column_name AS alias_name FROM table_name; 表的 SQL …

dubbo学习笔记4(小d课堂)

dubbo高级特性 服务分组及其配置 我们再来创建一个实现类: 接下来我们在xml中去进行配置: 现在我们去运行看是否会有错误呢? 我们有两个服务实现类,那运行的时候到底执行哪个呢? 但是我们想的是可以指定执行哪个实现…

设计模式——访问者模式

访问者模式一、基本思想二、结构图一、基本思想 将作用于某种数据结构中的各元素的操作分离出来封装成独立的类,使其在不改变数据结构的前提下可以添加作用于这些元素的新的操作,为数据结构中的每个元素提供多种访问方式。它将对数据的操作与数据结构进…

【安全硬件】Chap.7 对实体芯片采取物理手段破解;芯片IC逆向工程和拆分制造;物理上对芯片的攻击分类;侧信道攻击;Kocher针对RSA的计时攻击

【安全硬件】Chap.7 对实体芯片采取物理手段破解;芯片IC逆向工程和拆分制造;物理上对芯片的攻击分类;侧信道攻击;Kocher针对RSA的计时攻击前言1. 逆向工程Reverse Engineering逆向工程识别芯片上2输入NAND门逆向工程技术Decapulat…

CSS 实例系列

Hello 小伙伴们早上、中午、下午、晚上和深夜好,这里是 jsliang~本 CSS 系列文章:主推学以致用。结合面试题和工作实例,让小伙伴们深入体验 61 个工作常见的 CSS 属性和各种 CSS 知识。主推纯 CSS。尽可能使用 HTML CSS 完成学习目的&#x…

nohup命令详解

nohup命令详解一、背景说明:启动服务的时候,如果使用如下命令,则会在start.sh脚本所在的目录下,产生一个名为 nohup.out 的输出文件nohup ./startup.sh &可以看到下面这个例子,一开始当前目录是没有nohup.out文件的…

RocketMQ 多语言 SDK 开源贡献召集令

作者:艾阳坤 目前 Apache RocketMQ 5.0 SDK [ 1] 正在社区开源,开发与迭代也在火热进行中,欢迎广大社区的朋友们能够参与其中。我们欢迎任何形式的贡献,包括但不限于新 feature、bugfix、代码优化、生态集成、测试工作、文档撰写…

我与 CSDN 的 2022 年终总结

💂 个人网站:【海拥】【摸鱼游戏】【神级源码资源网】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 想寻找共同学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 转眼间2023年已经过去…

《后端技术面试 38 讲》学习笔记 Day 02

《后端技术面试 38 讲》学习笔记 Day 02 08丨软件设计的方法论:软件为什么要建模? 原文摘抄 所谓软件建模,就是为要开发的软件建造模型。模型是对客观存在的抽象,我们常说的数学建模,就是用数学公式作为模型&#xf…

flask + Pandas + echarts 使用饼状图等将二手房数据进行分析+可视化

目录 一、实战场景 二、知识点 python 基础语法 python 文件读写 pandas 数据处理 flask web 框架 echarts 图表 bootstrap jinja 模版 三、菜鸟实战 初始化 Flask 框架,设置路由 各行政区房屋数量柱状图分析 区域二手房房源朝向分布情况 二手房单价最…

Higress Kruise Rollout: 渐进式交付为应用发布保驾护航

作者:扬少 前言 在业务高速发展过程中,如何最大化保障功能迭代过程中业务流量无损一直是开发者比较关心的问题。通常在应用发布新功能阶段,我们会采用灰度发布的思想对新版本进行小流量验证,在符合预期之后再进行全量发布&#…