Java EE—最輕量級的企業框架?

来源:https://www.cnblogs.com/liululee/archive/2019/09/13/11517579.html
-Advertisement-
Play Games

_確保高效發展進程的建議_ 很久以前,J2EE,特別是應用程式伺服器被認為過於臃腫和“重量級”。對於開發人員來說,使用此技術開發應用程式會非常繁瑣且令人沮喪。但是,由於 J2EE 框架的名稱已更改為Java EE,因此該假設不再適用。 Java EE 與其他企業框架相比區別在哪以及框架 輕量級 的標 ...


確保高效發展進程的建議

很久以前,J2EE,特別是應用程式伺服器被認為過於臃腫和“重量級”。對於開發人員來說,使用此技術開發應用程式會非常繁瑣且令人沮喪。但是,由於 J2EE 框架的名稱已更改為Java EE,因此該假設不再適用。 Java EE 與其他企業框架相比區別在哪以及框架輕量級的標準是什麼?

在選擇技術時,需要考慮的最重要方面之一是開發人員在開發過程中的生產力。工程師應該花費儘可能多的時間來實現用例和創收功能,因為這將使公司朝著目標前進。

所選擇的技術和方法應該最大限度地縮短開發人員的時間。具體哪些時間呢:等待構建,測試和部署; 配置應用; 實施與業務用例無關的管道; 並配置構建環境和外部依賴項。 但是大多數可用技術都沒有這樣做。

1.為什麼標準?

與其他框架相比,Java EE 的最大優勢之一是使用的API的標準化。標準聽起來可能很無聊而且不夠創新 - 從本質上講,這是真的,因為Java規範請求(JSR)已經成為行業內過去已經過充分證明的結果。 但使用這些標準有幾個優點。

2.整合規範

Java EE中的特定API - 例如上下文和依賴註入(CDI),JAX-RS,JSON 處理(JSR 353)和 Bean驗證 - 可以很好地協同工作,並且可以無縫地相互組合。 最重要的是,CDI 被用作應用程式組件之間的“粘合劑”。 該規範包含諸如“如果容器支持規範 A 和 B,那麼 A 必須與 B 無縫集成並良好地工作。”

例如,JAX-RS 支持 JSONP 類型,例如JsonObject用作請求或響應實體,它支持調用Bean 校驗功能 - 如果驗證失敗,則包括正確的HTTP狀態代碼(參見清單1)。

@Path("duke") 
public class DukeResource {           
    @GET          
    public JsonObject getDuke() {                   
        return Json.createObjectBuilder().add("name", "Duke").build();         
    }     
    @POST         
    public void create(@Valid @NotPlayedYet Game game) {    
                // game object has been validated at this point         
    }
}

清單1. JAX-RS的JSONP和Bean Validation集成

使用 JSONP 類型意味著內容類型將是 application / json,並且如果驗證失敗,將發送HTTP狀態代碼 400 Bad Request。 這無需編寫任何配置代碼就能使一切都完成。

另一個例子是 CDI 使開發人員能夠通過 @Inject 將任何 bean 和用戶定義的對象註入 Java EE托管組件。 請參閱清單2,瞭解一個 bean 驗證 Validator,它直接使用另一個 CDI 托管bean。

public class GameNotPlayedValidator implements ConstraintValidator<NotPlayedYet, Game> {          
    @Inject          
    GameHistory history;          
    public void initialize(NotPlayedYet constraint) {                 
        // no initialization needed         
    }      

    public boolean isValid(Game game, ConstraintValidatorContext context) {                   
        return !history.exists(game);        
    }
}

清單2. bean 驗證的 CDI 集成

集成是規範的一個主要方面,可以提供直接的開發人員體驗。開發人員可以依賴應用程式伺服器進行集成和配置工作,從而可以專註於應用程式的業務邏輯。

3.按配置約定驅動開發

由於 Java EE 的配置約定驅動方法,大多數實際應用程式不需要大量配置。 繁瑣的 XML 描述符的日子結束了。 對於簡單的 Java EE 應用程式,您不需要單個 XML 文件。

由於聲明性註釋,一個簡單的帶註釋的普通舊 Java 對象(POJO)處理 HTTP 請求(@Path),或分別作為 Enterprise JavaBeans(EJB)bean(@ Stateless) - 包括事務,監視或攔截器。過去,這些方法已在各種框架中得到很好的證明,並已在 Java EE 中進行了標準化。

如果需要,XML 描述符仍可用於部署時配置,但是配置約定有助於最大限度地提高開發人員的工作效率。

4.外部依賴

少數實際企業項目在部署工件中沒有任何額外依賴項的情況下工作。 但這些依賴關係的理由主要是由技術驅動 - 例如包括日誌記錄或實體映射框架或 Apache Commons 或 Google Guava 等常用庫 - 而不是用例。

