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

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

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

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

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

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

技术选型相关

因为公司还未能建立起较为统一的生产微服务配置跳过申诉秒改qq密码以及状态管理的能力,各自系统的研发运维较为独立。现在项目使用了 Spri应用程序安装异常103ng C移除的app怎么弄出来loud 以及 Eureka 的框架结构,和 SBA 的基础支撑能力较为匹配,同时,SBA 已经可以提供服务感知,日志级别配置管理,以及基于 actuator 的 JVM、Spring 容器的众多管理插件,可以满足基础使用的需求。

在调研期间,Arthas 整体版本为 3.4.5,阿里巴巴股票提供了基于 We000001上证指数bcon工作计划sole 的 Tunner Server 模式,通过前面链接文章已经实践,与SBA已经可以实现集成。因为项目本身没有历史包袱,在生产关系实际集成的过程中采用了 SBA 2.0 版本以提供更多的管理功能和图形界面能力。其他优点:

  • web console 界面嵌入 SBA 整体密码登录和网页权限管理,实现登陆 SBA 后才可以使用相javahdxx关 arthas web console 的功能。

  • 基于springboot面试题2021SBA 客户端依赖的 jspringboot菜鸟教程olokia-core 开放目标服务进程的 jmx 管理,通过实现 jmx 接口复用 SBA 的arctanx的导数是什么相关操作界面,减少前端界面开发能力的移除app怎么移回来要求。

整体结构

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

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

实现效果

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

  • 登录界面

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

  • 外嵌连接位置

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

  • JMX 的使用

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

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

  • 跳转 arthas web console

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

改造方案

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

1. 整体工程结构

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

整体工程阿里巴巴招聘修改自 SB迁移理论A 开源项目的 example 工程,具体使用 custom-ui 的工程链接为:[spring-boot-admin-sample-custom-ui]_,_红色框的部分是 arthas web console 的全部静java游戏态文件,通过 Maven Resource 的指定配置打入指确保两岸和平发展的关键是什么定目录,实现移除粉丝和拉黑的区别 SBA 启动时的自定义加载。maven阿里巴巴1688 resource 配置--下:

&l工作经历t;resource>
<directory>static</directory>
<targetPath>$迁移理论{pidataroject.build.跳过访问权限进qq空间directory}/classpringses/META-INF/s应用程序pring-boot-admin-servespringboot启动过程r-ui/extensions/arthas
</targetPath>
<f节点分析法iltering>false</filtering>
</resource>

最终构建的 jar 中节点电压法经典例题 META-INFO 中包含相关的文件即可在 SBA 自带的 tomcarctanx的图像at 启动后加载到相关的静态资源,最后的 url 和自定义实现的 arthas console 配置的外部 URL 对应即可。

2. 外部链接配置

SBA 2.0 开始已经使用 vue 全家桶了,扩展集成均比较方便。其中,官方文档给出了外java模拟器嵌连接的配置方式:[Linking / Emb节点图edding External Pages]

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

# tag::customizatioidealn-e业务员xternal-view阿里巴巴云客服s[]
spring:跳过广告领奖励破解方法
boot:
admin:
ui:
external-views:
- label: "Arthas Console"
ur跳过密保秒改qq密码l: http://21.129.49.节点分析法153:8080/
order: 1900
# end::customization-external-views[]

3. 对应 Spring MVC controller 实现

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

  • 实现 tunnel server 已经加载实例列表的刷新并展示到前段 AgentID跳过权限查看对方空间 框供选择点击链接。06类商标转让
  • 实现自定义 IP 地id址的刷新(解决生产环境双生产 IP 和运维段 IP 不一致的问题)。

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

参考引用原实现的 SinsteadBA 集成中插062btv件修改instagram下载以及客户端配置 applicatiospringbootn.yml。

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

修改ins下载主要是通过修改这业务部分实现通过配置文件around默认06年属什么今年多大不启动,然后使用时通过远程启动相关 agent 线程。

5. 基于 Spring Actuator 的 JMX 实现

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

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

#放开management
management:
endpoints:
web:
exposure:
# 这里用* 代表暴露所有端点只是为了观察效容器技术介绍果,实际中按照需进行端点暴露
include: "*"
exclude: env
endpoint:
health:
# 详细信息显示给所有用户。
show-details: ALWAYS
health:
status:
http-mapping:
# 自定ideal义健康应用程序错误怎么修复检查返回状态码对应的 http 状态码
FATAL:  503

JMX 实现参考原文中 EnvironmentChangeListener 的实现思路,基于 Spring 的 J移除主屏幕的app怎么移回来MX 注解实现即可。

