很多时候, 当后端服务出现性能问题, 如何调优是个难题, 因为当业务变得很复杂, 定位问题十分困难.
企业开发中常用的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项目性能分析工具,通过方法调用链路追踪以及运行时长监控快速定位性能瓶颈,并进行可视化展示,还支持代码热更新与邮件预警; 实时监听方法,统计运行时长; web展示方法调用链路,...
一个轻量级的springboot项目性能分析工具,通过方法调用链路追踪以及运行时长监控快速定位性能瓶颈,并进行可视化展示,还支持代码热更新与邮件预警 实时监听方法,统计运行时长 web展示方法调用链路,瓶颈可视化...
对于大数据量和高性能的批处理任务,Spring Batch 同样提供了高级功能和特性来支持,比如分区功能、远程功能。总之,通过 Spring Batch 能够支持简单的、复杂的和大数据量的批处理作业。 Spring Batch 是一个批处理应用...
2. 负载均衡:Spring Cloud支持负载均衡的能力,通过集成Ribbon和Feign等组件,可以实现对服务的自动负载均衡,提高系统的可用性和性能。 3. 服务调用和熔断:Spring Cloud通过集成Ribbon和Hystrix等组件,提供了...
声明式服务调用SpringCloud Feign 39 feign介绍 39 环境搭建 40 Maven依赖信息 40 feign客户端接口 40 feign继承特性 41 创建springcloud-2.0-parent 42 Ribbon配置 45 配置Feign客户端超时时间 45 Api网关...
SkyWalking项目的核心目标,是针对微服务、Cloud Native、容器化架构,提供应用性能监控和分布式调用链追踪能力。 目前已加入Apache孵化器。目前支持链路追踪和监控应用组件如下,基本涵盖主流框架和容器,如国产PRC...
带有 AngularJS 的 Spring MVC 此应用程序最初设计为一个示例 Web 应用程序,目的是使用 Apache JMeter 概念演示进行性能监控(请参阅 pom.xml 以获取相应的博客文章 URL)。 无论如何,它可以被视为带有 AngularJS ...
创建被调用者的工作由spring来完成,然后注入调用者 因此也称为依赖注入。 spring以动态灵活的方式来管理对象 , 注入的两种方式,设置注入和构造注入。 设置注入的优点:直观,自然 构造注入的优点:可以在构造...
基于AQS实现高性能连接池。 提供failover和failfast两种高可用策略。 支持同步和异步回调两种机制。 提供接口方法请求时间、tps等监控信息。 提供和自定义服务端过载保护策略。 jmh基准测试结果 运行基准测试步骤: ...
监控与日志:系统使用监控工具和日志系统,如Spring Cloud Sleuth、Zipkin、ELK Stack等,实现对系统运行状态、性能和日志的监控和分析。 水平扩展与弹性伸缩:系统支持水平扩展和弹性伸缩,通过增加服务实例和负载...
可观测性 :Metrics多项指标性能监控,以及admin管理后台UI展示 多种RPC : 支持 Dubbo, SpringCloud,Motan, Sofa-rpc, brpc, tars 等知名RPC框架 日志存储 : 支持 mysql, oracle, mongodb, redis, zookeeper 等...
Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的RPC实现服务的输出和输入功能,可以和Spring 框架无缝集成。 Dubbo主要核心部件: Remoting:网络通信框架,实现了sync-over-async和...
给大家介绍的是spring的aop来实现方法级的执行时间的记录监控,以此来评估方法的性能以及针对性的对已存在的方法进行优化。对于监控,我们比较关注监控的可靠性和性能,准确,高效,这才能在不影响整体性能的情况下...
.initialCacheNames(cacheNames) /* 注意这两句的调用顺序,一定要先调用该方法设置初始化的缓存名,再初始化相关的配置 */ .withInitialCacheConfigurations(configMap).build(); return cacheManager; } 框架中...
kong-client是kong的java sdk,它是一种高性能且可扩展的微服务API网关 先决条件 Spring3.2.5+ JDK 1.7以上 Kong2.0.1+ 特征 与springMVC的快速集成:适用于所有spring Web应用程序,只需较少的配置即可工作 服务...
JSP引入了被称为“JSP动作”的XML标签,用来调用内建功能。另外,可以创建JSP标签库,然后像使用标准HTML或XML标签一样使用它们。标签库能增强功能和服务器性能,而且不受跨平台问题的限制。JSP文件在运行时会被其...
监控方法运行时间 (监控性能)。 权限控制,数据权限等。 缓存优化(第一次调用查询数据库,将查询结果放入内存对象,第二次调用,直接从内存对象返回,不需要查询数据库)。 事务管理(调用方法前开启事务, 调用...
Dubbo 也是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成。 主要核心部件: Remoting: 网络通信框架,实现了 sync-over-...
数据源基于Druid,提供更高性能及SQL监控。框架提供统一异常处理,统一响应结果,增加对JPA、Mongo的AOP拦截,由Snowflake ID自动生成赋值主键,数据实体无需开发均可由Idea自动生成。增删改查默认基于方法名称即可...
利用Zipkin实现微服务的全链路性能监控, 从整体维度到局部维度展示各项指标,将跨应用的所有调用链性能信息集中展现,可方便度量整体和局部性能,并且方便找到故障产生的源头,生产上可极大缩短故障排除时间。...