SpringBoot Admin2.0 集成 Java 诊断神器 Arthas 实践

简介: 项目最初使用 Arthas 主要有两个目的: 1. 通过 arthas 解决实现测试环境、性能测试环境以及生产环境性能问题分析工具的问题。 2. 通过使用 jad、mc、redefine 功能组合实现生产环境部分节点代码热更新的能力。

头图.png

作者 | sparrow
来源 | 阿里巴巴云原生公众号

本文来自 Arthas 2021 年 3 月征文投稿,4 月有奖征文参与方式可见文末。

项目最初使用 Arthas 主要有两个目的:

  1. 通过 arthas 解决实现测试环境、性能测试环境以及生产环境性能问题分析工具的问题。
  2. 通过使用 jad、mc、redefine 功能组合实现生产环境部分节点代码热更新的能力。

技术选型相关

因为公司还未能建立起较为统一的生产微服务配置以及状态管理的能力,各自系统的研发运维较为独立。现在项目使用了 Spring Cloud 以及 Eureka 的框架结构,和 SBA 的基础支撑能力较为匹配,同时,SBA 已经可以提供服务感知,日志级别配置管理,以及基于 actuator 的 JVM、Spring 容器的众多管理插件,可以满足基础使用的需求。

在调研期间,Arthas 整体版本为 3.4.5,提供了基于 Webconsole 的 Tunner Server 模式,通过前面链接文章已经实践,与SBA已经可以实现集成。因为项目本身没有历史包袱,在实际集成的过程中采用了 SBA 2.0 版本以提供更多的管理功能和图形界面能力。其他优点:

  • web console 界面嵌入 SBA 整体密码登录和网页权限管理,实现登陆 SBA 后才可以使用相关 arthas web console 的功能。
  • 基于SBA 客户端依赖的 jolokia-core 开放目标服务进程的 jmx 管理,通过实现 jmx 接口复用 SBA 的相关操作界面,减少前端界面开发能力的要求。

整体结构

1.png

几个关键点,使用 JVM 内置 Arthas Spring Boot 插件,参考工商银行的模式建立完善的客户端下载以及修改脚本实现远程控制。内置方案工作开发量小,只需要集成相关的开源组件即可实现相关的远程使用的模式并兼顾安全。工银的方案大而全适合整体架构规划后配置专有研发团队之城。内置方案同时包含通过 JMX 的启停操作(基于 3.4.5 的 Spring Boot 插件无法获得相关句柄,暂时无法实现),默认不启动。通过远程 JMX 开通后,JVM 新增相关线程 8 个,新增虚拟机内存 30MB 左右,和本文参考的 SBA1.0 方案相同,需要考虑在线开启前 JVM 内存是否可以支持。

实现效果

SBA 2.0 最大的方便就是提供了配置化链接外部网页的能力,同时如果网页实现在当前 JVM 进程,可以实现 Spring-Security 的本地权限管理,在生产环境下只有在登录 SBA 后才能使用相关集成的 arthas 功能。

  • 登录界面

2.png

  • 外嵌连接位置

3.png

  • JMX 的使用

4.png

5.png

  • 跳转 arthas web console

6.png

改造方案

参考原文 -SpringBoot Admin 集成 Arthas 实践中实现的几个步骤。

1. 整体工程结构

7.png

