Springboot Admin(SBA) + Nacos + Arthas 搭建你的在线性能分析和问题定位工具-服务端改造篇

本文主要是介绍Springboot Admin(SBA) + Nacos + Arthas 搭建你的在线性能分析和问题定位工具-服务端改造篇,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文背景介绍:

arthas有大牛提到sba 和arthas的集成,没有源码,自己磕磕绊绊,东拼西凑,打通任督二脉后,留下此文,一来做知识沉淀,二来分析给有需要的人
Arthas官方文档
参考博文1
参考博文2

环境和使用相关版本

SpringBoot Admin 2.3.1
Athas 3.4.5
Nacos 2.2.1.RELEASE(nacos注册&配置中心百度搜索搭建)

SBA + Arthas服务端集成

SBA 服务搭建

  1. pom.xml文件
<dependencies><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>de.codecentric</groupId><artifactId>spring-boot-admin-starter-server</artifactId><version>2.3.1</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!--    <dependency>--><!--      <groupId>org.springframework.boot</groupId>--><!--      <artifactId>spring-boot-starter-mail</artifactId>--><!--    </dependency>--><dependency><groupId>org.jolokia</groupId><artifactId>jolokia-core</artifactId></dependency><!-- arthas 集成需要 --><dependency><groupId>com.taobao.arthas</groupId><artifactId>arthas-common</artifactId><version>${arthas.version}</version></dependency><dependency><groupId>com.taobao.arthas</groupId><artifactId>arthas-tunnel-common</artifactId><version>${arthas.version}</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>com.github.ben-manes.caffeine</groupId><artifactId>caffeine</artifactId></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId></dependency><dependency><groupId>it.ozimov</groupId><artifactId>embedded-redis</artifactId><version>0.7.3</version><exclusions><exclusion><groupId>org.slf4j</groupId><artifactId>slf4j-simple</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional><scope>runtime</scope></dependency></dependencies><build><finalName>${project.artifactId}</finalName><resources><!-- 指定 src/main/resources下所有文件及文件夹为资源文件 --><resource><directory>src/main/resources</directory><targetPath>${project.build.directory}/classes</targetPath><includes><include>**/*</include></includes><filtering>true</filtering></resource><!-- 通过 Maven Resource 的指定配置打入指定目录,实现 SBA 启动时的自定义加载 ,通过application配置 外链--><resource><directory>static</directory><targetPath>${project.build.directory}/classes/META-INF/spring-boot-admin-server-ui/extensions/arthas</targetPath><filtering>false</filtering></resource></resources><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><!--fork :  如果没有该项配置,肯呢个devtools不会起作用,即应用不会restart   这个要手动加进去 --><fork>true</fork></configuration><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build>
  1. bootstrap.yml
server:port: 7900spring:main:## 解决 xxx.FeignClientSpecification异常allow-bean-definition-overriding: trueapplication:name: xiaogj-ms-admin-serverprofiles:active: ${SPRING_PROFILES:dev}cloud:nacos:config:file-extension: ymlnamespace: ${NACOS_NAMESPACE:group_name}username: ${NACOS_USERNAME:nacos}password: ${NACOS_PASSWORD:nacos}server-addr: ${NACOS_SERVER_ADDR:your nacos url}discovery:namespace: ${NACOS_NAMESPACE:group_name}
  1. application.yml配置
    主要用于配置arthas相关配置和admin自定义的页面
# 监控监控
management:endpoints:web:exposure:include: '*'metrics:tags:application: ${spring.application.name}## 关闭rabbitmq 健康检查health:redis:enabled: falserabbit:enabled: falseelasticsearch:enabled: falseendpoint:health:show-details: ALWAYSarthas:server:host: 0.0.0.0port: 7901enable-detatil-pages: true# redis模式缓存#embedded-redis:#enabled: true#settings: maxmemory 128Mspring:boot:# /META-INF/spring-boot-admin-server-ui/admin:ui:# 自定义网页header,默认值assets/img/icon-spring-boot-admin.svg,自定义地址#brand: <img src="custom/custom-icon.png"># 自定义logo图标,默认路径/META-INF/spring-boot-admin-server-ui/assets/img/#login-icon: assets/img/custom-login-icon.svg# 外链或扩展页面external-views:- label: "Arthas Console"url: ./extensions/arthas/arthas.htmlorder: 1900#security:#user:#name: "admin"#password: "admin123"# caffeine缓存配置cache:type: caffeinecache-names: inMemoryClusterCachecaffeine:spec: maximumSize=3000,expireAfterAccess=3600s#mail:#host: smtp.163.com#username: xiaolinlin#password:#boot:#admin:#notify:#mail:#to: 84226733@qq.com

SBA项目的搭建不多描述,仅描述核心部分

Arthas后端集成

  1. 参考博文大神文章,直接将tunnel-server的项目的代码拷贝到sba工程,工程目录结构如下
    Arthas服务端代码部分

  2. 新增一个ArthasController,主要用于前端获取所有注册的arthas 的客户端

import com.xiaogj.ms.admin.server.arthas.AgentInfo;
import com.xiaogj.ms.admin.server.arthas.TunnelServer;
import java.util.Map;
import java.util.Set;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;/*** 获取所有注册到 Arthas 的客户端 <br>** @date: 2021/8/17 <br>* @author: llxiao <br>* @since: 1.0 <br>* @version: 1.0 <br>*/
@RequestMapping("/api/arthas")
@RestController
public class AthasController {@Autowiredprivate TunnelServer tunnelServer;@RequestMapping(value = "/clients", method = RequestMethod.GET)public Set<String> getClients() {Map<String, AgentInfo> agentInfoMap = tunnelServer.getAgentInfoMap();return agentInfoMap.keySet();}}
  1. 注释掉ArthasTunnelApplication类,通过sba的主类启动,注意该类上的一些注解使用

