Java 在 2023 年仍然流行的 25 个原因( 四 )


12. 可观测性和监控在过去,很多开发者主要致力于单体应用的开发和维护 。处理故障和修复漏洞相对直接,因为整个应用都集中在一个统一的代码库中 。这就像在一张详尽的地图上导航,追踪问题相对容易 。
然而,随着微服务、无服务器计算和分布式系统的兴起,情况发生了显著的变化 。由于微服务作为独立服务通过网络通信,识别和解决问题变得更加复杂 。当问题发生时,它们可能不再局限于单个代码库 。以下是我在使用 Java 进行开发时,最青睐的一些监控工具 。
标准分析工具:VisualVM.
VisualVM 对我来说就像是探索 Java 应用内部世界的可靠伙伴 。它融合了 JConsole 和 VisualGC 的功能 , 为我提供了一个用于监控线程、堆使用情况和 CPU 性能的可视化平台 。此外,它与各种 JDK 工具的兼容性极佳,是一款十分可靠的监控工具 。
YourKit.
YourKit 在我的工具箱中就像一位秘密特工 。它能够深入到方法级别 , 揭示程序的执行时间和内存分配情况 。它提供了一种简单、易用且安全的方法 , 在云环境、容器和集群中进行性能分析 。
应用性能监控(APM)工具:New Relic.
New Relic 是我的首选应用性能监控工具 。它就像一个全天候监视我的应用程序的私人助手,提供从实时洞察到详细的事务跟踪 。它的警报系统就像我的安全网,确保我对任何异常行为及时获得通知 。
AppDynamics.AppDynamics 是我的性能监控艺术家!它采用全面的监控方式,观察并可视化整个技术栈,从数据库和服务器到云原生和混合环境 。我特别欣赏它如何帮助我理解性能对最终用户体验的影响,让它不仅仅是一个监控工具 , 更是一种用户满意度的衡量工具 。
日志解决方案:Log4j.
Log4j 在日志框架界就像一位可靠的元老 。无论遇到何种情况,它都能忠实地记录下事件和错误 。其在配置 Appender 和过滤器方面的灵活性,使其成为适应各种日志需求的坚实选择 。
SLF4J.
SLF4J 就像我手头的日志瑞士军刀 。它本身并不直接记录日志,而是作为一个外观层,允许我无缝切换不同的日志实现 。这种灵活性使它成为在多个库中进行日志管理的理想选择,尤其是当这些库有各自的日志偏好时 。
Java 的可观测性:Digma:连续反?。–F) 。
在软件开发中,如果不能直观地看到代码在实际环境中的运行效果,就难以做出明智的设计决策和评估更改的影响 。Digma 通过在可观测性和代码之间建立联系,为一种新型的开发方法铺平了道路 。
Digma是一个连续反馈工具 ,旨在简化从 OpenTelemetry 可观测性源收集和处理代码数据的过程 。Digma 作为 IDE 插件在本地运行,边编码边收集代码的数据,从追踪到日志和指标 , 让你能够实时捕捉问题并获取深入洞察 。
Prometheus 和 Grafana
Prometheus 和 Grafana 是我不可或缺的动态双人组合 。Prometheus 负责从应用程序中抓取指标,而 Grafana 则将这些指标转换成美观且可自定义的仪表板 。这些工具的开源性质和活跃的社区使它们成为我日常可观测性的重要组成部分 。
Elastic Stack (ELK)Elastic Stack 结合了基于 AI 和搜索的开放、可扩展的全栈可观测性功能 。Elasticsearch、Logstash 和 Kibana 一起构成了一个强大的工具组合,用于搜索、分析和可视化日志 。它们将日志、指标和追踪数据关联起来,为我提供了一个全面的调查工具包 。
13. 函数式编程的支持自从 Java 8 推出以来,函数式编程已成为 Java 支持的另一种编程范式 。在函数式编程中 , 函数被视为“一等公民”,这意味着它们可以被赋值给变量、作为参数传递,甚至作为返回值 。
Java 中的函数式编程特性为编程语言增添了吸引力 。对我而言,采用 Java 中的函数式编程特性是一场规则改变的游戏 。Lambda 表达式和函数接口的引入,不仅让我写出的代码更加简洁,而且表达力更强 。利用 Stream API , 我的应用程序得以在多核处理器上执行并行处理 , 从而获得性能上的提升 。
import java.util.ArrayList;import java.util.Arrays;import java.util.List;public class Main {public static void main(String[] args) {List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));int sum = list.stream().reduce(0, (a, b) -> a + b);System.out.println(sum);}}我发现,函数式编程所倡导的声明式风格使代码更易于阅读和理解 。对不可变性的重视以及避免副作用的原则,对我编写的代码产生了积极影响,使其更加可预测和易于维护 。而在测试方面,纯函数的普遍应用使得测试工作更加容易 。


推荐阅读