Skip to main content

moregeek program

【jvm实战系列】「监控调优体系」实战开发arthas-spring-boot-starter监控你的微服务是否健康!-多极客编程

前提介绍

相信如果经历了我的上一篇Arthas的文章[【JVM实战系列】「监控调优体系」针对于Alibaba-Arthas的安装入门及基础使用开发实战指南]之后,相信你对Arthas的功能和使用应该有了一定的理解了。那么我们就要进行下一步的探索功能。

Arthas对于SpringBoot2的支持和监控体系

在SpringBoot2应用中加入arthas-spring-boot-starter后,Spring会启动arthas服务,并且进行attach自身进程,并配合tunnel server实现远程管理。这样的方案非常适合在微服务容器环境中进行远程诊断,在容器网络环境中仅需要对外暴露tunnel server的端口。

Arthas的监控体系所需要的组件支持

  • Arthas Tunnel Server/Client(Java agent探针的管理和监控,方便我们管理服务和探针)
  • Web Console

什么是Arthas Tunnel

在容器化部署的环境内部,Java进程可以是在不同的机器启动的,想要使用Arthas去诊断会比较麻烦,因为用户通常没有机器的权限,即使登陆机器也分不清是哪个Java进程。在这种情况下,可以使用 Arthas Tunnel Server/Client。

Arthas Tunnel的作用和目的

整个Arthas的功能体系中,可以通过Arthas Tunnel Server/Client来远程管理/连接多个Agent(也就代表着可以监控多个JVM进程)。主要目的用于监控和获取目标的JVM的进程数据信息。

下载部署Arthas tunnel server
Github源码仓库下载

​下载地址Arthas tunnel server​​,目前最新版本为arthas-all-3.6.7版本,如下图所示。

【JVM实战系列】「监控调优体系」实战开发arthas-spring-boot-starter监控你的微服务是否健康!_Server

针对于Arthas的安装包进行下载资料进行介绍:

  • arthas-3.6.7.deb:主要用于debian操作系统去运行的安装包
  • arthas-bin.zip:二进制可运行执行包
  • arthas-doc.zip:针对于arthas的文档
  • arthas-tunnel-server-3.6.7-fatjar.jar:Arthas tunnel server服务的Jar可以执行包
  • Source code(zip):源码zip压缩包
  • Source code(tar.gz):源码tar包
仓库下载

阿里云的下载地址:​​https://arthas.aliyun.com/download/arthas-tunnel-server/latest_version?mirror=aliyun​

直接运行对应的Arthas tunnel server

Arthas tunnel server是一个Spring boot fat jar 应用,直接java -jar启动:

java -jar  arthas-tunnel-server.jar

默认情况下,arthas tunnel server的web端口是8080,Arthas agent 连接的端口是7777

【JVM实战系列】「监控调优体系」实战开发arthas-spring-boot-starter监控你的微服务是否健康!_Server_02

打开WebConsole,分别输入Arthas agent的ip(127.0.0.1)和port(7777),和SpringBoot应用里配置的agent-id(URJZ5L48RPBR2ALI5K4V),点Connect即可。

Web Console

如果希望可以通过浏览器连接Arthas服务,此时这里的Arthas服务指的不是Arthas tunnel server,Arthas是总体的服务控制端,发送指令的部分,而Arthas tunnel server属于对接和管理agent的专门服务(依赖于Arthas Spring Boot Starter的服务)。

出了CLI模式之外,Arthas目前支持 Web Console,用户在attach成功之后,可以直接访问:​​http://127.0.0.1:8563/。​
可以填入 IP,远程连接其它机器上的arthas。启动之后,可以访问 http://127.0.0.1:8080/ ,再通过agentId连接到已注册的arthas agent 上,如下图所示。

【JVM实战系列】「监控调优体系」实战开发arthas-spring-boot-starter监控你的微服务是否健康!_jar_03

通过Spring Boot的Endpoint,可以查看到具体的连接信息: ​​http://127.0.0.1:8080/actuator/arthas​​ ,

【JVM实战系列】「监控调优体系」实战开发arthas-spring-boot-starter监控你的微服务是否健康!_Server_04

登陆用户名是arthas,密码在 arthas tunnel server 的日志里可以找到,比如:

【JVM实战系列】「监控调优体系」实战开发arthas-spring-boot-starter监控你的微服务是否健康!_Server_05

