无服务器和Kubernetes原生Java部署实践
随着云部署的兴起,IT 部门使用的物理服务器减少,用电量也相应降低,结果是通过减少碳排放帮助缓解了气候变化。云架构有助于实现这一点,因为它们不需要维护竖井式的计算资源,而是在需要保持业务服务运行时,高效共享所在云上的可用资源。
然而短期内,云迁移的这些好处对于二氧化碳的排放并没有产生显著的影响。这是因为采用云的速度比转向无碳基础设施的速度要快得多。例如,谷歌云目前已实现碳中和,但他们正在努力成为无碳、可持续的云计算系统。
与此同时,开发人员和架构师仍然在尽可能地优化应用程序的性能,缩小容器镜像,缩短启动和响应时间以及减少内存占用。他们相信,这最终能够减少应用层的计算消耗。
Java 诞生于 27 年前,用于运行业务服务。它有诸多优点,如较高的网络吞吐量、长期运行的进程和面向可变系统的动态行为。几十年前,这些都是很棒的特性,开发人员可以编写灵活、丰富的互联网应用,然后在多台应用服务器上运行。这些服务器位于由物理服务器和虚拟机组成的基础设施上。
然而,自从 Kubernetes 和 Linux 容器面世以来,事情发生了变化。它为我们提供了一种新的模式,让我们可以重构现有应用。在云上,我们应该将这些应用当作牛而非猫。新应用的主要特性是可移植、不可变及可快速扩展。
遗憾的是,Java 的动态特性在这个新时代并无多大优势。尽管如此,企业仍然维护着大量基于 Java 技术栈构建的关键业务应用程序,这可能成为将工作负载迁移到云平台的障碍。这也使企业失去了减少二氧化碳排放的机会,因为他们需要花不少钱来维持传统基础设施上的单体应用。
颇具讽刺意味的是,根据 TIOBE 排行榜,Java 仍然是第三大最受欢迎的编程语言。顺应这一趋势,出现了许多开源项目和工具,如 Shenandoah GC。它们试图从吞吐量管理方面优化 Java 的性能,通过扩展、临时状态及减少不可变系统的内存占用。遗憾的是,这些努力不足以说服开发人员将 Java 应用程序留在 Kubernetes 集群中,而不是采用 Java 和 Python 等替代方案。
作为减少云计算资源的无尽努力的一部分,通过定期监控应用程序工作负载和资源使用情况,许多企业已经意识到,所有业务服务都不需要一直运行(例如 24 x 7 x 365)。
举例来说,某些服务(如订单服务)只有不足 10% 的时间被最终用户和第三方访问。在这种情况下,当应用程序在某段时间内(如 5 分钟或 30 秒)没有网络通信时,无服务器架构让你能够自动将应用程序缩减为零。
事实上,无服务器行为不仅可以应用于基于 HTTP 的微服务,还可以应用于来自物联网(IoT)边缘设备和 Kafka 消息服务器的分布式流服务。
作为一名 Java 开发人员,你会问:“Java 如何处理无服务器架构?”更大的问题是:“Java 适合开发无服务器应用程序吗?”根据 NewRelic 的调查,由于重量级的程序包和动态行为,开发人员通常不会在 AWS Lambda 上运行 Java 应用程序,如图 1 所示。
这就是为什么越来越多的开发人员希望将 Node.Js 和 Python 应用程序引入无服务器平台和函数即服务(Function as a Service,FaaS),而不是演进现有 Java 应用程序的原因。不要放弃你的 Java 技能!下一节将介绍如何使 Java 应用程序