Categories
程式開發

Quarkus入門指南


本文要點:

  • Quarkus是一項針對雲開發的新技術。
  • 使用Quarkus,你可以利用針對雲優化過的更小的運行時。
  • 你不需要重新學習新的API。 Quarkus是建立在過去十年最好的技術上,如Hibernate、RESTEasy、Vert.x和MicroProfile。
  • Quarkus從一開始就是高效的。
  • Quarkus已經生產就緒。

2019年,Quarkus在企業Java生態系統中引起了不小的轟動。 Quarkus到底是什麼?它與市場上的其他技術有何不同? Quarkus為我或我的組織提供了什麼幫助?讓我們一起找出答案。

更多 Quarkus 的項目進展和路線圖,敬請關注QCon全球軟件開發大會(北京站)2020。屆時紅帽高級軟件工程師馮徵將進一步介紹 Quarkus 框架設計和特點,利用 Quarkus 進行應用開發、通過 Kubernetes 進行應用部署的實踐案例。對下一代面向雲原生的編程框架 Quarkus感興趣的讀者不要錯過。

Quarkus是什麼?

Quarkus項目自稱是超音速亞原子Java。這是真的嗎?這是什麼意思?我們需要了解下軟件開發的現狀,才能更好地理解Quarkus項目背後的動機。

從本地部署到雲

以前部署應用程序的方法是使用物理硬件。購買了物理機,我們就預先為硬件需求付了款。我們已經進行了投資,因此,使用所有的或者只是少量的機器資源都沒有關係。在大多數情況下,只要能夠運行應用程序,我們就不會關心其他事情了。然而,雲正在改變我們開發和部署應用程序的方式。

因為雲上按需付費,所以我們對硬件的使用越來越講究。如果應用程序啟動需要10秒,那麼即使應用程序還沒有準備好供其他人使用,我們也必須為這10秒付費。

Java和雲

你還記得第一個Java版本是什麼時候發布的嗎?請允許我提醒你一下,那是在1996年。那時還沒有云。事實上,雲是幾年後才出現的。 Java顯然不適合這種新模式,必須進行調整。但是,這麼多年來,我們都是在使用物理機,成本不像在雲上那麼重要,我們怎麼才能改變這種模式呢?

一切都和運行時有關

多年來,許多Java庫和框架的發展方式都是在運行時執行一組增強。這是一種安全、方便的向代碼添加功能的聲明性方法。你需要依賴注入嗎?當然!使用註解。你需要事務嗎?當然!使用註解。實際上,使用這些註解,你可以編寫許多代碼,運行時將提取並處理它們。但這有一個缺點,運行時需要掃描類路徑和類以獲取元數據。這是一個消耗時間和內存的昂貴操作。

Quarkus範式轉換

Quarkus通過將昂貴的操作(如字節碼增強、動態類加載、代理等)轉移到編譯時解決了這個問題。其結果是一個消耗內存和CPU更少、啟動速度更快的環境。這非常適合雲的應用場景,對於其他用例也非常有用。無論是什麼樣的環境,每個人都將受益於更少的資源消耗。

Quarkus並沒有多新

你聽說過或使用過CDI、JAX-RS或JPA之類的技術嗎? Quarkus技術棧就是由這些已經存在了好多年的技術組成的。如果你知道如何使用這些技術進行開發,那麼你就會知道如何開發Quarkus應用程序。

你能讀懂下面的代碼嗎?

@Path("books")
@Consumes(APPLICATION_JSON)
@Produces(APPLICATION_JSON)
public class BookApi {
    @Inject
    BookRepository bookRepository;
    @GET
    @Path("/{id}")
    Response get(@PathParam("id")Long id) {
        return bookRepository.find(id)
                             .map(Response::ok)
                             .orElse(Response.status(NOT_FOUND))
                             .build();
    }
}

恭喜,你已經有了自己的第一個Quarkus應用!

最佳框架和標準組合

Quarkus編程模型建立在經過驗證的標準之上,無論是官方標準還是事實標準。目前,Quarkus對Hibernate、CDI、Eclipse MicroProfile、Kafka、Camel、Vert.x、Spring、Flyway、Kubernetes、Vault等技術提供了一等支持。當使用Quarkus時,你從第一天開始就會很有效率,因為你真的不需要學習新技術。你只需要使用過去10年一直存在的東西。

你打算使用一個不在Quarkus生態系統中的庫嗎?除非你想在GraalVM Native模式下運行它,否則很有可能不需要任何額外的設置就可以直接使用。如果想更進一步,那麼你可以輕鬆地實現自己的Quarkus擴展,為特定的技術提供支持,並豐富Quarkus生態系統。

Quarkus設置

那麼,你可能會問,是否有什麼東西還需要開發人員自己探索。實際上是有的。你需要在你的項目中使用Quarkus提供的一組特定的依賴項。別擔心,Quarkus同時支持Maven和Gradle。方便起見,你可以在Quarkus starter頁面中生成一個框架項目,並選擇要使用哪些技術。將它導入到你喜歡的IDE中,就可以開始了。以下是一個使用JAX-RS with RESTEasy和JPA with Hibernate的Maven示例項目:



  4.0.0
  org.acme
  code-with-quarkus
  1.0.0-SNAPSHOT
  
    3.8.1
    true
    1.8
    1.8
    UTF-8
    UTF-8
    1.3.0.Final
    quarkus-universe-bom
    io.quarkus
    1.3.0.Final
    2.22.1
  
  
    
      
        ${quarkus.platform.group-id}
        ${quarkus.platform.artifact-id}
        ${quarkus.platform.version}
        pom
        import
      
    
  
  
    
      io.quarkus
      quarkus-resteasy
    
    
      io.quarkus
      quarkus-junit5
      test
    
    
      io.rest-assured
      rest-assured
      test
    
    
      io.quarkus
      quarkus-hibernate-orm
    
    
      io.quarkus
      quarkus-resteasy-jsonb
    
  
  
    
      
        io.quarkus
        quarkus-maven-plugin
        ${quarkus-plugin.version}
        
          
            
              build
            
          
        
      
      
        maven-compiler-plugin
        ${compiler-plugin.version}
      
      
        maven-surefire-plugin
        ${surefire-plugin.version}
        
          
            org.jboss.logmanager.LogManager
          
        
      
    
  

