Java 构建 Spring 应用程序已经有很长一段时间了,Spring Boot 是 Spring 的一个特定版本,它通过对配置细节的处理,使微服务构建更加简便。创建 Spring Boot 旨在自启动任何类型的 Spring 项目,而不仅仅是微服务。应用程序完成后,Spring Boot 将在 web 服务器中混合,并输出一个 JAR 文件,JVM 除外。你可以将其视为原始 Docker 容器。这也是许多负责构建微服务的开发者都非常喜欢 Spring Boot 的原因。
使用 Spring 开发微服务遵循与 Web 应用相同的 MVC 理念。该框架享有多年 Java 开发中建立的所有深度连接,包括所有主要和次要数据存储、LDAP 服务器和 Apache Kafka 等消息传递工具的集成。还有许多用于维护运行服务器集合的小特性,比如 Spring Vault,这是一种用于维护生产环境中服务器所需的密码的工具。所有这些优点都说明了为什么 Java 程序员多年来一直喜欢 Spring Boot 的原因。
2016 年,Java Enterprise 社区决定清理 Java Enterprise Edition 中的内容,以便人们可以使用经典部件构建简单的微服务。他们去除了大量的库,但保留了处理 REST 请求,解析 JSON 和管理依赖注入的功能代码,最终被称为 Eclipse MicroProfile,其特性为快速而简单。
从那以后,MicroProfile 社区制定了一个协议,每季度发布一个新版本,同时添加新代码以保持微服务平稳安全地运行。任何 Java EE 开发者都会非常熟悉开发过程和代码结构,而且还吧配置麻烦给省去了。
当 Dropwizard 在 2011 年出现时,Dropwizard 框架为开发者提供了一个非常简单的模型,里面包含了许多重要的模块,你可以根据需求添加一些业务逻辑,或者配置其他内容,最后你会发现 JAR 文件非常小,并且能够快速启动。
Dropwizard 最大的限制可能是缺乏依赖注入。如果你希望使用依赖项注入来保持代码的整洁和松散耦合,则需要自己添加库,这点和 Spring 不同,但是现在 Dropwizard 也支持大多数功能,包括日志记录、健康检查和提供弹性代码。
Red Hat 的工作人员使用一个灵活的配置工具构建了他们自己的 MicroProfile 版本。该框架最初被称为 WildFly Swarm,但后来被重新命名为 WildFly Thorntail,Thorntail 通过指定所需的特性来帮助您创建自己的 Maven 构建文件,然后 Maven 负责组装所有东西。
Thorntail 还将通过扫描代码来检测组件,也可以使用 BOM(材料清单) 文件覆盖。当它全部运行时,Thorntail 将删除 Java Enterprise Edition 中不使用的部分,并创建一个很小的 JAR 文件,可以使用一个命令进行部署——这是一个非常巧妙的特性,允许 Thorntail 项目将其称为 Uber-JAR。这是遵循 Java Enterprise Edition 的另一种传统方法,它不会保留所有沉重的负担。
Helidon 去除了 Java Enterprise Edition,保留轻量级的、基于 servlet 的核心,并吸引了大量的粉丝。在 Helidon 的,开发人员从 Netty,并添加代码进行路由和错误处理。它采用了代码的两个基本模型,即所谓的 SE 和 MP 版本。
Node 开发者可能更熟悉 Helidon SE,因为其具有由句点连接的函数调用。使用 JAX-RS 的 Java 程序员则更熟悉 Helidon MP。此外,Helidon 还集成了一些备受好评的工具,这些都是它能够吸引大量开发者的原因。
另外一个用于快速 API 开发框架的是 Cricket。Cricket 很小,尽管它包括许多额外的功能,如键值数据存储,以避免连接数据库和调度程序来控制后台重复处理。没有添加复杂性或其他依赖项,因此很容易将代码添加到 Cricket 并启动独立的微服务。
开发 web 服务的标准方法之一是 RESTful web 服务的 Java API(又名 JAX-RS),这是 Jersey 框架中实现的通用规范。这种方法主要依赖于使用注释来指定路径映射和返回细节。从参数解析到 JSON 打包的所有其他内容都由 Jersey 处理。
Jersey 的主要优点是它实现了 JAX-RS 标准,这个特性非常受欢迎,一些开发人员习惯将 Jersey 与 Spring Boot 结合在一起使用。
体验 JVM 跨语言能力的最佳方式之一是使用 Play 框架,这是可以与 Java 或任何其他 JVM 语言兼容的。它的基础非常现代,具有异步、无状态的模型,不会让试图跟踪用户及其会话数据的线程使服务器过载。还有许多额外的特性可以用来充实网站,比如 OpenID、验证和文件上传支持。
Play 代码库已经发展了十多年,因此你还会发现类似于对 XML 的支持的这种古老的功能。play 既成熟又轻盈,这种组合还是比较有特色的。
构建一个 API 看起来就像编写一个监听端口的代码一样简单,但是 Swagger 的开发人员不这么认为。他们已经创建了一个完整的 API 规范语言 OpenAPI,你可以使用它来说明你的 API。这似乎是一个额外的步骤,但是 Swagger 团队还提供了将该规范转换为自动化测试、文档等的代码。
Swagger 配置文件中的 API 很简单,用于实现接口、记录接口的,并提供一组工具来测试构建在其下的代码,甚至还有一种 API 治理机制。
Swagger 是一个 api 生态系统,它不局限于 Java。如果你的团队迁移到 Node.js 或其他几十种语言中的任何一种,都有一个 Swagger Codegen 模块将 OpenAPI 规范转换成该语言的实现。
不同框架之间最大的区别之一是和其他服务或库的连接数量。Restlet 项目提供了更大的特性和连接集合,它已经与 JavaMail 之类的库集成,避免微服务需要对某些邮件服务器使用 POP、IMAP 或 SMTP;为防构建大量文本索引和元数据,还集成了 Lucene 和 Solr。
Restlet 中还有很多特性在持续开发。例如,你不需要使用 JSON,因为它可以直接处理 XML、CSV、YAML 和其他一些文件格式,此外,它还允许用户从 Chrome 浏览器测试 api。