面向云原生世界的 8 个 Java 框架

Java 编程语言已经进入第三个十年,该语言及其字节代码已在从嵌入式芯片到大型服务器场的所有领域找到了归宿。 Java 结合了坚如磐石的虚拟机和大量的库,为编写可在任何地方运行的代码创造了一个肥沃的生态系统。

然而,Java 苦苦挣扎的一个领域是服务器领域,它通常必须处理来自数千甚至数百万用户的连接。 在早期,Java 工具是创建服务器端应用程序的最佳工具之一,这些应用程序为所有用户强制执行业务逻辑。 J2EE、Hibernate、Spring 和基本的 Java servlets 模型等 Java 框架使得创建强大的 Web 应用程序变得相对容易。

该技术蓬勃发展,直到 JavaScript 和 Node.js 出现。 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 平台及其第三方库中投入的丰富经验,同时调整它们以在云中运行得更快、更轻。 以下是为云原生开发和部署从头开始构建的八个 Java 框架。

微航

Micronaut 的创建者希望利用 Spring 和 Grails 等经典 Java 框架的最佳部分(例如灵活的配置和依赖项注入),但要去除沉重的内存占用和缓慢的启动,这使得它们不太适合开发微服务。 他们精心设计了注释,为依赖注入提供了足够的信息,而没有旧框架中使用的内存填充反射。 在编译时完成更多 Micronaut 的配置意味着代码运行得更快、更轻。

该框架旨在支持各种基于 JVM 的语言(目前为 Java、Kotlin 和 Groovy)并在各种云中运行它们。 预定义的配置文件简化了在所有主要云上部署服务器或无服务器功能,并且所有主要数据库连接都有精心编写的文档页面。

Micronaut 的开发人员还希望该框架能够支持良好的开发团队合作。 HttpClient 实现与项目捆绑在一起,以简化单元测试的编写,而无需离开 Micronaut 或添加更多工作。 这些测试通常比动态框架所需的测试更简单、更全面。 这再次归功于编译时所做的工作。

Micronaut 不仅仅用于开发具有云功能的应用程序。 该框架足够通用,可以支持传统角色和一些桌面应用程序。 它与 GraalVM 的紧密集成使得使用 Micronaut 生成原生应用程序成为可能。

夸克

想要使用易于理解的命令式代码和反应式代码组合的开发人员可以求助于 Quarkus。 Quarkus 团队首先预测最常见的云原生开发用例,然后使用支持这些用例的示例构建框架,配置最少为零。 结果很容易集成到容器中并部署到 Kubernetes 集群中。

开发团队特别注意确保快速启动时间,以便 Kubernetes 集群可以快速扩展。 对于偶尔运行的函数来说,这是一个理想的特性,因为它们在被调用之前可以保持冷状态。

该项目的目标之一是接受和扩展 Java 社区中常见的许多现有标准和库。 例如,JAX-RS 注释定义了 REST 端点。 配置从 Eclipse MicroProfile 开始。 Quarkus 的开发团队还集成了 50 多个标准库,因此您很有可能会在某些情况下识别设计模式。

您可以将基本的 Quarkus 框架用于各种服务。 从 Quarkus 2.8 开始,Quarkus 的开发人员逐渐鼓励 RESTeasy Reactive 模型。 如果您正在开始一个新项目,这是标准选项,但您不必使用它。 RESTeasy Reactive 提供了一种更简单、非阻塞的结构和模式。 一组非阻塞线程处理所有 I/O 并在需要时调用您的代码,而不是为每个请求分配一个线程。

Quarkus 还包含广泛的部署选项。 虽然它被称为“容器优先”,但它可以在裸机上运行。还有一个名为 Funqy 的内置配置选项,可以简化创建 AWS Lambda、Azure Functions、Knative 和其他一些选项所接受的功能的过程。

春季云功能

Java 开发人员非常熟悉 Spring 框架,因为大约二十年来它一直是许多项目的基础。 Spring 的开发人员决定创建一个更适合云部署的新版本,以及一些其他角色。 Spring Cloud Functions 中的函数旨在轻松重新部署到各种任务,如 Web 服务、流处理或后台工作。

Spring Cloud Functions 框架延续了 Spring 开创的许多相同的哲学传统。 此框架中的云功能支持反应式或命令式风格,以及两者的混合。

