译者 | 李睿
审校 | 孙淑娟
Java编程语言自诞生以来已有将近30年的历史,该语言及其字节码已经广泛应用在从嵌入式芯片到大型服务器群的所有领域。Java结合了坚不可摧的虚拟机和大量的库,为编写随处运行的代码提供了一个肥沃的生态系统。
然而,Java一直在努力的一个领域是服务器领域,它通常必须处理来自数千甚至数百万个用户的连接。早些年,Java工具是创建为所有用户强制执行业务逻辑的服务器端应用程序的最佳工具之一。J2EE、Hibernate、Spring等Java框架和基本的Javaservlet模型使得创建强大的Web应用程序变得相对容易。
在JavaScript和Node.js出现之前,Java技术得以蓬勃发展。在Node.js引起广泛关注之后,开发人员开始迁移到JavaScript运行时环境。这里有两个原因:首先,开发人员欢迎在服务器和浏览器客户机上运行相同的代码。其次,Node.js服务器通常可以显著地提高吞吐量,这要归功于它们的响应式模型。
Java生态系统如今适应了竞争。一开始,一些开发人员采用了Google Web Toolkit等工具,该工具可以将Java转换为JavaScript。接下来,他们致力于提高服务器上的Java运行速度。而早期的服务器Java框架有一个限制:每个传入的请求都有自己的线程。这是一种组织传入和传出数据的干净方式,但也很费事。创建线程需要数千字节的开销,这可能会限制每台服务器可以处理的用户数量。Node.js使用了一个不同的模型,它允许在没有这种开销的情况下处理更多的用户。
最近,Java开发人员将Node.js的创新引入Java堆栈,尤其是云原生Java框架。这些框架模仿Node.js的做法,支持轻量级的功能,运行在云计算服务器上,可以快速启动和停止。它们无需额外的库来支持在可用的服务器实例上的快速部署。云原生Java框架旨在支持可独立安装和重新启动的微服务群。它们通常在Docker或Podman等容器中发布,以实现最快的构建和安装。
寻求云原生体验的现代Java开发人员有多种选择。理想的云原生Java框架利用在Java平台及其第三方库中投入的丰富经验,同时调整它们以在云平台中更快、更轻地运行。以下是为云原生开发和部署从头开始构建的7个Java框架。
1.Micronaut
Micronaut的创建者希望利用Spring和Grails等经典Java框架的最佳部分,例如灵活的配置和依赖项注入,但要消除内存占用过大和启动速度慢的缺点,因为这些缺点使它们不太适合开发微服务。开发人员精心设计了注释,为依赖注入提供了足够的信息,而无需使用旧框架中的内存填充反射。在编译时完成更多Micronaut的配置意味着代码运行更快、更轻。
该框架旨在支持各种基于JVM的语言(目前是Java、Kotlin和Groovy)并在各种云平台中运行它们。预定义的配置文件简化了在所有主要云平台上部署服务器或无服务器功能,并且所有主要数据库连接都有编写良好的文档页面。
Micronaut的开发人员还希望该框架能够支持良好的开发团队合作。HttpClient实现与项目捆绑在一起,以简化编写单元测试,而无需离开Micronaut或添加更多工作。这些测试通常比动态框架所需的测试更简单、更全面。这再次归功于在编译时完成的工作。
Micronaut不仅用于开发具有云计算功能的应用程序。该框架足够通用,可以支持传统角色和一些桌面应用程序。它与GraalVM的紧密集成使得使用Micronaut生成原生应用程序成为可能。
2.Quarkus
想要使用易于理解的命令式和反应式代码组合的开发人员可以求助于Quarkus。Quarkus团队首先预测云原生开发的最常见用例,然后使用示例构建框架,这些示例支持那些只需零配置的用例。其结果可以轻松地集成到容器中,并部署在Kubernetes集群中。
开发团队需要确保快速启动,以便Kubernetes集群可以快速扩展。对于偶尔运行的函数来说,这是一个理想的特性,因为它们在被调用之前可以保持冷状态。
该项目的目标之一是接受和扩展Java社区中常见的许多现有标准和库。例如,JAX-RS注释定义了REST端点。配置从Eclipse微文件开始。Quarkus的开发团队还集成了50多个标准库,因此企业很有可能在某些情况下识别设计模式。
可以将基本的Quarkus框架用于各种服务。从Quarkus 2.8开始,Quarkus的开发人员正在鼓励使用RESTeasy Reactive模型。如果正在开始一个新项目,这是标准选项,但不必使用它。RESTeasy Reactive提供了一种更简单、非阻塞的结构和模式。不是为每个请求分配一个线程,而是一组非阻塞线程处理所有I/O,并在需要时调用代码。
Quarkus还包含广泛的部署选项。虽然它被称为“容器优先”,但它可以在裸机上运行。此外,还有一个名为Funqy的内置配置选项,可以简化创建AWS Lambda、Azure Functions、Knative和其他一些选项所接受的函数。
3.Spring Cloud Functions
Java开发人员非常熟悉Spring框架,因为它是大约20年来许多项目的基础。Spring的开发人员决定创建一个更适合云部署以及其他一些角色的新版本。Spring Cloud Functions中的函数旨在轻松地重新部署到各种任务,如Web服务、流处理或后台工作。
Spring Cloud Functions框架延续了Spring开创的许多相同的传统。此框架中的云功能支持反应式或命令式风格,以及两者的混合。
支持多种选择是该项目的一个重要目标。有一些适配器将这些函数嵌入到AWS Lambda、Microsoft Azure、Apache OpenWhisk、谷歌云平台和其他一些常见的云计算函数环境中。还有一些主要流式框架的适配器,如Apache Kafka、Solace和RabbitMQ,以及独立选项Spring Cloud Stream。打包和部署高度自动化,因此开发人员可以集中精力开发功能。
Spring Cloud Functions开发团队还努力处理云部署的许多常见陷阱和挑战。Spring Cloud Skipper可用于跨多个云平台进行部署。Spring Cloud Sleuth通过跟踪数据流来帮助调试。Spring Cloud Security管理许多用于保护应用程序的琐事,以便只有合适的人员才能执行这些功能。光是子项目就有几十个。
该项目为通过各种平台分发业务应用程序奠定了非常好的基础。一旦应用程序逻辑被封装到一个云函数POJO中,它就可以找到一个在几十个不同角色中工作的场所。
4.Vert.x
Vert.x的创建者希望通过简化事件循环和优化与数据库的连接来创建一个非常快速的框架。Vert.x有一个像Node.js一样的事件循环,它允许在事件到达时处理多个连接。它还利用Java的线程模型来处理池中的多个线程的事件,如果可用,它们可以在多个内核上运行。
该结构还计划简化创建管道以处理事件流。它借用了诸如promises和futures之类的结构来避免带有分层回调的混乱代码。当事件沿着事件总线移动时,异步选项有助于生成干净、可读的代码,其中填充了简单的方法调用链。
Vert.x开发团队对他们的发展愿景并不死板教条。他们认为Vert.x是一个工具包而不是一个框架。该代码是模块化的,因此开发人员可以选择使用一些功能集成到适合其应用程序的架构中。想要更多命令式结构而不是响应式结构的开发人员可以找到对Kotlin协同程序的支持。
该项目是Eclipse生态系统的一部分。多种版本和选项提供了很大的自由度。例如,Vert.x应用程序生成器将生成Java或Kotlin代码,其中包含许多潜在的依赖项,例如模板引擎或API支持。
5.Eclipse MicroProfile
Eclipse团队创建了Micro Profile项目,以此来调整Jakarta EE以运行较小的微服务群。它消除了一些较大平台的开销,同时将许多微服务架构的标准库捆绑在一起。
对于可能从较大、较旧的JavaEE或Jakarta EE项目迁移代码的开发人员来说,这种方法最有吸引力。大部分配置和架构保持不变。在许多情况下调整很小。但是该设计鼓励做出更简单的决策来创建更轻量级、更快的代码。一些开发人员使用MicroProfile作为通往更现代的云原生框架的垫脚石。
6.Dropwizard
一些开发人员对经过良好测试的旧模块有一种天然的感情,他们喜欢采用Dropwizard。Dropwizard的开发团队一直强调稳定和成熟等特性。他们收集了Hibernate之类的数据库连接模块,并在表单和其他标准Web应用程序组件的框架中进行了混合。Dropwizard还简化了依赖项注入和运行时维护过程,如配置和日志记录。
Dropwizard是致力于修改和扩展现有应用程序的团队的最爱。该结构与原有成熟的方法兼容,因为它是在这些方法的基础上构建的。
7.Starter frameworks for cloud platforms
所有的云平台都保留了基本示例,这些示例是开始编写简单函数的好地方。它们主要用于支持非常简单的决策,并帮助开发人员快速启动。
例如,谷歌云平台的开发团队开源了他们在其功能即服务(FaaS)中运行的Java功能的基本框架。使用它构建的代码旨在与谷歌云平台的标准触发器快速集成,尽管它也可以在任何本地机器上成功运行。
微软公司还开源了它的Java框架。该模型包括几个用于简化数据传输的例程,例如用于将JSON数据转换为Java POJO和从Java POJO转换的库。如果函数触发器为调用提供元数据,则框架可以直接处理它。
这两个框架都可以让开发人员通过编写具有单个函数的单个类来完成许多简单的工作。更复杂的项目可能希望将这一基本工具与其他一些框架合并。这些只是起点,但有时这就足够了。
原文标题:7 Java frameworks for a cloud-native world,作者:Peter Wayner