你可能已經註意到,大多數依賴項都是從groupId io.quarkus開始的,而且它們不是Hi​​bernate、Resteasy或Junit的常見依賴項。

Quarkus依賴項

現在,你可能想知道,為什麼Quarkus圍繞這些流行庫提供自己的包裝器版本。其原因是為了在這些庫和Quarkus之間提供一個橋樑,以便在編譯時解析運行時依賴項。這就是Quarkus的神奇之處,其項目啟動速度快,佔用內存少。

這是否意味著你只能使用特定於Quarkus的庫?絕對不是。你可以使用任何你想用的庫。你可以在JVM上像往常一樣運行Quarkus應用程序,這樣就不會有任何限制。

GraalVM和原生鏡像

也許你已經聽說過Oracle實驗室的GraalVM項目。本質上講,GraalVM是一個通用的虛擬機,可以運行多種語言的應用程序。它最有趣的其中一個特性是,可以在原生鏡像中構建應用程序並以更快的速度運行它!實際上,這意味著你有了一個可執行文件,應用程序所需的所有依賴項都是在編譯時解析的。它不是在JVM上運行的——它是一個普通的可執行二進製文件,但是包含所有必需的組件,比如內存管理和線程調度,從一個特別的虛擬機Substrate VM運行你的應用程序。

方便起見,Maven示例項目已經具備了將你的項目構建為原生項目所需的設置。你需要在系統中安裝GraalVM和native-image工具。請按照以下說明操作。之後,只需像其他任何Maven項目一樣構建,但是使用本機配置文件:mvn verify -Pnative。這將在目標文件夾中生成一個二進制運行器,你可以使用./project-name-runner像運行任何其他二進製文件一樣運行它。以下是我機器上的一個運行器輸出樣例:

[io.quarkus] (main) code-with-quarkus 1.0.0-SNAPSHOT (powered by Quarkus 1.3.0.Final) started in 0.023s. Listening on: http://0.0.0.0:8080
INFO  [io.quarkus] (main) Profile prod activated.
[io.quarkus] (main) Installed features: [agroal, cdi, hibernate-orm, narayana-jta, resteasy, resteasy-jsonb]

注意到啟動時間了嗎?只有0.023秒。是的,我們的應用程序不大,但仍然令人印象深刻。即使是真實的應用程序,你也會看到毫秒級的啟動時間。你可以在他們的網站上了解更多關於GraalVM的信息。

開發效率

我們已經看到,Quarkus可以幫助你的公司成為雲原生公司。太棒了。但是開發人員呢?我們都喜歡閃亮的新東西,我們也超級懶。 Quarkus為開發者做了哪些其他技術做不到的事情?

那麼,在不使用外部工具或複雜技巧的情況下,熱重載是否也能正常工作呢?是的,這是真的。在Java誕生25年後,我們現在有了一種更改代碼的可靠方法,並且通過簡單的刷新就可以查看這些更改。這也是通過Quarkus的內部工作方式實現的。一切都是代碼,所以你不必再擔心那些使熱重載變得困難的事情。這是一個很簡單的操作。

要做到這一點,你必須在開發模式下運行Quarkus。只要運行mvn quarkus:dev就可以了。 Quarkus將啟動,你可以自由地對代碼進行更改並立即看到它們。例如,你可以更改REST端點參數、添加新方法和更改路徑。一旦你調用它們,它們將被更新以反映你的代碼更改。這很酷吧?

Quarkus生產就緒了嗎?

所有這一切似乎好得令人難以置信,但Quakus真的準備好投入生產環境了嗎?是的。

許多公司已經採用Quarkus作為他們的開發/運行環境。 Quarkus有一個非常快的發布週期(每隔幾週),以及一個強大的開源社區,它可以幫助Java社區中的每個開發人員,無論他們是剛剛開始使用Quarkus,還是已經是一個高級用戶。

要查看這個示例應用程序,你可以下載或克隆它。你還可以閱讀一些講述採用故事的博文,更好地了解Quarkus的使用體驗。

小結

在官方發布一年後,Quarkus已經發布了1.3.1.Final版本。這個項目做了大量的工作來幫助公司和開發人員編寫雲原生應用程序。

我們不知道Quarkus能走多遠,但有一件事可以肯定:Quarkus震撼了整個被Spring主宰著的Java生態系統。我認為,Java生態系統要想勝出,就需要提供多種可以相互推動的產品,並通過創新保持產品的競爭力。

相關資源:

作者簡介:

Roberto Cortez是一位熱誠的Java開發人員,擁有超過10年的經驗。他參與開源社區,幫助其他人傳播Java技術知識。他經常在JavaOne、Devoxx、Devnexus、JFokus等會議上發言。他領導著Coimbra JUG,並在葡萄牙創辦了JNation會議。在業餘時間,他會和朋友出去玩,玩電腦遊戲或與家人呆在一起。

原文鏈接:

Getting Started with Quarkus