Arthas前端集成

  1. src目录同级创建static文件夹,然后拷贝tunnel-server项目的所有静态文件,格式如下
    前端改造
    针对图的1-4点分章节描述和贴源码
  2. arthas.html,主要在参考博文1的基础上微调
    该文件我这里其实是直接拷贝原来的index.html文件,仅做了部分调整,改动地方如下:
    新增引入js文件
    HTML修改部分
    源码如下:
<!doctype html>
<html lang="en"><head><!-- Required meta tags --><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"><!-- Bootstrap CSS --><link rel="stylesheet" href="bootstrap-4.2.1.min.css"><link rel="stylesheet" href="bootstrap-select.min.css" rel="stylesheet"><!-- Optional JavaScript --><!-- jQuery first, then Popper.js, then Bootstrap JS --><link href="xterm.css" rel="stylesheet" /><link href="main.css" rel="stylesheet" /><script src="jquery-3.3.1.min.js"></script><script src="popper-1.14.6.min.js"></script><script src="bootstrap-4.2.1.min.js"></script><script src="xterm.js"></script><script src="web-console.js"></script><script src="arthas.js"></script><script src="bootstrap-select.min.js"></script><script type="text/javascript">window.addEventListener('resize', function () {var terminalSize = getTerminalSize();ws.send(JSON.stringify({ action: 'resize', cols: terminalSize.cols, rows: terminalSize.rows }));xterm.resize(terminalSize.cols, terminalSize.rows);});</script><title>Arthas Console</title>
</head><body><nav class="navbar navbar-expand navbar-light bg-light flex-column flex-md-row bd-navbar"><a href="https://github.com/alibaba/arthas" target="_blank" title="" class="navbar-brand"><img src="logo.png"alt="Arthas" title="Welcome to Arthas web console" style="height: 25px;" class="img-responsive"></a><button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent"aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation"><span class="navbar-toggler-icon"></span></button><div class="collapse navbar-collapse" id="navbarSupportedContent"><ul class="navbar-nav mr-auto"><li class="nav-item active"><a class="nav-link" href="https://arthas.aliyun.com/doc" target="_blank">Documentation<span class="sr-only">(current)</span></a></li><li class="nav-item"><a class="nav-link" href="https://arthas.aliyun.com/doc/arthas-tutorials.html" target="_blank">Online Tutorials</a></li><li class="nav-item"><a class="nav-link" href="https://github.com/alibaba/arthas" target="_blank">Github</a></li></ul></div><form class="form-inline my-2 my-lg-0"><div class="col"><div class="input-group "><div class="input-group-prepend"><span class="input-group-text" id="ip-addon">IP</span></div><input value="127.0.0.1" v-model="ip" type="text" class="form-control" name="ip" id="ip"placeholder="please enter ip address" aria-label="ip" aria-describedby="ip-addon"></div></div><div class="col"><div class="input-group "><div class="input-group-prepend"><span class="input-group-text" id="port-addon">Port</span></div><input value="7901" v-model="port" type="text" class="form-control" name="port" id="port"placeholder="please enter port" aria-label="port" aria-describedby="port-addon"></div></div><div class="col"><select id="selectServer" data-style="btn-info"></select>
<!--                <div class="input-group ">-->
<!--                    <div class="input-group-prepend">-->
<!--                        <span class="input-group-text" id="agentId-addon">AgentId</span>-->
<!--                    </div>-->
<!--                    <input value="" v-model="agentId" type="text" class="form-control" name="agentId" id="agentId"-->
<!--                        placeholder="please enter agentId" aria-label="agentId" aria-describedby="agentId-addon">-->
<!--                </div>--></div><div class="col-inline"><button title="connect" type="button" class="btn btn-info form-control" onclick="startConnect()">连接Aarthas</button><button title="disconnect" type="button" class="btn btn-info form-control" onclick="disconnect()">断开连接</button><button title="release" type="button" class="btn btn-info form-control" onclick="reloadAgent()">重新加载服务</button>
<!--                <a id="arthasOutputA" target="_blank" href="arthas-output/" class="btn btn-info" role="button" οnclick="updateArthasOutputLink()">Arthas Output</a>--></div></form></nav><div class="container-fluid px-0"><div class="col px-0" id="terminal-card"><div id="terminal"></div></div></div><div title="fullscreen" id="fullSc" class="fullSc"><button id="fullScBtn" onclick="xtermFullScreen()"><img src="fullsc.png"></button></div>
</body></html>
  1. arthas.js 也是直接从参考博文1拷贝过来
    重点关注reloadRegisterApplicationsinitSelect方法,其中reloadRegisterApplications用于从上文编写的ArthasController中获取已注册的arthas客服端
