`
mysh
  • 浏览: 29439 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

spring 调用性能监控

 
阅读更多

很多时候, 当后端服务出现性能问题, 如何调优是个难题, 因为当业务变得很复杂, 定位问题十分困难.

企业开发中常用的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 性能监控器

    本篇文章将深入探讨如何使用Spring AOP实现性能监控器,并通过源码分析来理解其工作原理。 首先,我们要了解AOP的核心概念——切面(Aspect)、通知(Advice)、连接点(Join Point)、切入点(Pointcut)和织入...

    windows环境搭建调用链监控 spring cloud+es+kafka+zipkin

    这个系统可以帮助我们实时监控微服务架构中的调用性能,及时发现和定位问题,提升系统的整体稳定性和效率。在实践中,可能还需要考虑数据清洗、告警策略、安全措施等更多细节,但以上内容已经构成了一个基础的调用链...

    Java性能监控工具Jprofiler4.3.2

    Java性能监控工具JProfiler是Java开发中的重要辅助软件,它为开发者提供了深入的性能分析功能,帮助优化应用程序的运行效率。JProfiler 4.3.2版本是该工具的一个历史版本,虽然较新版本可能拥有更多特性,但4.3.2...

    cat性能监控demo资源

    在IT行业中,性能监控是确保系统稳定性和效率的...综上所述,"cat性能监控demo资源"将帮助开发者理解如何在Spring MVC环境中使用Cat进行性能监控,通过实践案例学习Cat的功能和使用技巧,从而提升系统的稳定性与效率。

    Spring Boot Aspect 切面 AOP 拦截器 Interceptor 监控control请求耗时

    拦截器(HandlerInterceptor)用于在请求被实际处理之前和之后执行一些额外的任务,如记录请求日志、性能监控等。在Spring Boot中,我们可以通过实现`HandlerInterceptor`接口并重写其三个方法——`preHandle()`, `...

    spring-cloud-alibaba+dubbo+nacos内部服务调用

    6. **监控与日志**:Nacos和Dubbo都提供了丰富的监控和日志接口,可以与Prometheus、ELK Stack等工具集成,实现服务的性能监控和问题排查。 7. **服务安全**:整合Spring Security或OAuth2,可以为服务间通信添加...

    koTime是一个轻量级的springboot项目性能分析工具,通过方法调用链路追踪以及运行时长监控快速定位性能瓶颈

    koTime是一个轻量级的springboot项目性能分析工具,通过方法调用链路追踪以及运行时长监控快速定位性能瓶颈,并进行可视化展示,还支持代码热更新与邮件预警; 实时监听方法,统计运行时长; web展示方法调用链路,...

    Spring Cloud 学习案例,服务发现、服务治理、链路追踪、服务监控等

    Spring Cloud Sleuth 结合 Zipkin 或 Jaeger 等链路追踪系统,可以实现分布式系统中的日志跟踪,帮助开发者定位性能瓶颈和故障。Sleuth 会在每个微服务的请求中添加独特的追踪 ID,从而在多个服务之间串联起完整的...

    Spring MVC Interceptor 实现性能监控的功能代码

    对于更深入的性能分析,如内存使用、数据库查询性能等,可能需要借助专门的性能监控工具,如Java Profiler(如VisualVM、JProfiler)、APM工具(如Dynatrace、New Relic)或Spring Boot Actuator等。

    spring源码分析(1-10)

    5. **Spring AOP**:AOP(Aspect Oriented Programming)允许在不修改源代码的情况下,添加交叉关注点,如日志、事务、性能监控。Spring AOP通过动态代理(JDK Proxy或CGLIB)创建目标对象的代理,实现切面的织入。...

    定时调用java程序监控webservice或系统可用性

    在IT行业中,对服务或系统的可用性和性能进行监控是至关重要的。Java作为一种广泛使用的编程语言,提供了丰富的工具和方法来实现这一目标。本篇将详细探讨如何利用Java编写定时任务来监控Web服务或系统的可用性,并...

    一个轻量级的springboot项目性能分析工具源码+数据库,通过方法调用链路追踪以及运行时长监控快速定位性能瓶颈,可视化展示

    一个轻量级的springboot项目性能分析工具,通过方法调用链路追踪以及运行时长监控快速定位性能瓶颈,并进行可视化展示,还支持代码热更新与邮件预警 实时监听方法,统计运行时长 web展示方法调用链路,瓶颈可视化...

    springAop与spring定时器

    Spring AOP(面向切面编程)是Spring框架中的一个重要组件,它允许我们在不修改源代码的情况下,通过在程序运行时动态地将代码插入到方法调用中,来实现跨切面的关注点,如日志记录、性能监控、事务管理等。而Spring...

    Spring源码文档和方法调用流程图

    它可以用于日志记录、事务管理、性能监控等。AOP通过定义切面(Aspect)、通知(Advice)、连接点(Join Point)、切入点(Pointcut)和织入(Weaving)等概念实现。 4. **IoC(Inversion of Control,控制反转)**...

    基于springboot的两个项目之间的远程调用

    - 监控与日志:集成监控工具如Prometheus和Grafana,以及日志系统如ELK Stack,以便跟踪和分析远程调用的性能和错误。 6. **总结** 基于Spring Boot的远程调用是实现微服务架构中服务间通信的关键技术,选择合适...

    使用Spring进行数据访问

    另外,Spring的AOP(面向切面编程)也对数据访问提供了支持,如日志记录、性能监控等。通过定义切面和通知,可以在数据访问的关键点插入自定义逻辑,而不影响业务代码。 最后,Spring Boot简化了Spring应用的初始化...

    springcloud集成调用跟踪.docx

    这个集成方案不仅提供了一种实时监控服务调用的方式,还能够帮助团队进行性能优化、故障排查和容量规划。通过丰富的追踪数据,可以更好地理解服务间的交互,提升微服务架构的可维护性和可扩展性。在开发和运维过程中...

    spring-cloud项目_springcloud_springcloud项目_springcloud_spring-clou

    它通过断路器模式来监控服务调用,当服务不可用时,能快速失败并切换到备用逻辑。 5. **Spring Cloud Config**: 这是一个配置服务器和客户端的集合,允许你在开发过程中集中管理和推送配置,支持 Git 存储和服务器...

    Spring Cloud Eureka + Spring Cloud Gateway + Spring Cloud Zipkin

    总之,Spring Cloud Eureka、Spring Cloud Gateway和Spring Cloud Zipkin的集成使用,能够为微服务架构提供服务治理、API管理和性能监控的能力,从而提高系统的稳定性和可维护性。对于开发、运维人员来说,熟练掌握...

Global site tag (gtag.js) - Google Analytics