支持多种选择是该项目的一大目标。 有一些适配器可以将函数硬塞进 AWS Lambda、Microsoft Azure、Apache OpenWhisk、Google Cloud Platform 和其他一些常见的云函数环境中。 还有适用于 Apache Kafka、Solace 和 RabbitMQ 等主要流框架的适配器,以及独立选项 Spring Cloud Stream。 打包和部署高度自动化,因此您可以专注于自己开发功能。

Spring Cloud Functions 开发团队也努力应对云部署的许多常见陷阱和挑战。 Spring Cloud Skipper 可用于处理跨多个云的部署。 Spring Cloud Sleuth 通过跟踪数据流来帮助调试。 Spring Cloud Security 管理许多用于保护应用程序的琐事,以便只有合适的人才能执行这些功能。 光是就有几十个不同的子项目。

该项目为通过各种平台分发业务应用程序奠定了良好的基础。 一旦您的应用程序逻辑被封装到一个 Cloud Function POJO 中,它就可以找到一个在几十个不同角色中工作的家。

垂直.x

Vert.x 的创建者希望通过简化事件循环和优化与数据库的连接来创建一个非常快速的框架。 Vert.x 有一个像 Node.js 一样的单一事件循环,这允许它在事件到达时处理多个连接。 它还利用 Java 的线程模型在池中使用多个线程处理事件,如果可用,这些线程可以在多个内核上运行。

该结构还计划简化创建管道来处理事件流。 它借用了 promises 和 futures 等结构来避免带有分层回调的混乱代码。 当事件沿事件总线移动时,异步选项有助于生成干净、可读的代码,其中包含简单的方法调用链。

Vert.x 开发团队对他们的愿景并不教条。 他们常说 Vert.x 是一个工具包而不是一个框架。 该代码是模块化的,因此您可以挑选要使用的功能并组装适合您的应用程序的体系结构。 想要更多命令式结构而不是反应式结构的程序员可以找到对 Kotlin 协程的支持。

该项目是 Eclipse 生态系统的一部分。 各种版本和选项提供了大量的自由。 例如,Vert.x 应用程序生成器将生成 Java 或 Kotlin 代码,其中包含许多潜在的依赖项,例如模板引擎或 API 支持。

Eclipse MicroProfile

Eclipse 团队创建了 MicroProfile 项目,以此作为调整 Jakarta EE 以运行较小的微服务群的一种方式。 它去除了一些较大平台的开销,同时将许多微服务架构的标准库捆绑在一起。

对于可能要从较大、较旧的 Java EE 或 Jakarta EE 项目迁移代码的开发人员,该方法最具吸引力。 许多配置和体系结构保持不变。 在许多情况下,调整很小。 但该设计鼓励做出更简单的决策,以创建更轻量级、更快的代码。 一些开发人员使用 MicroProfile 作为通向更现代的云原生框架的垫脚石。

下拉精灵

一些开发人员对经过良好测试的旧模块有着天然的喜爱,他们会喜欢 Dropwizard。 Dropwizard的开发团队一直强调稳定、成熟这些词。 他们为 Hibernate 等数据库连接收集模块,并混合在表单和其他标准 Web 应用程序组件的框架中。 Dropwizard 还简化了依赖注入和运行时维护过程,例如配置和日志记录。

Dropwizard 是致力于修改和扩展现有应用程序的团队的最爱。 该结构与旧的、成熟的方法兼容,因为它是建立在它们之上的。

云平台的入门框架

有时,不需要复杂或精细的东西。 所有的云都维护基本示例,这些示例是开始编写简单函数的好地方。 它们主要用于支持非常简单的决策并帮助开发人员快速启动。

例如,Google Cloud Platform 的开发团队开源了他们在其函数即服务 (FaaS) 中运行的 Java 函数的基本框架。 使用它构建的代码旨在与 GCP 的标准触发器快速集成,尽管它也可以在任何本地计算机上成功运行。

微软还开源了它的 Java 框架。 该模型包括几个用于简化数据传输的例程,例如用于将 JSON 数据转换成 Java POJO 或从中转换出的库。 如果函数触发器为调用提供元数据,则框架会直接处理它。

这两个框架都可以让您通过编写具有单个功能的单个类来完成许多简单的工作。 更复杂的项目可能希望将这个基本工具与我描述的其他一些框架合并。 这些只是起点,但有时这就足够了。

阅读更多

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注