对于Java来说,这是一段漫长的旅程。这种语言最初是在电视机没有内置Roku或Chromecast的日子里出现在电视机顶盒上的通用语言。 然后,Java将通过在JavaScript出现之前将浏览器动画化并将其弯折,从而拥有万维网的所有权。

Java最终在服务器场中找到一席之地,那里曾经有足够多的不同芯片体系结构和操作系统,以使“写一次在任何地方运行都可承诺”令人信服。 在这些服务器场中,Java赖以生存,这是企业IT商店所钟爱的,它们对可靠性沉迷,并且开发人员热爱打字。

[ 15个Java框架使开发人员受益匪浅 。 • 哪些工具支持Java的新模块化功能 。 | 通过InfoWorld的App Dev Report新闻通讯了解编程方面的热门话题。 ]

同时,一般JavaScript尤其是Node.js都以其高吞吐量和无线程速度来挑战服务器上的Java,以接管网络上的大量流量。 Node通过提供速度和资源效率以及在客户端和服务器上运行的代码的简单性,吸引了最新服务器端程序员的想象力。

尽管竞争日益激烈,Java不仅继续生存,而且继续保持卓越。 许多负责开发微服务架构的团队正在继续使用Java。 一个主要的原因必须是因为该技术在解析HTTP请求的第一线已经经过了多年的测试。 Sun创建了坚如磐石的虚拟机,而Oracle继续培育和支持它。

另一个原因必须是语言的持续发展。 Java 8为诸如Scala和Kotlin之类的功能语言提供了坚实的支持。 JVM现在是计算机语言开发中许多最佳实验的基础。 数十种新语言可以编译为Java字节码并相互链接,以使复杂的项目协同工作。 在JVM上顺利运行的许多堆栈可能是Java和许多其他语言的混合构建的。

不过,最大的原因必须是纯粹的惯性。 在我撰写本文时,Dice上列出了371个COBOL程序员的工作。 其中包含Java字样的工作很多。 精明的团队正在查看大量老化的Java代码,并认为最简单的解决方案只是添加一个将数据作为JSON数据结构吐出来的侧门,是否会感到惊讶? Voilà。 旧的代码一直在运行,但在这些侧门上却像现代微服务一样工作。

所有这些选择以及所有其他选择,确保了Java在微服务革命中继续发挥强大而至关重要的作用。 Java开源社区也随之而来,为需要教Java语言像微服务一样讲课的Java程序员提供了许多新选择,这也就不足为奇了。

这是Java开发人员用来提供解决方案的13个开源选项的列表,这些解决方案构成了各地微服务架构的基础。

Spring靴

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程序员为何多年来一直加入潮流。

Eclipse MicroProfile

2016年,Java Enterprise社区的一些支持者环顾四周,决定清除Java Enterprise Edition中的所有残骸,以便人们可以使用经典部分构建简单的微服务。 他们扔出了数量惊人的库,但保留了用于处理REST请求,解析JSON和管理依赖项注入的代码。 他们最终被称为Eclipse MicroProfile的过程既快速又简单。

从那时起,MicroProfile社区制定了一项协议,规定每季度发布一次新版本,同时添加新代码以保持微服务平稳,安全地运行。 居住在Java EE世界中的任何人都将非常熟悉开发过程和代码结构,但是无尽的配置麻烦已被消除。 证明您可以教老狗新的花样。

Dropwizard

当Dropwizard于2011年出现时,它使Java Enterprise开发人员对真正需要的代码少了很多。 Dropwizard框架为您提供了许多非常重要的决策,为开发提供了一个非常简单的模型,并且它继续遵循此道路。 您添加了一些业务逻辑,然后按照约定为您配置了几乎所有其他内容。 结果是纤薄的JAR文件,用户称赞它们快速启动。

最大的限制可能是缺少依赖项注入。 如果要使用依赖注入来保持代码整洁和松散耦合,则需要自己添加库。 与Spring世界不同,没有Dropwizard可以做到这一点。 不过,现在还支持其他大多数奢侈品,包括日志记录,运行状况检查和提供恢复力的代码。 您无需做出太多牺牲。

野生苍蝇

Red Hat的人们用一个漂亮的配置工具构建了自己的MicroProfile版本。 该框架最初被称为WildFly Swarm,但随后被重命名为Thorntail 。 Thorntail网站仅通过指定所需的功能即可帮助您创建自己的Maven构建文件。 然后,Maven会负责组装所有东西。 Thorntail还将通过扫描代码来检测您需要的主要组件,但是您可以使用BOM(物料清单)文件覆盖它。 当它们全部运行时,Thorntail将去除Java Enterprise Edition中将不使用的部分,并创建一个较小的JAR文件,并准备使用一个命令进行部署-一种精巧的功能,允许Thorntail项目将其称为Uber。 -罐。 这是遵循Java Enterprise Edition传统而又不负担所有沉重负担的另一种方法。

海利顿