var registerApplications = null;
var applications = null;
$(document).ready(function () {reloadRegisterApplications();reloadApplications();
});/*** 获取注册的arthas客户端*/
function reloadRegisterApplications() {var result = reqSync("/api/arthas/clients", "get");registerApplications = result;initSelect("#selectServer", registerApplications, "");
}function reloadAgent(){reloadRegisterApplications();reloadApplications();
}/*** 获取注册的应用*/
function reloadApplications() {applications = reqSync("/api/applications", "get");console.log(applications)
}/*** 初始化下拉选择框*/
function initSelect(uiSelect, list, key) {$(uiSelect).html('');var server;for (var i = 0; i < list.length; i++) {//server = list[i].toLowerCase().split("@");//if ("phantom-admin" === server[0]) continue;//$(uiSelect).append("<option value=" + list[i].toLowerCase() + ">" + server[0] + "</option>");server = list[i].toLowerCase();$(uiSelect).append("<option value=" + server + ">" + server + "</option>");}
}/*** 重置配置文件*/
function release() {var currentServer = $("#selectServer").text();for (var i = 0; i < applications.length; i++) {serverId = applications[i].id;serverName = applications[i].name.toLowerCase();console.log(serverId + "/" + serverName);if (currentServer === serverName) {var result = reqSync("/api/applications/" +serverId+ "/env/reset", "post");alert("env reset success");}}
}function reqSync(url, method) {var result = null;$.ajax({url: url,type: method,async: false, //使用同步的方式,true为异步方式headers: {'Content-Type': 'application/json;charset=utf8;',},success: function (data) {// console.log(data);result = data;},error: function (data) {console.log("error");}});return result;
}
  1. web-console.js改造点说明:主要是注释掉自动连接,通过selectServer选择器选择
    注释掉自动加载
    在这里插入图片描述

改造后效果展示

  1. SBA首页新增Arthas链接
    SBA首页新增Arthas链接
    我曾经在这个外链折腾了好久,最早sba用2.2.1的版本,无论如何外链都不行,更改了2.3.1版本才生效
    这里的要点:

1.pom文件里面有一块打包的时候要将static文件打包到sba指定的目录

<resources><!-- 指定 src/main/resources下所有文件及文件夹为资源文件 --><resource><directory>src/main/resources</directory><targetPath>${project.build.directory}/classes</targetPath><includes><include>**/*</include></includes><filtering>true</filtering></resource><!-- 通过 Maven Resource 的指定配置打入指定目录,实现 SBA 启动时的自定义加载 ,通过application配置 外链--><resource><directory>static</directory><targetPath>${project.build.directory}/classes/META-INF/spring-boot-admin-server-ui/extensions/arthas</targetPath><filtering>false</filtering></resource></resources>

2.appliction配置要配对

spring:boot:# /META-INF/spring-boot-admin-server-ui/admin:ui:# 自定义网页header,默认值assets/img/icon-spring-boot-admin.svg,自定义地址#brand: <img src="custom/custom-icon.png"># 自定义logo图标,默认路径/META-INF/spring-boot-admin-server-ui/assets/img/#login-icon: assets/img/custom-login-icon.svg# 外链或扩展页面external-views:- label: "Arthas Console"url: ./extensions/arthas/arthas.htmlorder: 1900
  1. 外链到Arthas Console效果
    在这里插入图片描述
    此处两点注意点:
  1. 外链的地址
  2. Port端口,这里一定是arthas.server.port的端口配置,如果是容器需要对应映射的端口
  1. 点击链接后进入到arthas页面,到这里就是arthas的能力圈了,就尽情享受
    arthas页面
    控制台如何使用复制粘贴:复制Ctrl+Insert/粘贴Shift+Insert 或Ctrl+Shift+c/Ctrl+Shift+v参考链接
    至此服务端已完成改造,以上都是核心点描述,源码待后续整理上传到github

这篇关于Springboot Admin(SBA) + Nacos + Arthas 搭建你的在线性能分析和问题定位工具-服务端改造篇的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/222702

相关文章

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,