注意:默认情况下,arthas 只 listen 127.0.0.1,所以如果想从远程连接,则可以使用 --target-ip参数指定 listen 的 IP,更多参考-h的帮助说明。 注意会有安全风险,考虑下面的 tunnel server 的方案。

如何将服务连接Arthas tunnel server

主要有两种模式连接Arthas tunnel server:

  1. 远程运行的Arthas server连接Arthas tunnel server
  2. 远程运行的Arthas Spring Boot Starter的agent探针服务连接Arthas tunnel server

【JVM实战系列】「监控调优体系」实战开发arthas-spring-boot-starter监控你的微服务是否健康!_jar_06

启动 arthas 时连接到 tunnel server

在启动 arthas,可以传递--tunnel-server参数,比如:

as.sh --tunnel-server 'ws://127.0.0.1:7777/ws'

如果有特殊需求,可以通过--agent-id参数里指定 agentId。默认情况下,会生成随机 ID。attach 成功之后,会打印出 agentId。

,---.  ,------. ,--------.,--.  ,--.  ,---.   ,---.
/ O \ | .--. ''--. .--'| '--' | / O \ ' .-'
| .-. || '--'.' | | | .--. || .-. |`. `-.
| | | || |\ \ | | | | | || | | |.-' |
`--' `--'`--' '--' `--' `--' `--'`--' `--'`-----'

wiki https://arthas.aliyun.com/doc
tutorials https://arthas.aliyun.com/doc/arthas-tutorials.html
version 3.1.2
pid 86183
time 2022-11-30 15:40:53
id URJZ5L48RPBR2ALI5K4V

即使是启动时没有连接到 tunnel server,也可以在后续自动重连成功之后,通过 session 命令来获取 agentId:

[arthas@86183]$ session
Name Value
-----------------------------------------------------
JAVA_PID 86183
SESSION_ID f7273eb5-e7b0-4a00-bc5b-3fe55d741882
AGENT_ID URJZ5L48RPBR2ALI5K4V
TUNNEL_SERVER ws://127.0.0.1:7777/ws

在浏览器里访问 ​​http://localhost:8080/arthas,输入agentId,就可以连接到本机/其他机器上上的​​ arthas 了。

tunnel server的注意要点
  • agentId要保持唯一,否则会在 tunnel server 上冲突,不能正常工作。
  • 如果arthas agent配置了appName,则生成的agentId会带上appName的前缀。
添加对应的app-name参数
启动参数
as.sh --tunnel-server 'ws://127.0.0.1:7777/ws' --app-name demoapp ,则生成的 agentId 可能是demoapp_URJZ5L48RPBR2ALI5K4V。

Tunnel server 会以_做分隔符,提取出appName,方便按应用进行管理

配置参数

解压的 arthas 目录下的 arthas.properties,或者在 spring boot 应用的application.properties里配置appName。

Arthas Spring Boot Starter的agent服务连接Jar

只支持 springboot2

【JVM实战系列】「监控调优体系」实战开发arthas-spring-boot-starter监控你的微服务是否健康!_Server_07

  • 配置 maven 依赖:

arthas.version:3.6.7

<dependency>
<groupId>com.taobao.arthas</groupId>
<artifactId>arthas-spring-boot-starter</artifactId>
<version>${arthas.version}</version>
</dependency>

应用启动后,spring 会启动 arthas,并且 attach 自身进程。如果你不知道如何创建或者引入哪些依赖,可以采用一键创建包含 Arthas Spring Boot Starter 的工程:​​点击跳转到云原生脚手架​

【JVM实战系列】「监控调优体系」实战开发arthas-spring-boot-starter监控你的微服务是否健康!_spring_08

可以看到最下面已经自动勾选了arthas的监控机制体系。

【JVM实战系列】「监控调优体系」实战开发arthas-spring-boot-starter监控你的微服务是否健康!_spring_09

application.yml配置
arthas:
agent-name: nihaotest
agent-id: URJZ5L48RPBR2ALI5K4V #需手工指定agent-id
tunnel-server: ws://127.0.0.1:7777/ws
查看 Endpoint 信息

需要配置 spring boot 暴露 endpoint:假定endpoint 端口是 8080,则通过下面 url 可以查看:

​​http://localhost:8080/actuator/arthas​​

