在调试Spring 应用程序之前要知道的三件事

2022-06-01

684

Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.

——出自 Brian W. Kernigham


调试很困难,在某些地方——比如在云、生产环境或 Java Spring 中——甚至更难。此外,调试不仅仅是查找或修复代码中的错误。它还允许开发人员在他们刚加入的项目上开始工作时查看整个应用程序的流程,或者在开始编写新功能之前刷新他们的记忆,从而更好地理解现有的代码库。在这种情况下,以调试模式运行代码以确保您了解应用程序的整个流程是明智之举。


If debugging is the process of removing software bugs, then programming must be the process of putting them in.

——出自 Edsger W. Dijkstra


如果你想产生一个稳定的应用程序,调试和编程一样重要。为了调试 Spring 应用程序,我们需要能够执行以下操作:

通过设置断点来控制代码的执行;

暂停线程并单步执行代码;

检查变量的内容;


在本文中,您将了解调试 Spring 应用程序之前应注意的三件事。


开发人员在准备调试时应该注意哪些 Java 特性?


· 远程调试在生产中运行的应用程序既危险又棘手。它会影响您的应用程序性能,并在遇到断点时使其无法使用。

· Java 越来越多地用于分布式环境,因为它支持多线程、核心网络 API 和丰富的数据结构。调试多线程应用程序很复杂,因为您必须同时跟踪多个线程。

· 您应该知道 JVM 的默认行为是禁用调试。由于打开调试器访问服务器的端口会带来安全问题,因此不建议为生产中的应用程序启用远程调试。


要在Java 虚拟机(JVM) 上为基于 Maven 的 Spring Boot 应用程序启用调试模式  ,您可以将以下命令行参数传递给 JVM。


调试Spring应用


另一种选择是在 Maven pom.xml 文件中使用 Spring Boot Maven 插件提供以下配置。


调试Spring应用


在此之后,您只需要一个支持调试的 IDE。(不妨体验一下TitanIDE——云原生集成开发环境


准备调试 Java/Spring 应用程序时应注意的三个问题


当您要远程调试应用程序时,您应该提前计划一些问题。我们现在将介绍其中的三个大问题,还将讨论如何克服这些挑战。


远程调试

Java 已针对本地调试进行了优化,在非本地环境中调试时需要小心谨慎。通常,调试发生在 IDE 中,这需要在服务器上进行独特的设置。如果您计划在本地调试应用程序,这很有效,但是当您必须调试在生产中实时运行并为请求提供服务的应用程序时,情况就完全不同了。


在分布式环境中调试

在分布式环境中调试应用程序可能会让人不知所措。想象一下,在多台服务器上部署和运行的应用程序中跟踪和隔离生产问题是多么具有挑战性。


调试云原生应用程序

如今,将 Spring 应用程序容器化并在 Kubernetes 等容器编排器之上运行是很常见的。调试非容器化工作负载绝非易事,而容器化又增加了一层复杂性。借助一种部署和运行云原生工作负载的新方法,传统的调试方法不再适用——第三方实时调试工具可以帮助您掌握这种新方法。


· Kubernetes 本身提供了几个开箱即用的选项来调试 Pod 的问题。这是我们可以用来解决 Kubernetes 工作负载问题的命令列表。


Spring应用调试



· 另一个值得考虑的选择是使用 Skaffold等工具的调试功能。Skaffold 是由 Google 开发的开源工具,可帮助改善开发人员在 Kubernetes 部署方面的体验。它可以自动构建、推送和部署部署到 Kubernetes 的应用程序的样板部分。不仅如此,它还可以使用 skaffold debug command检测容器运行时技术(例如,Java 的 JDWP 和 Python 应用程序的 debugpy)并动态启用调试功能。


· Telepresence 是在本地调试 Kubernetes 服务的另一种选择。Telepresence 通过在本地开发机器和远程管理的 Kubernetes 集群之间创建双向网络连接来加速 Kubernetes 应用程序的内部开发循环。您无需花时间配置远程调试协议和使用 kubectl port-forward 命令公开端口即可在本地访问远程 Kubernetes 服务。


结论

软件交付要经过多次测试迭代,但错误是不可避免的,而调试是您对它们的最佳防御之一。


文章改编自Karl Hughes《Three things to know before debugging your spring application》。


—————————————————————————


TitanIDE,云原生集成开发环境


TitanIDE 采用 B/S 架构,是以浏览器作为客户端,以服务器作为服务端运行在云端的云原生集成开发环境,包括工作空间、项目、应用端口映射、多租户、权限管理等功能。 TitanIDE 提供了常用的语言环境模板,让您能够更快速的启动一个开箱即用的IDE,从而聚焦业务开发,不管在哪里,只需要浏览器就能编写并运行、调试您的项目代码。


开发上云,是云原生应用开发不可逆转的趋势,TitanIDE要做开发者之间的互联的桥梁,打通云原生开发体系。


TitanIDE 在线体验环境,免费体验>






技术交流
我们建立了多个云原生技术交流群,其中有来自Oracle、Citrix、华为、腾讯等国内外云计算专家,立即扫码,拉你进群。目前已有2000+开发者加入我们......
云原生厂商 云原生技术服务商
在云原生时代,行云创新致力于通过赋能开发者,实现企业快速迭代与交付,大幅提升创新效率。
产品下载