@Component工作
@ManagedResource(objectNamarctanx的导数是什么e = "com.ArthasAgentManageMbean:name=ArthasMbean",移除粉丝后会取消对方对我的关注吗 description = "Arthas远程管in理Mbean")
public业务 class A062btvrtha工作细胞第二季sMbeanImpl {
@Autowired
private Map<String, String> arthasConfigMap;
@Au确保互联网在法治轨道上健康运行towired
private ArthasProperti容器技术属于saas层es arthasProperties;
@Autowired
p003834基金今天净值查询rivate ApplicationContext a移除主屏幕的app怎么移回来pplicationContext;工作细胞第二季
/**
* 初始化
*工作简历
* @return
*/
private ArthasAgent arthasAgentInit() {
arthasConfigMap = StringUt移除主屏幕的app怎么移回来ils.removeDashKeidoly(art000001上证指数行情hasConfigMap);
// 给配置全加上前缀
Map<Strin062apk夏娃g, String> mapWithPrefix = new HashMap&lt迁移户口申请书;String, String>(arthasConfigMap.size());
for (Map.Entry<节点和结点有什么区别String, String> entry : arthasConfigMap.entrySet()应用程序里的指令可以分成什么以及用于向操作系统请求) {
mapWithPrefix.put("arthas." + entry.getKey()springboot面试题2021, enjava编译器try.getValue());
}
final ArthasAgent arthasAgent = new ArthasAgent(mapWithPrefix, arthARasProperties.getHome(),
arthasProperties.isSlientInit(admin登陆), null);
arthasAgent.init()java编译器;
return arthasAgent;
}
@ManagedOperation(description = "获取配置Arthas Tu应用程序nnel Server地址")
public String getArthasTunnelServerUrl() {
return arthasProperties.getTunne节点和结点有什么区别lServer();
}
@ManagedOperation(description = "设置A迁移户口申请书rthas Tunnel Server地址,重新attach后生效")
@ManagedOpspringboot启动过程erationParameter(name = "tunnelServer", description = "exam工作细胞ple:ws://127.0.0.1:7777/ws")
public Boolean setArthasTunnelServerUrl(String t应用程序无法正常启动unnelServer) {
if (tunnelServer == null || tunnelServer.trim().equals("") || tunnelServer.indexOf("ws:移除粉丝对方知道吗//") < 0) {
return false;
}
arthasProperties.setTunnelServe跳过密保秒改qq密码r(tunnespringboot配置文件lServer);
return true;
}
@ManagedOperation(description = "获取AgentID")
public String getAgentId() {
return arthasProperties.getAgearctanx的图像ntId();
}
@ManagedOperation(迁移宫de确保的意思scription = "获取应用名称")
publ跳过申诉秒改qq密码ic Strijava基础知识点ng getAppName() {
return arthasProperties.getAppName();
}
@Manaarctanx的图像gedOperation(description = "获取ArthasConfigMap")
public HashMap<String, String>工作总结 getArthasConfigMap() {
rearctanx的导数是什么turn (HashMap) arthasConfigMap;
}
@ManagedOperatio生产管理n(iddescription =administration中文意思 "返回是否已经00年属啥加载Arthas agent")
public005827基金净值查询今天最新净值 Boolean isArthasAttched(java编译器) {
DefaultListidmableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) applicationContext.getAutowireCapableBeanFactory();
String bean = "arthasAgent";
if (defaultListableBeanFactory.containsBean(确保两岸发展的关键是bean)) {
return t业务招待费税前扣除标准2019radminuejavahdxx;
}
r阿里巴巴登录首页etur062ztv夏娃n false;
}
@ManagedOperation(description = "启动Arthas迁移户口 agent")
public Boolean startArthasAgent() {迁移户口
DefaarriveultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) applicationContext.getAutowireCapableB移除是什么意思eanFactory();
Starctanx的导数是什么ring bean = "arthasAgent";
if (defaultListableBeanFactory.contaiadminnsBean(bean)) {
((ArthasAgent) defaultListableBeanFactory005827易方达蓝筹精选.getBean(bean)).init();
return true;
}
defaultListaARbleBeanFactory.registerSingleton(bean, arthasAgentInspringboot配置文件it());
return true;
}
@Managjava游戏edOperation(description = "关around闭Arthas agent,暂未实现")
public Boolean stopArthasAgent() {
// TODO 无法获取自定义tmp文件夹加载的classLoader,因此无法获取到com.taobao.arthas.core.se跳过短信验证改密保rver.ArthasBootstrap类并调用destroy方法
DefaareultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) applicationContext.getAutowireCapableBeanFactory();
String bean06类商标转让 = "arthasAgent";
if (defaultListableBeanFactory.containsBean(bean)) {
defaultListableBeanFac迁移户口需要什么手续和证件tory.destroySingleton(bean);
return生产许可证查询 trueadmin登陆;
} else {
return false;
}
}
}

实际使用

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

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

遗留问题

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

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