适用于云原生世界的8个Java框架

适用于云原生世界的8个Java框架

这些更轻量级的Java框架将云原生的灵活性与Java久经考验的工程相结合,因此您可以编写易于在任何地方部署的响应式代码

Java编程语言已经进入了它的第三个十年,这种语言和它的字节码已经在从嵌入式芯片到大规模服务器群的所有东西中找到了家。Java将坚如磐石的虚拟机和大量的库结合在一起,为编写到处运行的代码提供了肥沃的生态系统。

然而,Java一直在努力的一个领域是服务器的世界,它经常必须处理来自成千上万甚至数百万用户的连接。在早期,Java工具是创建服务器端应用的最佳工具之一,这些应用为所有用户执行业务逻辑。像J2EE、Hibernate、Spring这样的Java框架以及基本的Java servlets模型使得创建强大的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框架被设计为支持可以独立安装和重启的微服务的星座。它们通常在DockerPodman等容器中发货,以实现最快的构建和安装。

寻求云原生体验的现代Java开发者有一系列的选择。一个理想的云原生Java框架可以利用在Java平台及其第三方库中投入的深厚经验,同时使它们在云中运行得更快、更轻。以下是为云原生开发和部署而建立的八个Java框架。

Micronaut

Micronaut的创造者们希望吸取Spring和Grails等经典Java框架的精华部分--例如灵活的配置和依赖注入--但要剥离沉重的内存占用和缓慢的启动,这使得它们在开发微服务时不那么理想。他们精心设计了注解,为依赖注入提供了足够的信息,而没有老框架中使用的充满内存的反射。在编译时完成更多Micronaut的配置意味着代码运行更快、更轻。

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

Micronaut的开发者还希望该框架能够支持良好的开发团队合作。项目中捆绑了一个HttpClient的实现,以简化单元测试的编写,而无需离开Micronaut或增加更多的工作。这些测试通常比动态框架所需的测试更简单、更全面。这也要归功于在编译时完成的工作。

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

Quarkus

想使用被充分理解的指令性和反应性代码组合的开发者可以求助于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和其他一些选项所接受的函数。

Spring云函数

Java开发者对Spring框架非常熟悉,因为它在大约20年的时间里一直是许多项目的基础。Spring的开发者决定创建一个新的版本,它更适合于云端部署,以及其他一些角色。Spring云函数中的函数是为了方便重新部署到各种任务中,如Web服务、流处理或后台工作。

Spring云函数框架延续了Spring所开创的许多相同的哲学传统。这个框架中的云函数支持反应式或命令式风格,以及两者的混合体。

支持多种多样的选择是这个项目的一个大目标。有一些适配器可以将这些函数插入AWS Lambda微软AzureApache OpenWhisk谷歌云平台和其他一些常见的云函数环境。还有针对主要流媒体框架的适配器,如Apache KafkaSolaceRabbitMQ,以及独立的Spring Cloud Stream选项。打包和部署是高度自动化的,因此你可以集中精力开发函数本身。

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

该项目是通过各种平台分发商业应用的一个非常好的基础。一旦你的应用逻辑被封装成云功能POJO,它就可以在几十个不同的角色中找到工作的家。

Vert.x

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

该结构也被计划用来简化创建处理事件流的管道。它借用了承诺和期货等结构,以避免分层回调的混乱代码。异步选项有助于产生干净、可读的代码,在事件沿着事件总线移动时,充满了简单的方法调用链。

Vert.x开发团队对他们的愿景并不固执。他们经常说,Vert.x是一个工具包,而不是一个框架。代码是模块化的,所以你可以选择使用哪些功能,并组装一个适合你的应用程序的架构。那些想要更多的命令式结构而不是反应式结构的程序员可以找到对Kotlin的coroutines的支持。

这个项目是Eclipse生态系统的一部分。各种版本和选项提供了大量的自由。例如,Vert.x应用程序生成器将产生Java或Kotlin代码,并有几十个潜在的依赖项,如模板引擎或API支持。

Eclipse MicroProfile

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

这种方法对那些可能从较大的、较早的Java EE或Jakarta EE项目中迁移代码的开发者最有吸引力。大部分的配置和架构都保持不变。在许多情况下,调整是很小的。但这种设计鼓励了那种使创建更轻量级、更快速的代码变得更简单的决定。一些开发者将MicroProfile作为通往更现代的云原生框架的踏脚石。

Dropwizard

一些开发者对旧的、经过测试的模块有天然的好感,他们会喜欢Dropwizard。Dropwizard的开发团队一直强调稳定成熟这样的字眼。他们收集了像Hibernate这样的数据库连接的模块,并混入了表单和其他标准的Web应用组件的框架。Dropwizard还简化了依赖性注入和运行时的维护过程,如配置和日志。

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

云平台的入门框架

有时,不需要复杂或精心设计的东西。所有的云都保持着基本的例子,是开始编写简单功能的好地方。它们主要是为了支持非常简单的决策,帮助开发者快速启动。

作为一个例子,谷歌云平台的开发团队开源了他们的基本框架,用于在其功能即服务(FaaS)中运行的Java函数。使用它构建的代码是为了与GCP的标准触发器快速集成,尽管它也可以在任何本地机器上成功运行。

微软也为Java开源了它的框架。该模型包括几个用于简化数据传输的例程,如一个用于将JSON数据翻译成Java POJO和输出的库。如果函数触发器在调用时提供了元数据,框架就会直接处理它。

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

猜你喜欢

转载自juejin.im/post/7126947246456700936