很多时候, 当后端服务出现性能问题, 如何调优是个难题, 因为当业务变得很复杂, 定位问题十分困难.
企业开发中常用的spring构架提供了一个很好的机制 AOP, 方便我们快速定位问题.
这里演示一个组件, 利用AOP, 打印出 spring 调用栈耗时.
@Component("performanceInspector") public class PerformanceInspector { private static class InvokeInfo { List<MutableTriple<Integer, MethodSignature, Long>> infos = new ArrayList<>(); int currentLevel; } private static final ThreadLocal<InvokeInfo> invokeInfoThreadLocal = new InheritableThreadLocal<>(); public Object inspect(final ProceedingJoinPoint pjp) throws Throwable { MethodSignature signature = (MethodSignature) pjp.getSignature(); InvokeInfo invokeInfo = invokeInfoThreadLocal.get(); boolean isRoot = false; if (invokeInfo == null) { invokeInfo = new InvokeInfo(); invokeInfoThreadLocal.set(invokeInfo); isRoot = true; } MutableTriple<Integer, MethodSignature, Long> currInvokeInfo = MutableTriple.of(invokeInfo.currentLevel++, signature, 0L); invokeInfo.infos.add(currInvokeInfo); try { Tick tick = Tick.tick(); Object result = pjp.proceed(); currInvokeInfo.setRight(tick.nip()); return result; } finally { invokeInfo.currentLevel--; if (isRoot) { for (MutableTriple<Integer, MethodSignature, Long> info : invokeInfo.infos) { System.out.println(genInfoStr(info)); } invokeInfoThreadLocal.set(null); } } } private String genInfoStr(MutableTriple<Integer, MethodSignature, Long> info) { return Strings.repeat("\t", info.getLeft()) + info.getMiddle().getDeclaringType().getSimpleName() + "." + info.getMiddle().getName() + " :" + info.getRight() + "ms"; } }
配置一下AOP:
<aop:config> <aop:aspect ref="performanceInspector" > <aop:around method="inspect" pointcut="execution(* *(..))"/> </aop:aspect> </aop:config>
测试用例
@Component("PerformanceInspectorTest") public class PerformanceInspectorTest { @Resource(name = "PerformanceInspectorTest") PerformanceInspectorTest self; @Test public void test() { self.f(); } public void f() { self.a(); self.b(); self.c(); } public void a() { self.b(); } public void b() { self.c(); } public void c() { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } }
输出结果
PerformanceInspectorTest.f :306ms PerformanceInspectorTest.a :99ms PerformanceInspectorTest.b :99ms PerformanceInspectorTest.c :99ms PerformanceInspectorTest.b :99ms PerformanceInspectorTest.c :99ms PerformanceInspectorTest.c :99ms
相关推荐
本篇文章将深入探讨如何使用Spring AOP实现性能监控器,并通过源码分析来理解其工作原理。 首先,我们要了解AOP的核心概念——切面(Aspect)、通知(Advice)、连接点(Join Point)、切入点(Pointcut)和织入...
这个系统可以帮助我们实时监控微服务架构中的调用性能,及时发现和定位问题,提升系统的整体稳定性和效率。在实践中,可能还需要考虑数据清洗、告警策略、安全措施等更多细节,但以上内容已经构成了一个基础的调用链...
Java性能监控工具JProfiler是Java开发中的重要辅助软件,它为开发者提供了深入的性能分析功能,帮助优化应用程序的运行效率。JProfiler 4.3.2版本是该工具的一个历史版本,虽然较新版本可能拥有更多特性,但4.3.2...
在IT行业中,性能监控是确保系统稳定性和效率的...综上所述,"cat性能监控demo资源"将帮助开发者理解如何在Spring MVC环境中使用Cat进行性能监控,通过实践案例学习Cat的功能和使用技巧,从而提升系统的稳定性与效率。
拦截器(HandlerInterceptor)用于在请求被实际处理之前和之后执行一些额外的任务,如记录请求日志、性能监控等。在Spring Boot中,我们可以通过实现`HandlerInterceptor`接口并重写其三个方法——`preHandle()`, `...
6. **监控与日志**:Nacos和Dubbo都提供了丰富的监控和日志接口,可以与Prometheus、ELK Stack等工具集成,实现服务的性能监控和问题排查。 7. **服务安全**:整合Spring Security或OAuth2,可以为服务间通信添加...
koTime是一个轻量级的springboot项目性能分析工具,通过方法调用链路追踪以及运行时长监控快速定位性能瓶颈,并进行可视化展示,还支持代码热更新与邮件预警; 实时监听方法,统计运行时长; web展示方法调用链路,...
Spring Cloud Sleuth 结合 Zipkin 或 Jaeger 等链路追踪系统,可以实现分布式系统中的日志跟踪,帮助开发者定位性能瓶颈和故障。Sleuth 会在每个微服务的请求中添加独特的追踪 ID,从而在多个服务之间串联起完整的...
对于更深入的性能分析,如内存使用、数据库查询性能等,可能需要借助专门的性能监控工具,如Java Profiler(如VisualVM、JProfiler)、APM工具(如Dynatrace、New Relic)或Spring Boot Actuator等。
5. **Spring AOP**:AOP(Aspect Oriented Programming)允许在不修改源代码的情况下,添加交叉关注点,如日志、事务、性能监控。Spring AOP通过动态代理(JDK Proxy或CGLIB)创建目标对象的代理,实现切面的织入。...
在IT行业中,对服务或系统的可用性和性能进行监控是至关重要的。Java作为一种广泛使用的编程语言,提供了丰富的工具和方法来实现这一目标。本篇将详细探讨如何利用Java编写定时任务来监控Web服务或系统的可用性,并...
一个轻量级的springboot项目性能分析工具,通过方法调用链路追踪以及运行时长监控快速定位性能瓶颈,并进行可视化展示,还支持代码热更新与邮件预警 实时监听方法,统计运行时长 web展示方法调用链路,瓶颈可视化...
Spring AOP(面向切面编程)是Spring框架中的一个重要组件,它允许我们在不修改源代码的情况下,通过在程序运行时动态地将代码插入到方法调用中,来实现跨切面的关注点,如日志记录、性能监控、事务管理等。而Spring...
它可以用于日志记录、事务管理、性能监控等。AOP通过定义切面(Aspect)、通知(Advice)、连接点(Join Point)、切入点(Pointcut)和织入(Weaving)等概念实现。 4. **IoC(Inversion of Control,控制反转)**...
- 监控与日志:集成监控工具如Prometheus和Grafana,以及日志系统如ELK Stack,以便跟踪和分析远程调用的性能和错误。 6. **总结** 基于Spring Boot的远程调用是实现微服务架构中服务间通信的关键技术,选择合适...
另外,Spring的AOP(面向切面编程)也对数据访问提供了支持,如日志记录、性能监控等。通过定义切面和通知,可以在数据访问的关键点插入自定义逻辑,而不影响业务代码。 最后,Spring Boot简化了Spring应用的初始化...
这个集成方案不仅提供了一种实时监控服务调用的方式,还能够帮助团队进行性能优化、故障排查和容量规划。通过丰富的追踪数据,可以更好地理解服务间的交互,提升微服务架构的可维护性和可扩展性。在开发和运维过程中...
它通过断路器模式来监控服务调用,当服务不可用时,能快速失败并切换到备用逻辑。 5. **Spring Cloud Config**: 这是一个配置服务器和客户端的集合,允许你在开发过程中集中管理和推送配置,支持 Git 存储和服务器...
总之,Spring Cloud Eureka、Spring Cloud Gateway和Spring Cloud Zipkin的集成使用,能够为微服务架构提供服务治理、API管理和性能监控的能力,从而提高系统的稳定性和可维护性。对于开发、运维人员来说,熟练掌握...