整体工程修改自 SBA 开源项目的 example 工程,具体使用 custom-ui 的工程链接为:[_[spring-boot-admin-sample-custom-ui]_](https://github.com/codecentric/spring-boot-admin/tree/master/spring-boot-admin-samples/spring-boot-admin-sample-custom-ui)_,_红色框的部分是 arthas web console 的全部静态文件,通过 Maven Resource 的指定配置打入指定目录,实现 SBA 启动时的自定义加载。maven resource 配置--下:

<resource><directory>static</directory><targetPath>${project.build.directory}/classes/META-INF/spring-boot-admin-server-ui/extensions/arthas</targetPath><filtering>false</filtering></resource>

最终构建的 jar 中 META-INFO 中包含相关的文件即可在 SBA 自带的 tomcat 启动后加载到相关的静态资源,最后的 url 和自定义实现的 arthas console 配置的外部 URL 对应即可。

2. 外部链接配置

SBA 2.0 开始已经使用 vue 全家桶了,扩展集成均比较方便。其中,官方文档给出了外嵌连接的配置方式:[_[Linking / Embedding External Pages]_](https://codecentric.github.io/spring-boot-admin/2.3.1/#customizing-external-views)_。_

参考 sba example 工程的 application.yml 配置即可:

# tag::customization-external-views[]spring:boot:admin:ui:external-views:- label: "Arthas Console"url: http://21.129.49.153:8080/order: 1900# end::customization-external-views[]

3. 对应 Spring MVC controller 实现

参考引用原实现的 SBA 集成部分,该部分主要修改实现如下功能:

  • 实现 tunnel server 已经加载实例列表的刷新并展示到前段 AgentID 框供选择点击链接。
  • 实现自定义 IP 地址的刷新(解决生产环境双生产 IP 和运维段 IP 不一致的问题)。

4. Arthas Spring Boot 插件修改和配置

参考引用原实现的 SBA 集成中插件修改以及客户端配置 application.yml。

对原版 Spring boot 插件修改主要在于原有插件是通过 Spring的@ConditionalOnMissingBean 实现自动加载。

修改主要是通过修改这部分实现通过配置文件默认不启动,然后使用时通过远程启动相关 agent 线程。

5. 基于 Spring Actuator 的 JMX 实现

SBA client 在 maven 引入中会默认引入 jolokia-core.jar,如果没有因为 SBA client 依赖可以自行引入该包,可以实现通过 actuator 开放基于 http 的 jmx 操作能力和 SBA 控制台的相关功能无缝配合。

application.yml 中开放 management 相关配置,根据自身环境情况,也可以开在客户端侧开启 Spring security 认证,SBA 也可以很好的支持通过服务发现实现密码保护 actuator 端点的访问。

#放开managementmanagement:endpoints:web:exposure:# 这里用* 代表暴露所有端点只是为了观察效果,实际中按照需进行端点暴露include: "*"exclude: envendpoint:health:# 详细信息显示给所有用户。show-details: ALWAYShealth:status:http-mapping:# 自定义健康检查返回状态码对应的 http 状态码FATAL:  503

JMX 实现参考原文中 EnvironmentChangeListener 的实现思路,基于 Spring 的 JMX 注解实现即可。

@Component@ManagedResource(objectName = "com.ArthasAgentManageMbean:name=ArthasMbean", description = "Arthas远程管理Mbean")public class ArthasMbeanImpl {@Autowiredprivate Map<String, String> arthasConfigMap;@Autowiredprivate ArthasProperties arthasProperties;@Autowiredprivate ApplicationContext applicationContext;/*** 初始化** @return*/private ArthasAgent arthasAgentInit() {arthasConfigMap = StringUtils.removeDashKey(arthasConfigMap);// 给配置全加上前缀Map<String, String> mapWithPrefix = new HashMap<String, String>(arthasConfigMap.size());for (Map.Entry<String, String> entry : arthasConfigMap.entrySet()) {mapWithPrefix.put("arthas." + entry.getKey(), entry.getValue());}final ArthasAgent arthasAgent = new ArthasAgent(mapWithPrefix, arthasProperties.getHome(),arthasProperties.isSlientInit(), null);arthasAgent.init();return arthasAgent;}@ManagedOperation(description = "获取配置Arthas Tunnel Server地址")public String getArthasTunnelServerUrl() {return arthasProperties.getTunnelServer();}@ManagedOperation(description = "设置Arthas Tunnel Server地址,重新attach后生效")@ManagedOperationParameter(name = "tunnelServer", description = "example:ws://127.0.0.1:7777/ws")public Boolean setArthasTunnelServerUrl(String tunnelServer) {if (tunnelServer == null || tunnelServer.trim().equals("") || tunnelServer.indexOf("ws://") < 0) {return false;}arthasProperties.setTunnelServer(tunnelServer);return true;}@ManagedOperation(description = "获取AgentID")public String getAgentId() {return arthasProperties.getAgentId();}@ManagedOperation(description = "获取应用名称")public String getAppName() {return arthasProperties.getAppName();}@ManagedOperation(description = "获取ArthasConfigMap")public HashMap<String, String> getArthasConfigMap() {return (HashMap) arthasConfigMap;}@ManagedOperation(description = "返回是否已经加载Arthas agent")public Boolean isArthasAttched() {DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) applicationContext.getAutowireCapableBeanFactory();String bean = "arthasAgent";if (defaultListableBeanFactory.containsBean(bean)) {return true;}return false;}@ManagedOperation(description = "启动Arthas agent")public Boolean startArthasAgent() {DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) applicationContext.getAutowireCapableBeanFactory();String bean = "arthasAgent";if (defaultListableBeanFactory.containsBean(bean)) {((ArthasAgent) defaultListableBeanFactory.getBean(bean)).init();return true;}defaultListableBeanFactory.registerSingleton(bean, arthasAgentInit());return true;}@ManagedOperation(description = "关闭Arthas agent,暂未实现")public Boolean stopArthasAgent() {// TODO 无法获取自定义tmp文件夹加载的classLoader,因此无法获取到com.taobao.arthas.core.server.ArthasBootstrap类并调用destroy方法DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) applicationContext.getAutowireCapableBeanFactory();String bean = "arthasAgent";if (defaultListableBeanFactory.containsBean(bean)) {defaultListableBeanFactory.destroySingleton(bean);return true;} else {return false;}}}

实际使用

管理工程投产后,多次在生产环境用于问题排查和代码热修复。性能问题主要用于性能流控组件以及灰度发布相关配置参数的在线验证和 debug。

代码热加载相关初期通过 jad+mc 的方式进行操作,后续发现 jad 在部分代码上因环境配置以及 jvm 问题产生反编译代码不一致的情况,后续通过 maven 打包部署应用程序 source 压缩包的方式解决,直接使用和应用 jar 同版本构建的 source 进行修改更加可靠。整体方案在管理较为严格的生产环境提供了有效的性能分析以及热修复的能力。

遗留问题

现有官方提供的 com.taobao.arthas.agent.attach.ArthasAgent 中启动 arthas agent 的客户端使用的 arthasClassLoader 和 bootstrapClass 均为方法内的临时变量,外部无法获取相关句柄实现通过 bootstrapClass 关闭 arthas agent 的功能;临时解决方案为通过 JMX 启动后,在 web console 连接使用后,使用 stop 命令实现目标进程中 arthas agent 的关闭。

现有字节码加载工具可以很好的实现内部类,私有类的在线热部署替换,同时经测试可以兼容 SkyWalk8.x 版本的 javaagent 插件,但是在测试环境因为配置有 jacoco 覆盖度采集插件与 Arthas 字节码产生了不兼容的情况,在部分环境使用时需要先关闭对应的 agent 后才能正常使用 arthas 的相关功能。

欢迎登陆 start.aliyun.com 知行动手实验室体验 Arthas 57 个动手实验:
mmexport6adaa4629ed89eba8b8d5cf637e20215_1618204461902.gif
Arthas 实验预览

原文链接

本文伟阿里云原创内容,未经允许不得转载。

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

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

相关文章

python在办公上的应用_python自动化办公:玩转word之样式秘笈

上节对python如何定制word的页眉页脚做了详细介绍&#xff0c;当然&#xff0c;要作出一篇精彩的word文档&#xff0c;样式公布可没&#xff0c;本章继续介绍python如何玩转word的样式。 使用样式python如何玩转word的样式 此页面使用前一页中开发的概念而不作介绍。如果术语不…

Gartner发布2021年隐私技术成熟度曲线,数字伦理登上顶点

编辑 | 宋慧 供稿 | Gartner 随着人们日益意识到其个人信息的价值并对透明度的缺乏和持续的滥用感到失望&#xff0c;数字伦理登上了Gartner 2021年隐私技术成熟度曲线的顶点。 Gartner将数字伦理定义为人、企业机构和物之间开展电子交互所遵循的价值和伦理道德原则体系。随着…

微服务+异步工作流+ Serverless,Netflix 决定弃用稳定运行 7 年的旧平台

简介&#xff1a; 2021 年&#xff0c;Netflix 会将大部分的工作负载从 Reloaded 转移到 Cosmos 平台。Cosmos 是一个计算平台&#xff0c;它将微服务的最佳特性与异步工作流以及 Serverless 结合在一起。 作者 | Frank San Miguel 策划 | 田晓旭 2021 年&#xff0c;Netflix …

实时 OLAP, 从 0 到 1

简介&#xff1a; BTC.com 团队在实时 OLAP 方面的技术演进过程及生产优化实践。 作者&#xff5c;高正炎 本文主要介绍 BTC.com 团队在实时 OLAP 方面的技术演进过程及生产优化实践&#xff0c;内容如下&#xff1a; 业务背景机遇挑战架构演进架构优化未来展望一、业务背景 …

Gartner发布2021年数字商务技术成熟度曲线,重点关注四项技术

应用领导人应密切关注可视化配置、数字钱包、客户身份和访问管理以及虚拟客户助理这四项将在未来两年对数字商务产生重大影响的技术。 编辑 | 宋慧 供稿 | Gartner 根据Gartner 2021年数字商务技术成熟度曲线&#xff08;Hype Cycle for Digital Commerce&#xff09;&#x…

鸿蒙手机系统还没有开发,华为鸿蒙手机太难了!引发开发者大吐槽:为何没有自己独特风格?-互联网/电商-文章-小虾米...

【华为鸿蒙手机太难了&#xff01;引发开发者大吐槽&#xff1a;为何没有自己独特风格&#xff1f;】互联网/电商-文章-小虾米2020-12-27 11:32:02 小虾米帐号&#xff1a;军事科技(tabc) 关注我 举报 来源&#xff1a;qq新闻 浏览量(129)【12月28日讯】导语&#xff0c…

Fluid给数据弹性一双隐形的翅膀 (1) -- 自定义弹性伸缩

简介&#xff1a; 弹性伸缩作为Kubernetes的核心能力之一&#xff0c;但它一直是围绕这无状态的应用负载展开。而Fluid提供了分布式缓存的弹性伸缩能力&#xff0c;可以灵活扩充和收缩数据缓存。 它基于Runtime提供了缓存空间、现有缓存比例等性能指标, 结合自身对于Runtime资源…

利用 Python 实现多任务进程

来源&#xff1a;杰哥的IT之旅作者&#xff1a;阿拉斯加一、进程介绍 进程&#xff1a;正在执行的程序&#xff0c;由程序、数据和进程控制块组成&#xff0c;是正在执行的程序&#xff0c;程序的一次执行过程&#xff0c;是资源调度的基本单位。程序&#xff1a;没有执行的代码…

小白也能懂的 Nacos 服务模型介绍

简介&#xff1a; 理解了 Nacos 的服务模型&#xff0c;也有利于我们了解 Nacos 背后的工作原理&#xff0c;从而确保我们正确地使用 Nacos。 作者&#xff1a;岛风 前言 按照目前市场上的主流使用场景&#xff0c;Nacos 被分成了两块功能&#xff1a;服务注册发现&#xff0…

那些与 IE 相伴的日子

来源&#xff1a;零一作者&#xff1a;前端印象大家好&#xff0c;IE 大家都不陌生&#xff0c;毕竟出现在大家的视野中已经很久很久&#xff0c;久到有20多年&#xff0c;当然也因前端技术的快速更新&#xff0c;给需要兼容IE浏览器的前端程序员带来了不少的困扰。慢慢地&…

html代码style图片width,HTML Style columnWidth用法及代码示例

DOM中的columnWidth属性用于指定列的宽度。用法:返回columnWidth属性&#xff1a;object.style.columnWidth设置columnWidth属性&#xff1a;object.style.columnWidth "auto | length | initial | inherit"属性值&#xff1a;auto:缺省值。列宽将由浏览器确定lengt…

KubeVela 1.0 :开启可编程式应用平台的未来

简介&#xff1a; 如果你对云原生领域不太关注&#xff0c;可能对 KubeVela 还没有做过太深入的了解。别着急&#xff0c;本文就借着 v1.0 发布之际&#xff0c;为你详细的梳理一次 KubeVela 项目的发展脉络&#xff0c;解读它的核心思想和愿景&#xff0c;领悟这个正冉冉升起的…

android-x86 镜像iso下载_2019年微软MSDN原版镜像系统下载地址 Win10/7原版系统iso镜像文件...

如今&#xff0c;不少用户开始讨厌以GHOST形式来安装操作系统&#xff0c;虽然步骤十分简单&#xff0c;但是从网上下载的GHOST系统&#xff0c;已经形成了一个黑色产业链&#xff0c;为了盈利&#xff0c;捆绑了软件全家桶、恶意强制主页&#xff0c;甚至捆绑木马&#xff0c;…

大流量场景下如何云淡风轻地进行线上发布?

简介&#xff1a; 本文介绍了微服务治理下金丝雀发布的能力&#xff0c;解决了发布期间少量流量验证新功能的问题。 前言 本文&#xff0c;我们继续聊聊《揭秘大流量场景下发布如丝般顺滑背后的原因》中的另外一环&#xff0c;灰度发布&#xff0c;也叫金丝雀发布。 ​ 很多互…

匿名提问:rm -rf了怎么办?

整理 | 易璜珵出品 | 《新程序员》IT界流传着一个神秘的代码&#xff0c;老程序员听了总是意味深长地一笑&#xff0c;而新手程序员则总是手痒地想试试&#xff0c;那就是删库指令rm -rf。这一行代码下去&#xff0c;海量数据可能就荡然无存。近几年发生的“删库跑路”事件让这…

ubuntu matlab_有没有人和我一起整理Python的matlab代替

想找人一起整理Python中matlab代替的包&#xff0c;最好是能够将常用功能用tkinter封装起来&#xff0c;积少成多&#xff0c;逐步逼近完整。比如将scipy中的最小二乘法拟合功能&#xff0c;找个图形界面封装一下&#xff0c;就变成了曲线拟合工具&#xff0c;可以代替matlab的…

逸仙电商Seata企业级落地实践

简介&#xff1a; 本文将会以逸仙电商的业务作为背景&#xff0c; 先介绍一下seata的原理&#xff0c; 并给大家进行线上演示&#xff0c; 由浅入深去介绍这款中间件&#xff0c; 以便读者更加容易去理解 Seata 这个中间件。 作者 | 张嘉伟&#xff08;GitHub ID&#xff1a;l…

“类云”的存储服务什么样?Pure Storage发布Pure Fusion等系列新品

一键部署自动化存储平台与云原生数据库即服务&#xff0c;无缝连接基础设施运营与应用程序。 编辑 | 宋慧 出品 | CSDN 云计算 近日&#xff0c;专为多云环境提供存储即服务的Pure Storage发布一系列现代化基础设施、运营及应用程序&#xff0c;这是Pure Storage迈向创新现代…

mac mongodb可视化工具_MongoDB从立地到成佛(介绍、安装、增删改查)

文章作者公众号bigsai&#xff0c;已收录在回车课堂,如有帮助还请不吝啬点个赞赞支持一下&#xff01;课程导学大家好我是bigsai&#xff0c;我们都学过数据库&#xff0c;但你可能更熟悉关系(型)数据库例如MySQL&#xff0c;SQL SERVER&#xff0c;ORACLE等&#xff0c;对于非…

阿里巴巴云原生 etcd 服务集群管控优化实践

简介&#xff1a; 这些年&#xff0c;阿里云原生 etcd 服务发生了翻天覆地的变化&#xff0c;这篇文章主要分享一下 etcd 服务在面对业务量大规模增长下遇到的问题以及我们是如何解决的&#xff0c;希望对读者了解 etcd 的使用和管控运维提供经验分享。 作者 | 陈星宇&#xff…