`
mysh
  • 浏览: 29013 次
  • 性别: 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

 

 

分享到:
评论

相关推荐

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

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

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

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

    Spring.Batch批处理框架

    对于大数据量和高性能的批处理任务,Spring Batch 同样提供了高级功能和特性来支持,比如分区功能、远程功能。总之,通过 Spring Batch 能够支持简单的、复杂的和大数据量的批处理作业。 Spring Batch 是一个批处理应用...

    SpringCloud-微服务课程笔记

    2. 负载均衡:Spring Cloud支持负载均衡的能力,通过集成Ribbon和Feign等组件,可以实现对服务的自动负载均衡,提高系统的可用性和性能。 3. 服务调用和熔断:Spring Cloud通过集成Ribbon和Hystrix等组件,提供了...

    新版本SpringCloud2学习手册

    声明式服务调用SpringCloud Feign 39 feign介绍 39 环境搭建 40 Maven依赖信息 40 feign客户端接口 40 feign继承特性 41 创建springcloud-2.0-parent 42 Ribbon配置 45 配置Feign客户端超时时间 45 Api网关...

    apache-skywalking-apm-es7-8.1.0.tar.gz

    SkyWalking项目的核心目标,是针对微服务、Cloud Native、容器化架构,提供应用性能监控和分布式调用链追踪能力。 目前已加入Apache孵化器。目前支持链路追踪和监控应用组件如下,基本涵盖主流框架和容器,如国产PRC...

    angular-spring-mvc:带有 AngularJS 的 Spring MVC

    带有 AngularJS 的 Spring MVC 此应用程序最初设计为一个示例 Web 应用程序,目的是使用 Apache JMeter 概念演示进行性能监控(请参阅 pom.xml 以获取相应的博客文章 URL)。 无论如何,它可以被视为带有 AngularJS ...

    Spring面试题

    创建被调用者的工作由spring来完成,然后注入调用者 因此也称为依赖注入。 spring以动态灵活的方式来管理对象 , 注入的两种方式,设置注入和构造注入。 设置注入的优点:直观,自然 构造注入的优点:可以在构造...

    eagle:Eagle分布式rpc调用,借助Zookeeper实现服务注册和发现,基于AQS实现高性能连接池,支持分布式追踪、监控、过载保护等配置。提供Spring和SpringBoot插件,方便与Spring和SpringBoot集成

    基于AQS实现高性能连接池。 提供failover和failfast两种高可用策略。 支持同步和异步回调两种机制。 提供接口方法请求时间、tps等监控信息。 提供和自定义服务端过载保护策略。 jmh基准测试结果 运行基准测试步骤: ...

    基于Springcloud+mysql的分布式架构网上商城设计与实现(源码+设计文档+部署说明+视频演示).zip

    监控与日志:系统使用监控工具和日志系统,如Spring Cloud Sleuth、Zipkin、ELK Stack等,实现对系统运行状态、性能和日志的监控和分析。 水平扩展与弹性伸缩:系统支持水平扩展和弹性伸缩,通过增加服务实例和负载...

    hmily-master.zip

    可观测性 :Metrics多项指标性能监控,以及admin管理后台UI展示 多种RPC : 支持 Dubbo, SpringCloud,Motan, Sofa-rpc, brpc, tars 等知名RPC框架 日志存储 : 支持 mysql, oracle, mongodb, redis, zookeeper 等...

    Dubbo服务框架 v3.2.2

    Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的RPC实现服务的输出和输入功能,可以和Spring 框架无缝集成。 Dubbo主要核心部件: Remoting:网络通信框架,实现了sync-over-async和...

    利用Spring AOP记录方法的执行时间

    给大家介绍的是spring的aop来实现方法级的执行时间的记录监控,以此来评估方法的性能以及针对性的对已存在的方法进行优化。对于监控,我们比较关注监控的可靠性和性能,准确,高效,这才能在不影响整体性能的情况下...

    Spring Cloud Finchley SR2全套(集成Spring Gateway)

    .initialCacheNames(cacheNames) /* 注意这两句的调用顺序,一定要先调用该方法设置初始化的缓存名,再初始化相关的配置 */ .withInitialCacheConfigurations(configMap).build(); return cacheManager; } 框架中...

    kong-client:快速将Spring项目集成到kong api网关

    kong-client是kong的java sdk,它是一种高性能且可扩展的微服务API网关 先决条件 Spring3.2.5+ JDK 1.7以上 Kong2.0.1+ 特征 与springMVC的快速集成:适用于所有spring Web应用程序,只需较少的配置即可工作 服务...

    基于JAVA CS远程监控系统软件的实现(源代码+论文).zip

    JSP引入了被称为“JSP动作”的XML标签,用来调用内建功能。另外,可以创建JSP标签库,然后像使用标准HTML或XML标签一样使用它们。标签库能增强功能和服务器性能,而且不受跨平台问题的限制。JSP文件在运行时会被其...

    2023java面试题大全及答案大厂面试经典问题

    监控方法运行时间 (监控性能)。 权限控制,数据权限等。 缓存优化(第一次调用查询数据库,将查询结果放入内存对象,第二次调用,直接从内存对象返回,不需要查询数据库)。 事务管理(调用方法前开启事务, 调用...

    阿里巴巴开源服务框架Dubbo.zip

     Dubbo 也是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成。 主要核心部件: Remoting: 网络通信框架,实现了 sync-over-...

    基于SpringCloud、SpringBoot敏捷开发框架SuperBoot.zip

    数据源基于Druid,提供更高性能及SQL监控。框架提供统一异常处理,统一响应结果,增加对JPA、Mongo的AOP拦截,由Snowflake ID自动生成赋值主键,数据实体无需开发均可由Idea自动生成。增删改查默认基于方法名称即可...

    lamp-cloud微服务脚手架

    利用Zipkin实现微服务的全链路性能监控, 从整体维度到局部维度展示各项指标,将跨应用的所有调用链性能信息集中展现,可方便度量整体和局部性能,并且方便找到故障产生的源头,生产上可极大缩短故障排除时间。...

Global site tag (gtag.js) - Google Analytics