如何在基于 SpringBoot 构建的 Java REST API 中查找源代码的哪一部分执行时间更长?
Posted
技术标签:
【中文标题】如何在基于 SpringBoot 构建的 Java REST API 中查找源代码的哪一部分执行时间更长?【英文标题】:How to find which part of the source code is taking more time to execute in Java REST APIs built on SpringBoot? 【发布时间】:2020-06-26 11:29:13 【问题描述】:我有一个基于 Spring Boot 构建的 REST Web 服务,它使用一些后端 REST API 并执行数据库操作以及一些 Redis 缓存事务。当我通过 Postman 工具点击 API 时,需要超过 7 或 8 秒才能获得响应。最初是 2 或 3 秒。当我在每个操作(如数据库事务、redis 缓存事务、使用其他 REST 服务等)之前和之后使用 Java Date API 查看执行时间时,它们分别为 20 毫秒、90 毫秒、500 毫秒等。在执行 Java 代码时,我无法找到 API 响应延迟的位置。 (顺便说一句,还有一些异步代码。)
由于代码量巨大,单个 API 调用中有多个服务实现,我暂时无法跨源代码计算执行时间差异。
是否有开源工具可以找出源代码执行时间以了解 REST Web 服务的性能或响应时间,从而轻松地进一步调试或提高性能?
通常使用 JMeter 之类的工具,我们可以看到性能结果,但我们如何知道代码的哪一部分实际花费了特定时间,例如 SONAR 代码质量工具如何检测哪一行代码可能导致特定类型的错误或问题或潜在的错误或安全威胁。
非常感谢任何帮助。
【问题讨论】:
您是只想在开发环境中运行分析器,还是继续在生产环境中运行? 你好,我想在生产中实现这个,但想先在暂存环境中成功实现并做一个 POC。我正在查看您的参考资料并尝试理解它们并在 Spring Boot 应用程序中实现它。肯定会进一步更新您,并让您知道我是否遇到任何问题。同时,如果我可以在任何 Spring Boot 应用程序中获得有关此 spf4j 实现的任何 github 示例,那将很有帮助。非常感谢您的回答! 你还在做这个吗?您有什么要求来考虑回答这个问题?分析库的 POC 不应该太难,因为示例可以在线获得。 Spring/REST 应用程序中的完整 POC 可能需要一段时间.. 您好!我没有找到任何与 Spring/REST 相关的 POC,并且我无法在这个库的 Spring Boot 上获得任何与配置相关的基本内容,仍在研究中,也许我可以在本周末尝试解决这个问题。如果您有任何其他与 SPF4J 相关的参考资料或文档,请告诉我 我使用 Spring Boot 和 spf4j 组合了一个基本的 POC,但由于缺乏文档,很难设置。您正在运行什么版本的 Java,您使用的是 OpenJDK 还是 Oracle JDK? 【参考方案1】:Java 飞行记录器和任务控制
Oracle 的 Java Flight Recorder 实际上是内置在 Oracle JVM 中的,但是您需要使用内置 JFR 的 JDK 版本。Oracle 还提供了一组名为 Java Mission Control 的工具,可用于分析和可视化输出的 JFR。当然,也可以使用其他开源工具将 JFR 输出转换为火焰图。 JFR 和 JMC 可免费进行开发,但需要商业许可证才能部署到生产环境中。但是,Oracle 已将 JFR 和 JMC 包含在 OpenJDK 11 中。
Spring AOP
Spring AOP 也可用于执行方法分析。请参阅 Profiling a Java Spring application 和 Spring App Method Profiling。这有助于简单的调试,但没有内置的数据可视化。一旦确定了问题方法(由于响应时间长或差异很大),您可以使用 AOP 对其进行注释并在日志文件中或使用 Spring Data ElasticSearch(高级)对其进行监控。
Java 的简单性能框架 (SPF4J)
SPF4J 是一个开源库。它非常易于使用,但缺乏社区支持,因此您需要花一些时间弄清楚它是如何工作的。您可以使用注释来标记和监视特定方法,也可以使用 AOP 来分析整个堆栈跟踪。输出是一系列 ssdump 文件或时间序列数据库 (TSDB) 文件,您可以在 GUI 工具中对其进行可视化,该工具显示最小/最大/平均指标的时间图,并显示火焰图以分析所有方法调用的性能堆栈跟踪。这是 tutorial 和 sample code 解释如何分析 jaxrs REST API。
视觉虚拟机
我犹豫是否将VisualVM 添加到此列表中,因为它主要用于 CPU 和内存分析。它并不专注于时序配置文件。但是,它是一个流行的选项,经过仔细检查,您确实可以获得一些时间信息,如下面的屏幕截图所示。这个工具也绝对值得研究。
IDE 分析器
IDE 附带的工具也可以完成这项工作,例如 NetBeans Profiler 或 IntelliJ Ultimate Profiling Tools(商业)。 IntelliJ 在后台使用 Java Flight Recorder (JFR)。
【讨论】:
以上是关于如何在基于 SpringBoot 构建的 Java REST API 中查找源代码的哪一部分执行时间更长?的主要内容,如果未能解决你的问题,请参考以下文章