前言
Arthas(阿尔萨斯)是阿里巴巴开源的 Java 诊断工具。让我们能够在线排查项目发生的问题。除了知道它的存在之外,我们也需要知道我们如何去安装使用它,以便于提高我们日常开发解决BUG
的效率。
方案介绍
方案一 本地直接运行
往往最简单的方法实际是最有效的,它本身就是一个可运行的程序,所以我们可以直接运行即可。
- 我们可以直接通过官网下载对应的
jar
,然后运行再进行jar
再执行对应的命令。 - 命令如下:
java -jar arthas-boot.jar [option]
- 演示如下:
方案二 Web Console实现
我们可以不通过每次进入ssh
中进行执行程序,我们也可通过web
方式进行访问操作.通过官网上面的介绍arthas的Web Console,能了解到大致的搭建思路。
- 通过下载arthas-tunnel-server。我们可以拿到对应的
arthas
的server
端。下载完毕之后直接运行即可(我是将其在ECS上直接运行)。 - 在客户端对应的启动
arthas-boot
。并且通过启动参数附加上server
的地址(我是将其在本地运行)。 - 选择对应的进程进行
attach
,会出现对应的agent-id
,再将其填写到对应的server
端http
页面中。 - 最后我们就可以再
server
端进行操作,即Web Console
实现完成。
方案三 项目依赖
基于Spring
相关搭建的项目直接加入依赖(需要对应的环境支持,例如不能缺少tools.jar
)。
SpringBoot
项目依赖:<dependency> <groupId>com.taobao.arthas</groupId> <artifactId>arthas-spring-boot-starter</artifactId> <version>${arthas.version}</version> </dependency>
非
SpringBoot
项目依赖:<dependency> <groupId>com.taobao.arthas</groupId> <artifactId>arthas-agent-attach</artifactId> <version>${arthas.version}</version> </dependency> <dependency> <groupId>com.taobao.arthas</groupId> <artifactId>arthas-packaging</artifactId> <version>${arthas.version}</version> </dependency>
本地项目启动之后可以直接访问:
http://127.0.0.1:3658/
当然还可以结合上面介绍的
Web Console
。例如配置文件中增加对应的配置信息:arthas.agent-id=qwejqjnnnunnq arthas.tunnel-server=ws://server地址:7777/ws
- 演示如下:
以上步骤就是先把tunnel-server
启动,然后本地配置连接tunnel-server
。然后输入配置的Id
,即可完成对应的调试。
方案四 容器配置
基于docker
配置,目前上容器服务的企业不在少数。对于容器服务,也是可以适用的。将jar
下载下来之后进行ADD
操作,或者每次通过构建Dockerfile
则会产生对应含有arthas
的镜像文件。
这里介绍下通过Dockerfile
进行构建:
FROM openjdk:8-jdk-alpine
ADD target/*.jar app.jar
# copy arthas
COPY --from=hengyunabc/arthas:latest /opt/arthas /opt/arthas
RUN apk add --no-cache tini
ENTRYPOINT ["/sbin/tini", "--"]
CMD ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
MAINTAINER Montos 1367654518@qq.com
上述是通过构建Dockerfile
来完成的,这里就直接将镜像文件贴出来,这里是将当前arthas
中的文件复制到对应的容器中,之后我们可以通过exec -it
进入执行,步骤和方法一类似。
总结
通过上面的介绍,其实我更推荐使用Web
接入的方式更好,原因如下:
- 在服务直接部署在服务器上或者
ECS
云服务器情况下。我们可以直接运行在对应的client
端,但是我们如何上到各个服务所在的服务器上?通过跳板机?那么我们是不是操作的时候会有可能对应服务器造成影响,直接连接服务器上是肯定不行的。 - 服务在所运行的
pod
情况下。此时让你连接服务是影响是比上面的情况会小很多,如果发生影响也只是影响到当前运行的pod
。但是如果你想直接连接pod,那么需要的将对应的pod端口需要映射到对应的宿主机上,然后再提供外部访问ecs
的链接。这样会使得每次pod需要映射出去的端口需要一定的规则,无疑是加大了运维等工作,运行则也消耗了当前的资源(访问页面等等则走http接口请求,如果通过ws连接,减少7层方面消耗)。 - 如果通过上述方法,那么我们可以再一台机器上运行
server
即可,我们每次访问都通过访问server
去连接到到对应的client
端,同时对应的agent-id
可以指定,我们可以每次pod进行client
运行的时候指定当前的agent-id
,让其与当前的pod
进行一个绑定,便于我们通过server
进行连接。
当然上述观点仁者见仁智者见智。以上介绍了几种部署以及运行arthas
的方法,企业可以根据当前的项目架构选择合适的部署进行解决。为什么需要????就因为能帮助开发解决问题,不需要来回发版!!!!!!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。