Spring Boot與Jakarta EE API實現對比

在本文中,我們來探討一下 Spring Boot 應用程式框架是否仍是最先進的java框架

在下文中,我想仔細探討一下Spring Boot在基於 Java 應用程式開發中相關問題。我將對它的架構概念進行批判性討論,並將其與Jakarta EE(原JavaEE)框架進行比較。我知道這個問題非常具有挑釁性,會引起很多同行的不理解。在比較這兩個框架中,更關注於執行時環境的問題。

Spring Boot 和 Jakarta EE 都是用於開發微服務精心設計的概念。當我們談論 Jakarta EE 和微服務時,總是談論Eclipse Microprofile,它是當今 Jakarta EE 的標準擴充套件。Spring Boot 和 Jakarta EE 的概念非常相似。是因為 Jakarta EE 很多技術都受到了 Spring 和 Spring Boot 的啟發。“約定優於配置”、CDI或註解的密集使用等概念最早是由 Spring 提出來的。這證明了 Spring 和 Spring Boot 的創新能力。

API 與實現

如果您在

Jakarta EE

上實現微服務,那麼您是針對 API 而不是具體的實現來實現的。當您檢視 Maven 專案的 pom。xml 時,這一方面變得顯而易見。

。。。。 jakarta。platform jakarta。jakartaee-api ${jakarta。version} provided org。eclipse。microprofile microprofile ${microprofile。version} pom provided 。。。。。 。。。。。

關鍵依賴項標記為“ provided”。這意味著您希望實現是您的執行時的一部分,而不是與您的元件捆綁在一起。

因此,您的元件比Spring Boot

元件小得多。要執行您的應用程式,您需要將其部署到

Jakarta EE

執行時環境中。

另一方面,Spring Boot構建了一個包含所有必要庫的可引導元件,併為您提供了可引導伺服器。

不需要額外的執行時或應用程式伺服器。這使得

Spring Boot對開發人員如此有吸引力,並且是Spring Boot成功的最重要概念。但是這個概念是在 7 年多以前引入的。

那個時候安裝應用伺服器很痛苦——尤其是對開發人員來說。使用 Spring Boot,開發人員只需幾個簡單的步驟即可設定簡單微服務的執行版本。

容器環境

今天我們已經確立了容器環境的概念。每個開發人員都可以使用一個簡單的 Docker 命令啟動任何型別的伺服器或執行時環境。在容器環境中啟動像Payara、Wildfly或OpenLiberty這樣的現代應用程式伺服器只需幾秒鐘,而部署微服務只需幾秒鐘。例如,要將您的微服務與最新的 Wildfly Docker 映像捆綁在一起,Dockerfile 如下所示:

FROM jboss/wildflyADD my-app。war /opt/jboss/wildfly/standalone/deployments/

要啟動您的服務,您只需執行:

$ docker build ——tag=my-app 。 && docker run -it my-app

這平衡了

Spring Boot

的初始優勢。

除了Jakarta EE

元件要小得多這一事實外,您還可以在幾秒鐘內將微服務部署到不同的環境中。這為您的執行環境提供了更大的靈活性。但這不是唯一的優勢。

擺脫依賴

使用Jakarta EE

更有趣的方面是您沒有對某些庫的硬編碼依賴。再次檢視

Spring Boot

專案的 pom。xml,您會發現很多依賴項與您的專案捆綁在一起。

org。springframework。boot spring-boot-starter-web 2。4。0 org。springframework。boot spring-boot-starter-data-jpa 2。4。0 com。h2database h2 2。4。0。。。。

JPA 實現了 Jax-RS 實現等所有庫都將成為您最終構建的一部分。相比之下,在

Jakarta EE

專案中,您不知道目標執行時將使用哪個 JPA 或 Jax-RS 實現。這意味著您的應用程式也更具互操作性。當開發人員開始使用具體實現的某些特性時,這一點變得更加明顯。

Spring Boot 開發人員經常使用諸如 Rest API Jersey之類的 API 的特定功能來解決問題。但此時您的應用程式不再與其他 Jax-RS 實現相容,例如

Rest Easy

。這是一個很大的威脅。針對 API 而不是具體實現進行開發是一種很好的做法。

日誌4j

捆綁庫的危險性最近在 Log4j 錯誤中變得清晰起來。一個簡單而典型的 Spring Boot 依賴項,如下所示:

org。springframework。boot spring-boot-starter-log4j2

… 可能導致您的最終應用程式出現安全漏洞。由於 Log4j 庫現在是您構建的一部分。要更新此依賴項,您需要更新程式碼並重建和推出

Spring Boot

應用程式。

相比之下,在

Jakarta EE

中,您永遠不會針對特定實現構建程式碼,而只會針對介面構建程式碼。這意味著您的程式碼以及最終的元件永遠不會對特定實現有硬編碼依賴。在具體示例中,您只需更改執行時環境,無需更新或重建程式碼。這意味著對於像 Kubernetes 這樣的容器環境,您只需更新映像版本並重新啟動容器。

結論

我想再次澄清一下,我不是在談論這兩個應用程式框架的 API。Spring Boot和Jakarta EE都提供了類似的功能範圍,可以快速輕鬆地開發微服務。

然而,Spring Boot構建可啟動伺服器的原有優勢在容器環境時代似乎越來越成為劣勢。失去了靈活性,並冒著變得非常依賴庫的風險,您作為開發人員無法監督其影響。

相比之下,當今應用程式伺服器提供了容器技術的使用,使您能夠在開發過程中使用類似生產的伺服器系統。從這個角度來看,在我看來,今天圍繞你的微服務構建一個可啟動的伺服器已經沒有意義了。