{
"arthasConfigMap": {
"agent-id": "hsehdfsfghhwertyfad",
"tunnel-server": "ws://47.75.156.201:7777/ws",
}
}

最后,启动SpringBoot服务即可

非 spring boot 应用使用方式

非 Spring Boot 应用,可以通过下面的方式来使用:

<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>
attach本身的服务进行探针探测。
import com.taobao.arthas.agent.attach.ArthasAgent;
public class ArthasAttachExample {
public static void main(String[] args) {
ArthasAgent.attach();
}
}

也可以配置属性:

HashMap<String, String> configMap = new HashMap<String, String>();
configMap.put("arthas.appName", "demo");
configMap.put("arthas.tunnelServer", "ws://127.0.0.1:7777/ws");
ArthasAgent.attach(configMap);

Tunnel Server 的管理页面

需要在 spring boot 的application.properties里配置 arthas.enable-detail-pages=true

注意,开放管理页面有风险!管理页面没有安全拦截功能,务必自行增加安全措施。

在本地启动 tunnel-server,​​然后使用as.sh​​ attach,并且指定应用名--app-name test:

$ as.sh --tunnel-server 'ws://127.0.0.1:7777/ws' --app-name test
telnet connecting to arthas server... current timestamp is 1627539688
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
,---. ,------. ,--------.,--. ,--. ,---. ,---.
/ O \ | .--. ''--. .--'| '--' | / O \ ' .-'
| .-. || '--'.' | | | .--. || .-. |`. `-.
| | | || |\ \ | | | | | || | | |.-' |
`--' `--'`--' '--' `--' `--' `--'`--' `--'`-----'

wiki https://arthas.aliyun.com/doc
tutorials https://arthas.aliyun.com/doc/arthas-tutorials.html
version 3.5.3
main_class demo.MathGame
pid 65825
time 2022-07-29 14:21:29
id test_PE3LZO9NA9ENJYTPGL9L

然后访问 tunnel-server,可以看到所有连接的应用列表:

http://localhost:8080/apps.html

【JVM实战系列】「监控调优体系」实战开发arthas-spring-boot-starter监控你的微服务是否健康!_Server_10

再打开详情,则可以看到连接的所有 agent 列表:

http://localhost:8080/agents.html?app=test

【JVM实战系列】「监控调优体系」实战开发arthas-spring-boot-starter监控你的微服务是否健康!_spring_11

©著作权归作者所有:来自51CTO博客作者洛神灬殇的原创作品,请联系作者获取转载授权,否则将追究法律责任

程序员怎么用好内存数据库redis?-多极客编程

程序员怎么用好内存数据库Redis?前言:Redis是Remote Dictionary Server的缩写,意即远程字典服务器,但是更经常被用作内存数据库和缓存。在现代软件常用的微服务架构(MSA)中,Redis占有十分重要的地位,它是解决低响应时间和大并发数量的关键方法之一。因此,学好原理、用好细节成为程序员的必修课程。1.源码分析和编译1.1概述Redis是Remote Dictionary

精华推荐 |【深入浅出sentinel原理及实战】「原理探索专题」完整剖析alibaba微服务架构体系之轻量级高可用流量控制组件sentinel(1)-多极客编程

Sentinel是什么?不要概念混淆啊!注意:本Sentinel与Redis服务Sentinel是两回事,压根不是一个概念,请大家不要混肴。Alibaba的SentinelSentinel是由阿里巴巴中间件团队开发的开源项目,是一种面向分布式微服务架构的轻量级高可用流量控制组件。Redis中的SentinelSentinel(哨兵)是 Redis 的高可用性解决方案:由一个或多个 Sentinel

java7提供的fork/join框架实现高并发程序,你会使用吗?-多极客编程

摘要:Fork/Join框架位于J.U.C(java.util.concurrent)中,是Java7中提供的用于执行并行任务的框架,其可以将大任务分割成若干个小任务,最终汇总每个小任务的结果后得到最终结果。本文分享自华为云社区《​​如何使用Java7提供的Fork/Join框架实现高并发程序?​​》,作者:冰 河。Fork/Join框架位于J.U.C(java.util.concurrent)中

一文掌握mybatis的动态sql使用与原理-多极客编程

摘要:使用动态 SQL 并非一件易事,但借助可用于任何 SQL 映射语句中的强大的动态 SQL 语言,MyBatis 显著地提升了这一特性的易用性。本文分享自华为云社区《​​MyBatis详解 - 动态SQL使用与原理​​》,作者:龙哥手记 。动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要

