Arthas是什么这里就不做介绍了,不了解的同学可以到Arthas官网查看教程Arthas快速入门
Arthas提供了一个工具Arthas Tunnel,我们可以通过Arthas Tunnel Server/Client 来远程管理/连接多个Agent。
基于实际的应用场景,我在Arthas Tunnel Server的功能做了一下扩展,更加方便使用:
通过级联下拉框按服务->实例
自动展示arthas agent列表,无需手动输入agentId进行连接;
基于Nacos动态配置实现的用户->项目
的权限访问控制,可以动态添加修改用户、密码以及用户可以访问的项目访问;
支持代理连接模式,即:通过服务端转发代理连接到arthas agent;
项目地址
GITHUB仓库:arthas-ext
功能说明
arthas agent级联显示
权限控制
在nacos的配置管理中新建一条dataId
=application.yaml
,group
=arthas-tunnel-web
的配置,内容如下:
arthas:tunnel:super-admin-role-sign:'*'#超级管理员的角色标志users:-name:arthas#登录名password:123456#登录密码roles:${arthas.tunnel.super-admin-role-sign}#roles=${arthas.tunnel.super-admin-role-sign}表示超级管理员,拥有查看所有appagent的权限-name:user1#登录名password:123456#登录密码roles:#可以访问的项目列表-service-a-service-b-name:user2password:123456roles:-service-b
代理模式
代理模式主要是为了解决当前浏览器与目标arthas agent的网络不通而无法访问arthas agent的问题,例如在目标服务部署在K8S环境中或要访问线上的服务
解决方式是通过tunnel server建立websocket代理(因为tunnel server与arthas agent的网络必定是通的),浏览器将websocket请求提交到tunnel server中,在tunnel server中做转发代理
websocket转发代理的实现位于com.wf2311.arthas.tunnel.filter
包中,大部分代码移植于SpringCloud Gateway
的WebsocketRoutingFilter
的相关代码
应用名分隔符配置
为了从agentId中区分arthas agent的应用名,约定agentId的生成规则为 <项目名>
+ <分隔符>
+ <随机字符串>
,默认的分隔符为@
,
也可以通过配置arthas.agent.split
属性值来修改分隔符
dynamic-arthas-spring-boot-starter
参考SpringBoot Admin集成Arthas实践 ,在com.taobao.arthas:arthas-spring-boot-starter
的基础上提供Arthas动态开关的效果
Maven坐标
<dependency><groupId>com.wf2311</groupId><artifactId>dynamic-arthas-spring-boot-starter</artifactId><version>2021.07-SNAPSHOT</version></dependency>
动态开关配置
是否启用arthas是通过spring.arthas.enabled
属性进行来控制的,默认为false,即默认不启用Arthas
可以通过Nacos等配置中心设置spring.arthas.enabled
来动态开启或关闭Arthas
参数配置
项目中引入dynamic-arthas-spring-boot-starter
后,通过以下参数配置连接至 Arthas Tunnel Server
arthas:tunnel-server:ws://<ip>:<port>/ws#<ip>、<port>分别ArthasTunnelServer的IP和websocket端口号#客户端id,应用名@随机值,tunnelserver会截取分隔符@前面的字符串作为应用名agent-id:${spring.application.name}@${random.value}http-port:0#为0表示随机telnet-port:0#为0表示随机
或
#<ip>、<port>分别ArthasTunnel的IP和websocket端口号arthas.tunnel-server=ws://<ip>:<port>/ws#客户端id,应用名@随机值,tunnelserver会截取分隔符@前面的字符串作为应用名arthas.agent-id=${spring.application.name}@${random.value}#为0表示随机arthas.http-port=0#为0表示随机arthas.telnet-port=0
以上参数就是com.taobao.arthas:arthas-spring-boot-starter
中的配置参数。如果不需要动态开关功能也可以直接引用com.taobao.arthas:arthas-spring-boot-starter
注意:为保证在Arthas Tunnel Server的页面上能够显示应用名,参数
arthas.agent-id=${spring.application.name}@${random.value}
中的格式需与应用名分隔符配置中说明的配置保持一致
使用说明
本项目为实现动态权限控制的功能,依赖了nacos的配置管理,因此需要连接Nacos服务
具体参数配置可以参见权限控制 和应用名分隔符配置
特别说明:本项目不支持集群部署
部署方式
本机调试
修改bootstrap.yml
中的
spring.cloud.nacos.config.server-addr
spring.cloud.nacos.config.namespace
启动项目
docker启动
dockerrun-d-t-p9999:9999-p7777:7777\-v~/logs/arthas-tunnel-web/:/application/logs\-eJAVA_OPTS='-Xmx512m-Xms512m'\-eSERVER_PORT='<本服务的启动端口,默认为9999>'\-eTUNNEL_SERVER_PORT='<TunnelServer的启动端口,默认为7777>'\-eNACOS_ADDR='<nacos服务地址>'\-eNACOS_NAMESPACE='<nacos命名空间>'\--namearthas-tunnel-webwf2311/arthas-tunnel-web:latest
docker-compose启动
version:"3"services:arthas-tunnel-web:image:wf2311/arthas-tunnel-web:latestcontainer_name:arthas-tunnel-webenvironment:-JAVA_OPTS=-Xmx256m-Xms256m-SERVER_PORT=<本服务的启动端口,默认为9999>-TUNNEL_SERVER_PORT=<TunnelServer的启动端口,默认为7777>-NACOS_ADDR=<nacos服务地址>-NACOS_NAMESPACE='<nacos命名空间>'volumes:-~/Share/logs/arthas-tunnel-web/:/application/logsports:-"9999:9999"-"7777:7777"
k8s部署脚本
apiVersion:apps/v1kind:Deploymentmetadata:name:arthas-tunnel-webspec:replicas:1selector:matchLabels:app:arthas-tunnel-webtemplate:metadata:labels:app:arthas-tunnel-webspec:containers:-env:-name:SERVER_PORTvalue:'<本服务的启动端口,默认为9999>'-name:TUNNEL_SERVER_PORTvalue:'<TunnelServer的启动端口,默认为7777>'-name:JVM_OPTSvalue:'-Xmx256m-Xms256m'-name:NACOS_ADDRvalue:'<nacos服务地址>'-name:NACOS_NAMESPACEvalue:'<nacos命名空间>'name:arthas-tunnel-webimage:'wf2311/arthas-tunnel-web:latest'imagePullPolicy:Alwaysports:-containerPort:<SERVER_PORT>---apiVersion:v1kind:Servicemetadata:name:arthas-tunnel-webnamespace:supportspec:ports:-port:9999targetPort:9999name:arthas-tunnel-web-port:7777targetPort:7777name:arthas-tunnel-serverselector:app:arthas-tunnel-webtype:LoadBalancer
参考
SpringBoot Admin集成Arthas实践
SpringBoot Admin2.0集成Arthas实践