Java EE 7 - 尤其是與 Java 8 一起使用時 - 具有足夠的功能來覆蓋大多數用例而沒有任何其他依賴性。開箱即用的內容大部分都可以用最少量的代碼來實現,例如,通過 CDI 提供商的可註入配置,通過攔截器的斷路器(查看 Adam Bien 的開源庫),或通過複雜的收集操作 Java 8 lambda 表達式和流。

當然,你可以爭辯說不要在這裡重新發明輪子。 但實際上,為了節省一些自編寫的代碼行,將兆位元組的外部依賴項包含在部署工件中並沒有多大意義。

經驗表明,最大的問題不是直接引入的依賴,而是傳遞的依賴。傳遞的依賴經常與應用程式伺服器上已有的庫版本衝突,並導致具有挑戰性的衝突。在一天的工作時間內,開發人員要花費更多時間來管理這些衝突,而不是聚焦在將小功能實現到項目中所需的時間。這主要適用於具有技術驅動而非用例驅動的依賴關係的情況。

有關簡單的 Java EE 7 項目Maven項目對象模型(POM)的文件啟發,請參閱清單 3,該文檔受Adam Bien的啟發 Java EE 7 Essentials Archetype.

<project xmlns="http://maven.apache.org/POM/4.0.0"         
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">     
 <modelVersion>4.0.0</modelVersion>     
 <groupId>com.sebastian-daschner</groupId>     
 <artifactId>game-of-duke</artifactId>     
 <version>1.0-SNAPSHOT</version>     
 <packaging>war</packaging>      

 <dependencies>         
     <dependency>             
          <groupId>javax</groupId>             
          <artifactId>javaee-api</artifactId>             
          <version>7.0</version>             
          <scope>provided</scope>         
     </dependency>     
 </dependencies>      

 <build>         
     <finalName>game-of-duke</finalName>     
 </build>      

 <properties>         
     <maven.compiler.source>1.8</maven.compiler.source>         
     <maven.compiler.target>1.8</maven.compiler.target>         
     <failOnMissingWebXml>false</failOnMissingWebXml>         
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>     
     </properties> 
</project>

清單3. Java EE 7 Maven POM 文件

當然,有時應用程式確實需要集成對於實現軟體目標至關重要的庫。但是,這些依賴關係需要通過業務需求來證明。一般來說,它很有意義,可以節省時間和精力來最小化外部生產庫。

對於測試依賴關係,這是一個不同的故事,因為庫,例如JUnit,Mockito或者在某些情況下,Arquillian - 是至關重要的。 但同樣,關註測試依賴項列表也是有意義的。

5.精簡部署 Artifacts

由於應用程式伺服器知道Java EE API,因此該API不必包含在部署 artifact 中。 只包含業務邏輯 - 只需最少的膠水代碼和交叉關註點。

因此,這些千位元組大小的工件可以使構建時間非常短,因為構建過程不需要複製很多東西。這可以在每個構建上產生幾秒鐘的差異。 如果總結開發人員和持續集成(CI)伺服器所花費的所有額外時間,那就會產生很大的不同。項目建設的頻率越高 - 對於持續交付(CD)情景尤其如此 - 影響越大。

除了較短的構建時間外,小型部署 artifacts 還可確保較短的發佈和部署時間。 由於實現已經包含在運行時中,所以在所有情況下,移動部件花費的時間都是最小的。

6.Docker的理想框架

這正是Java EE成為Docker等容器技術的完美框架的原因。Docker 鏡像基於圖層,構建圖像時,基本圖像已包含操作系統,Java運行時和應用程式。因此,在每個構建中添加的唯一內容是部署工件的最後一個千位元組薄層。與胖WAR或獨立JAR方法相比,這節省了時間和存儲 - 不僅在每個構建上,而且在圖像版本化或發佈版本時 。

無論在哪個階段,擁有精簡的部署 artifacts 都可以實現非常快速和高效的部署管道。

7.現代應用伺服器

J2EE 應用程式伺服器是重量級軟體在啟動和部署時間,安裝大小和資源占用空間方面的體現。 但是在 Java EE 的新世界中,這已不再適用。

所有現代Java EE 7應用程式伺服器(如WildFly,Payara,WebSphere Liberty,Profile和TomEE)都可在幾秒鐘內啟動和部署。由於內部,全面的模塊化,他們只能載入所需的組件並儘快部署精簡的應用程式 artifacts。

現在的安裝尺寸和占地面積非常合理。 應用程式伺服器不會消耗比簡單的 servlet 容器更多的東西,但它具有完整的 Java EE 功能。 有趣的是,現在運行的瀏覽器實例消耗更多記憶體。

話雖如此,每個伺服器只部署一個應用程式是可能的,也可以是合理的 - 無論是在容器中還是在內部。 通過“每個容器每個應用程式伺服器一個應用程式”方法,您可以為現代微服務架構提供高效且靈活的解決方案。

8.打包

在打包過程中,不應該繼續使用EAR文件了。將整個應用程式部署在獨立的專門的伺服器上,要求我們在那個環境中必須可以訪問所有的組件方法,這樣做可以節省更多的構建和部署時間。除此之外,這還避免了EAR文件傾向於導致的類載入層次結構問題。