从业务角度出发来构建低代码应用-多极客编程

低代码确实会少写代码,其概念也不同于复制修改的模板技术,不同于开箱即用的全站配置,不同于趋近于零代码的图形化编程。如果低代码是可以普遍推广的,那么就应该是普遍被业务人员所接受的。那么站在业务人员的视角,构建低代码应用的思路到底是怎样的呢? 业务背景 业务人员应熟悉并使用 协同办公:包括组织结构、岗位职责、消息通知,复杂的包括电子邮件、VPN、文档、机器人助手等 数据信息:包括数据表单、数据库,复

【技术分享】如何实现功能完备性能优异的rtmp、rtsp播放器?-多极客编程

 技术背景这几年,我们对接了太多有RTSP或RTMP直播播放器诉求的开发者,他们当中除了寻求完整的解决方案的,还有些是技术探讨,希望能借鉴我们播放端的开发思路或功能特性,完善自己的产品。忙里偷闲,今天我们就再聊一聊老生常谈的问题:如何实现功能完备性能优异的RTMP、RTSP播放器?技术剖析这里我们说的播放器,系直播播放,确切的说,是如何在保障播放体验的情况下,实现低延迟的RTMP或RTSP播放模块

linux 中的 lsof 命令使用大全-多极客编程

Linux 计算机中的每个对象都被视为一个文件。这些文件组织在目录中。当您的计算机运行时,它会打开多个文件和目录,供不同的进程使用。您可以使用 lsof 命令列出这些打开的文件和目录。在本教程中,我们将通过示例学习如何在 Linux 中使用 lsof 命令。目录先决条件lsof 命令句法如何使用 Linux Lsof 命令Lsof 选项Linux Lsof 命令示例列出所有打开的文件列出特定用户打

设置及查看linux的环境变量详细教程-多极客编程

Linux 操作系统广泛用于服务器,以承载复杂的应用程序,这些应用程序具有非常具体的系统设置。当您启动一个新的 Linux shell 会话时,会读取某个系统配置并相应地设置您的计算机。这些配置和设置由环境变量控制。我们将了解如何在 Linux 系统中列出和设置环境变量。目录先决条件Linux中的环境变量是什么列出当前环境变量设置环境变量设置环境变量持久化取消设置环境变量结论​主要分享低代码、微服

java数组-多极客编程

数组是什么? 数组是相同类型的,用一个标识符名称封装到一起的一个对象序列或基本类型数据序列。简单来讲就是一组相同类型元素的集合。为什么使用数组? 当需要存储大量数据,例如需要读取100个数,那么就需要定义100次变量,而数组就解决了这个问题,通过数组容器将相同类型的元素用一个标识符封装起来,方便存储和操作。数组的声明: 1、先声明,再赋值 int score[]=new int[5];

java抽象和封装-多极客编程

如何从现实生活中抽象出类? 从对象中抽出类: 1.发现对象的种类 2.发现对象的属性(特征) 3.发现对象的方法(行为) 提示:从对象中抽象出来的类,都可以创建这些对象访问修饰符: public: 公共的(最高权限) private: 私有的(最低权限) 只能在当前类中访问(使用)为什么封装? 保护数据的有效性和安全性,只能通过特定的方法才能访问。封装的步骤: 1.修改属

java类的有参无参方法-多极客编程

方法的组成: 1.修饰符 public 2.返回值类型 void:无返回值 3.方法名称 驼峰命名 myName showName() 4.方法体 { }创建方法的语法: public 返回值类型 方法名(){ //方法体 }注意:返回值类型不是return返回相应的数据类型 public String 方法名(){ //方法体 return "S

svn培训笔记(下拉项目、同步修改、添加文件、修改文件、删除文件、改名文件等)-多极客编程

前言   为了方便新加入团队的员工熟悉团队协作开发。   为了将好东西整理分享给有需要的网友。   将SVN内部员工培训文档公开,以方便更多的人,提高知识获取速度,尽快熟悉协同开发。   本文档培训员工对于SVN的基本操作,这些操作是开发过程中最常用的操作,实战针对性较强。 <br> SVN SVN介绍   SVN是subversion的缩写,是一个开放源代码的版本控制系统,通过采用分