在这篇文章中,我将进一步探讨应用框架Spring Boot在现代基于Java的应用开发中是否仍然适用。
在下面的博客文章中,我想更仔细地看看应用程序框架是否Spring Boot仍然与现代基于Java的应用程序开发相关。我将对它的架构概念进行批判性的审视,并将其与雅加达EE框架。我知道这个问题是多么具有挑衅性,也知道它会引起不理解。比较这两个框架,我不太关心开发概念,而是更关心运行时环境的问题。
Spring Boot和Jakarta EE都是用于开发现代微服务的强大且设计良好的概念。当我谈到Jakarta EE和微服务时,我总是会谈到Eclipse微文件这是今天Jakarta EE事实上的标准扩展。开发微服务Spring Boot和Jakarta EE的概念非常相似。原因是,今天Jakarta EE的很多技术都是受Spring和Spring Boot的启发。“的概念约定胜于配置“, CDI,或…的强化用法附注第一次被春天邀请。这证明了春天和Spring Boot的创新力量。但是我相信雅加达EE是当今寻找微服务框架的更好选择。为什么我会得出这个结论?
API与实现
如果您在上实施微服务雅加达EE您正在实现一个API而不是一个具体的实现。当您查看Maven项目的pom.xml时,这一点变得很明显。
....
<dependencies>
<dependency>
<groupId>jakarta.platform</groupId>
<artifactId>jakarta.jakartaee-api</artifactId>
<version>${jakarta.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.eclipse.microprofile</groupId>
<artifactId>microprofile</artifactId>
<version>${microprofile.version}</version>
<type>pom</type>
<scope>provided</scope>
</dependency>
.....
</dependencies>
.....
关键依赖项标记为'provided
。这意味着您希望实现是您的运行时的一部分,而不是与您的工件捆绑在一起。因此,您的工件比Spring Boot神器。要运行您的应用程序,您需要将其部署到雅加达EE运行时环境。
Spring Boot另一边构建一个包含所有必需库的可引导工件,并为您提供一个可引导服务器。不需要额外的运行时或应用服务器。这使得Spring Boot对开发人员如此有吸引力,是成功的最重要的概念Spring Boot。但这个概念是7年多前提出的。
曾经有一段时间,安装应用服务器是一件痛苦的事情——尤其是对开发人员来说。借助Spring Boot,开发人员只需几个简单的步骤就能建立一个简单微服务的运行版本。
集装箱环境
今天,我们已经建立了容器环境的概念。每个开发人员都可以用一个简单的Docker命令启动任何类型的服务器或运行时环境。启动现代应用服务器,如帕亚拉, 野花,或者开放自由在容器环境中只需几秒钟,部署微服务只需几秒钟。例如,要将您的微服务与最新的Wildfly Docker映像捆绑在一起,Docker文件如下所示:
FROM jboss/wildfly
ADD my-app.war /opt/jboss/wildfly/standalone/deployments/
要启动你的服务,您只需要运行
$ docker build --tag=my-app . && docker run -it my-app
这就平衡了最初的优势Spring Boot。除了一个事实雅加达EEartefact要小得多,您可以在几秒钟内将您的微服务部署到不同的环境中。这为您的运行时环境提供了更多的灵活性。但这不是唯一的优势。
摆脱依赖
使用的更有趣的方面是雅加达EE事实上,您没有对某些库的硬编码依赖。再次查看Spring Boot项目,您会发现许多依赖项与您的项目捆绑在一起。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.4.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>2.4.0</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>2.4.0</version>
</dependency>
....
所有像JPA实现或Jax-RS实现这样的库都将成为您最终构建的一部分。相反,在雅加达EE项目中,您不知道目标运行时将使用哪个JPA或Jax-RS实现。这意味着您的应用程序也更具互操作性。当开发人员开始使用具体实现的某些特性时,这一点变得更加明显。
Spring Boot开发人员经常使用像Rest API这样的API的特定函数泽西岛解决问题。但是此时,您的应用程序不再与其他Jax-RS实现兼容,例如高枕无忧。这是一个很大的威胁。针对API而不是具体的实现进行开发是一个很好的实践。
Log4j
最近Log4j bug清楚地表明了捆绑库有多危险。一个简单而典型的Spring Boot依赖关系如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
…可能会导致您的最终应用程序出现安全漏洞。因为Log4j库现在是您的构建的一部分。要更新这种依赖性,您需要更新您的代码,并重新构建和推出您的Spring Boot应用程序。
相比之下,在雅加达EE您永远不会针对特定的实现来构建代码,而只会针对接口。这意味着您的代码以及最终的工件永远不会对特定的实现有硬编码的依赖。在具体的例子中,您只需更改运行时环境,而不需要更新或重建代码。这意味着对于像Kubernetes这样的容器环境,您只需更新映像版本并重启容器。
结论
我想再一次说明,我说的不是两个应用框架的API。两者都有,Spring Boot和雅加达EE提供类似范围的功能,以快速简单的方式开发现代微服务。
然而,原来的优势Spring Boot在当今的容器环境中,构建可引导服务器似乎越来越不利。您失去了灵活性,并冒着变得非常依赖库的风险,作为开发人员,您无法监督库的效果。
相比之下,今天的现代应用服务器提供了容器技术的使用,并使您能够在开发过程中在类似生产的服务器系统上工作。从这个角度来说,在我看来,今天围绕你的微服务构建一个可启动的服务器已经没有意义了。