在大多數雲和微服務部署中,使用獨立的JAR包。 它們包含應用程式和運行時實現。 在Java EE領域,這種方法可以使用特定於供應商的工具鏈來實現,例如 WildFly Swarm,Payara Micro 或TomEE Embedded。

但是,由於上述原因,我強烈建議儘可能將業務邏輯與運行時分開。 這意味著將應用程式打包在僅包含應用程式代碼的WAR文件中。

在我看來,如果由於公司“政治”問題而不是技術原因而無法控制安裝或操作流程,則獨立 JAR 文件是一種有用的解決方法。 然後運送部署工件中所需的所有內容並且只需要 JRE 時可以解決相當多的非技術問題。

9.關於高效研發進程的建議

企業項目最有效的解決方案之一如下:

  • 僅在提供 API 時使用 Java EE 7 和 Java 8
  • 構建一個千位元組大小的 WAR 文件,其中僅包含業務邏輯和最小管道(例如 JAX-RS 資源或JPA)
  • 構建 Docker 鏡像 - 僅將 WAR 文件添加到包含已配置的應用程式伺服器的基礎鏡像
  • 通過使用容器部署應用程式的 CD 管道進行傳送

10.結論

“重量級 Java EE”的日子肯定結束了。 Java EE 中包含的 API 提供了高效且愉快的開發人員體驗以及標準內的無縫集成。 特別是,將應用程式代碼與運行時分離的方法可實現快速,高效的開發過程。

通過由多個供應商發起的新MicroProfile計劃,將來可能會進一步縮小Java EE所需的組件。

參考資料

原文:https://community.oracle.com/docs/DOC-1008823

作者:Sebastian Daschner

譯者:[KeepGoingPawn](https://blog.csdn.net/hengji666

9月福利,關註公眾號

後臺回覆:004,領取8月翻譯集錦!

往期福利回覆:001,002, 003即可領取!

img


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、安裝 Git 和 nodejs "https://hexo.io/zh cn/docs/" ​ 2 安裝Hexo "https://hexo.io/zh cn/" ​ 3、更換伊卡洛斯主題 "https://github.com/ppoffice/hexo theme icarus" ​ 配置新 ...
  • 一、寫在前面 說道程式員,你會想到什麼呢?有人認為程式員象徵著高薪,有人認為程式員都是死肥宅,還有人想到的則是996和 ICU。 別人眼中的程式員:飛快的敲擊鍵盤、酷炫的切換屏幕、各種看不懂的字元代碼。 然而現實中的程式員呢?對於很多程式員來說,沒有百度和 Google 解決不了的問題,也沒有 ct ...
  • 三、在碼雲平臺創建項目 git服務平臺: 主要使用github(最主流) 國內訪問速度慢 托管私有項目收費 國內一般使用碼雲gitee 國內訪問速度快 托管私有項目免費(限制開發人數) 公司中使用gitlab或者svn來搭建 主要使用github(最主流) 國內訪問速度慢 托管私有項目收費 國內訪問 ...
  • maven是一個基於java平臺的自動化構建工具。構建工具的發展由make->ant->maven->gradle其中gradle還在發展中,使用較少,學習難度比較大,所以目前占據主流的還是maven。 maven的作用:①,幫助我們管理jar包:i,增加第三方jar包。先在本地倉庫中下載,如果本地 ...
  • 大家或許知道,Python 為了提高記憶體的利用效率,採用了一套共用對象記憶體的分配策略。 例如,對於那些數值較小的數字對象([ 5, 256])、布爾值對象、None 對象、較短的字元串對象( 通常 是 20)等等,字面量相等的對象實際上是同一個對象。 我很早的時候曾寫過一篇《 "Python中的“特 ...
  • 進程和線程 進程是程式運行的實例。一個進程裡面可以包含多個線程,因此同一進程下的多個線程之間可以共用線程內的所有資源,它是操作系統動態運行的基本單元;每一個線程是進程下的一個實例,可以動態調度和獨立運行,由於線程和進程有很多類似的特點,因此,線程又被稱為輕量級的進程。線程的運行在進程之下,進程的存在 ...
  • 今日所學: /* 2019.08.19開始學習,此為補檔。 */ 1.繼承補充: ①不要僅為了獲取其他類中某個功能而去繼承,而是要有所屬關係。 ②Super關鍵字: a.代表父類對象的引用,且main方法裡面不能有關鍵字。 b.子類的構造方法必須調用父類的構造方法。 c.super()函數只能放在構 ...
  • 今日所學: /* 2019.08.19開始學習,此為補檔。 */ 1.Date工具類: 2.Object類:是所有類的父類。 打開類的所有信息:ctrl+o 3.instanceof關鍵字:判斷一個對象是否屬於一個類。 格式:對象 instanceof 類 > 返回布爾類型 4.匿名內部類:new一 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...