自新闻发布和首次提交GitHub存储库以来, Helidon才问世了几个月,但是该框架已经吸引了Oracle保证的那种关注。 尽管Java领域非常庞大,但其中很多仍然围绕着Oracle展开。

Helidon的建筑师遵循了与其他项目相同的许多主题。 摆脱Java Enterprise Edition的束缚,保留已赢得世界信任的基于Servlet的轻量级内核。 在Helidon的情况下,开发人员从Netty开始,仅添加了足够的代码来进行一些路由和错误处理。 为了使事情变得有趣,他们采用了两种基本的代码模型,即SE和MP版本。

对于使用句点连接的一长串函数调用的Node.js程序员,Helidon SE看起来非常熟悉。 使用JAX-RS的Java程序员对Helidon MP会更加熟悉。 还有一些有用且广为人知的工具,用于检查服务器的运行状况或通过微服务林跟踪数据流。 即使在没有Oracle支持的情况下,这些也是探索潜力的令人信服的理由。

蟋蟀

Cricket是另一个用于快速API开发的框架。 尽管板球包括一些其他功能(例如键值数据存储),但是板球很小,可以避免连接数据库和调度程序来控制重复的后台处理。 没有其他依赖项会增加复杂性或锁定,因此将代码添加到Cricket并启动独立的微服务非常容易。

泽西岛

开发Web服务的标准方法之一是RESTful Web服务的Java API(又名JAX-RS),这是已在Jersey框架中实现的常规规范。 该方法在很大程度上取决于使用注释来指定路径映射和返回详细信息。 从参数解析和JSON打包到其他所有内容,都由Jersey处理。

Jersey的主要优点是它实现了JAX-RS标准,这一功能足以使某些开发人员将Jersey和Spring Boot结合在一起使用。

体验JVM的跨语言功能的最佳方法之一是使用Play框架, Play框架是一堆Scala代码,可与Java或任何其他JVM语言链接在一起。 该基础非常现代,具有异步,无状态的模型,该模型不会通过试图跟踪用户及其会话数据的无数线程使服务器超载。 还有许多其他功能可用于充实网站,例如OpenID,验证和文件上传支持。

Play代码库已经发展了十多年,因此您还会发现诸如XML支持之类的被人们遗忘已久的回声。 游戏既成熟又柔和,这在野外很少见。

昂首阔步

构建API看起来就像编写一些在端口上侦听并提供答案的代码一样简单,但是Swagger的开发人员却希望有所不同。 他们已经创建了一种称为OpenAPI的完整API规范语言,您可以使用该语言来阐明API的功能。 这似乎是一个额外的步骤,但是Swagger团队还提供了将本规范转换为自动化测试,文档等的代码。 Swagger配置文件中对API的简单,几乎是斯巴达式的描述被旋入Java代码中,以实现该接口,记录其行为并提供一组工具来测试在其下构建的代码。 甚至还有一种API治理机制,因此您可以与未洗的群众一起工作,他们很快就会敲开API的大门并期待得到答案。

Swagger是API的生态系统,它不仅限于Java。 如果您的团队使用Node.js或其他数十种语言中的任何一种,那么都有一个Swagger Codegen模块正在等待将您的OpenAPI规范转换为该语言的实现。

Restlet

各种框架之间最大的差异之一是与其他服务和库的连接数。 Restlet项目提供了功能和连接的较大集合之一。 它已经与JavaMail之类的库集成在一起,以防您的微服务需要对某些邮件服务器说POP,IMAP或SMTP,以及Lucene / Solr,以防您想为大块文本和环绕的元数据建立可搜索的索引它。

Restlet中的可能性一直存在,因为此堆栈通常为每个零件支持几个不同的选项。 例如,您不需要使用JSON,因为该代码将处理XML,CSV,YAML和其他几种文件格式。 您还可以使用模板的几种不同选项来构建响应。 Restlet客户端是最整洁的附加功能之一,它使您可以从Chrome浏览器中测试API。

壁球

调试微服务通常是一个真正的挑战,因为各部分之间的耦合是如此松散,并且很难跟踪整个系统所有层的数据流。 使用Squash ,您可以在Kubernetes集群上运行的代码中设置断点,然后将所有数据重新接收到IDE中,就像在本地运行的代码一样。 如果您的微服务集合不是仅Java的,Squash还与Node.js和Python运行时集成。

网真

调试的另一种方法是使用网真为遥远的Kubernetes集群上的微服务创建本地代理。 您对该服务的呼叫将转移到本地版本,您可以在此处设置断点或在本地计算机上执行任何您可以想象的事情。

齐普金

Zipkin是一种机制,用于在各种微服务上记录事件,然后将事件关联起来,以便当问题在整个计算机集合中波动时,可以将其隔离和研究。 Java和其他至少六种语言都有一个Zipkin实现,因此可以解决多语言系统的问题。 一些最复杂的框架(例如Spring)已经以某种形式集成了Zipkin。