」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 擴展 Quarkus:何時以及如何編寫自己的擴展

擴展 Quarkus:何時以及如何編寫自己的擴展

發佈於2024-11-16
瀏覽:962

Extending Quarkus: When and How to Write Your Own Extensions

Quarkus 凭借其创新的扩展框架,为开发人员提供了一种将各种技术无缝集成到其应用程序中的强大方法。这些扩展简化了配置、启用依赖项注入并优化了性能,使其成为 Java 开发人员的一个有吸引力的选择。然而,在深入创建您自己的 Quarkus 扩展之前,了解何时需要以及如何有效地做到这一点至关重要。

何时创建 Quarkus 扩展

  1. 复杂集成: 如果您正在使用 ORM 映射器、响应式客户端或数据访问库等复杂框架,那么创建扩展可以帮助管理复杂的配置和依赖项管理。扩展简化了 Quarkus 应用程序中这些框架的使用。

  2. 性能优化: Quarkus 扩展旨在与 Quarkus 的本机编译保持一致,从而使应用程序能够快速启动并具有最小的内存占用。通过创建扩展,您可以利用 Quarkus 的构建时优化能力来扫描依赖项并尽早生成配置,从而避免启动延迟。

  3. 开发者体验增强:扩展可以显着增强开发者体验。它们支持实时重新加载、CLI 扩展、模板化等,从而简化了开发过程。如果您想为您的团队提供无缝且高效的开发环境,扩展可以帮助实现这一目标。

  4. API 强化: 如果您正在构建供其他 Quarkus 开发人员使用的 API 或库,扩展提供了一种绝佳的方法来强化您的 API 并确保它们在 Quarkus 生态系统中无缝工作.

但是,扩展可能并不总是最好的方法。对于更简单的需求,例如在组件之间共享实用程序代码和粘合逻辑,基本的 JAR 文件可能就足够了,而无需创建扩展的开销。如果您的集成是特定于应用程序的并且不太可能在其他地方重用,则基本 JAR 可能是更简单的解决方案。此外,如果您需要完全控制依赖项版本,并且不想遵守 Quarkus 的 BOM(物料清单)进行依赖项管理,那么 JAR 可能是更好的选择。最后,如果您的代码需要跨多个 JVM 框架工作,例如 SpringMicronaut,最好避免与 Quarkus 紧密耦合。

创建 Quarkus 扩展可能很复杂,通常需要深入了解 Quarkus 内部工作原理。然而,对于许多场景,创建标准 JAR 就足够了。当 Jandex 索引此 JAR 时,Quarkus 可以在构建期间无缝地发现该 JAR。虽然 Quarkus 扩展提供了一系列优势,包括卓越的性能和开发人员生产力,但它们可能并不总是必要的。

Quarkus 将工作转移到构建时间而不是运行时的独特方法是其快速启动时间和低内存占用的核心。这一理念延伸到了 Quarkus 扩展,它可以利用这些构建时优化。即使您主要关心的不是快速启动时间,创建扩展的好处还包括简化配置、扩展 Quarkus CLI 以及与 Quarkus 的开发模式集成。

创建 Quarkus 扩展不必过于复杂。通过正确的方法和对项目需求的清晰了解,您可以有效地解决复杂的问题。扩展提供了一种灵活而强大的方式来增强您的 Quarkus 应用程序并使其更加高效且对开发人员友好。

创建 Quarkus 扩展

当您确定创建 Quarkus 扩展是正确的方法时,了解扩展的结构组件至关重要:

  • 运行时部分: 该部分包含作为 bean、服务或与 Quarkus 集成的其他组件实现的核心业务逻辑;
  • 部署部分:部署部分处理构建时的增强和配置。它确保您的扩展与 Quarkus 的优化流程无缝集成;
  • 描述符: 描述符声明有关您的扩展的元数据,包括其名称、参数、兼容性信息等;
  • 文档: 综合文档应随您的扩展一起提供。它指导用户如何有效地使用和配置您的扩展。

Quarkus 扩展的解剖

考虑一个场景,您想要为 Quarkus 创建自定义缓存扩展。此扩展将使开发人员能够轻松地将缓存功能集成到他们的 Quarkus 应用程序中。

  1. 运行时部分:

    • 在本节中,您将使用 Java 代码实现核心缓存功能。这可能包括缓存数据、检索缓存数据和管理缓存过期的方法。
    • 例如,您可能有一个 CustomCacheService 类,其中包含 put(key, value)、get(key) 和 evict(key) 等方法来处理缓存操作。
  2. 部署部分:

    • 部署部分负责构建时优化。在这里,您可以指定在构建过程中如何生成缓存配置。
    • 对于我们的缓存扩展,本节可能包括有关如何扫描应用程序代码中的缓存对象并生成缓存配置的说明。
  3. 描述符:

    • 描述符文件 (custom-cache-extension.yaml) 提供有关您的扩展的元数据。它包括扩展名称、版本、与 Quarkus 的兼容性以及配置参数等信息。
    • 例如,您的描述符可能指定扩展名为“custom-cache-extension”,与 Quarkus 2.0 兼容,并且需要缓存超时配置参数。
  4. 文档:

    • 您的扩展应附带全面的文档。它指导用户如何在 Quarkus 应用程序中有效地使用自定义缓存扩展。
    • 文档应包括如何配置缓存、将其集成到 Quarkus 服务以及管理缓存数据的示例。此外,它应该提供缓存利用的最佳实践。

通过遵循此结构,您的自定义缓存扩展将成为 Quarkus 开发人员的宝贵工具。他们可以轻松地将缓存合并到应用程序中,从而提高性能并优化资源使用。

运行时模块:

class CustomCacheService {

    // Core caching functionality using Java code
    public void put(String key, Object value) {
      // Cache data implementation
    }

    public Object get(String key) {
      // Retrieve cached data implementation
    }

    public void evict(String key) {
      // Evict cached data implementation
    }
}

部署模块:

class CustomCacheProcessor {
    @BuildStep
    FeatureBuildItem feature() {
        // This declares the custom cache extension as a feature
        return new FeatureBuildItem("custom-cache");
    }
}

描述符文件: custom-cache-extension.yaml

extension:
name: custom-cache-extension
metadata:
    short-name: "resteasy-reactive"
    keywords:
    - "jaxrs"
    - "web"
    - "rest"
    categories:
    - "web"
    - "reactive"
    status: "stable"
    guide: "https://quarkus.io/guides/resteasy-reactive"

结论

总之,是否创建 Quarkus 扩展取决于您项目的具体需求和目标。 Quarkus 扩展是用于深度集成、性能优化和增强开发人员体验的强大工具。然而,权衡利弊并考虑更简单的解决方案(例如标准 JAR 库)是否更适合您的用例至关重要。通过了解何时以及如何有效地创建 Quarkus 扩展,您可以做出明智的决策并充分利用这一创新框架的潜力。

版本聲明 本文轉載於:https://dev.to/yanev/extending-quarkus-when-and-how-to-write-your-own-extensions-1a0k?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 什麼時候應該使用 jmap 的 -F 選項進行堆轉儲?
    什麼時候應該使用 jmap 的 -F 選項進行堆轉儲?
    jmap 操作期間無法開啟套接字檔案:-F 選項嘗試使用jmap 取得堆轉儲時遇到問題,導致錯誤訊息:「無法開啟套接字檔案」。這表示 HotSpot JVM 未載入或目標程序無回應。 為了解決這個問題,使用 -F 選項來利用一種不同的機制,稱為 HotSpot Serviceability Agen...
    程式設計 發佈於2024-11-16
  • 如何讓 CSS 動畫在 Webkit 完成後保持原狀?
    如何讓 CSS 動畫在 Webkit 完成後保持原狀?
    理解Webkit CSS動畫持久性使用CSS3動畫時,經常會遇到動畫元素恢復到原始狀態的情況動畫完成。雖然此行為符合動畫停止的標準邏輯,但在某些用例中似乎違反直覺。 考慮提供的範例,其中使用 Webkit CSS 語法將「drop_box」元素設定為下降 100 像素的動畫。動畫完成後,框中的文字跳...
    程式設計 發佈於2024-11-16
  • 如何使用 Selenium 點選具有複雜 HTML 結構的按鈕?
    如何使用 Selenium 點選具有複雜 HTML 結構的按鈕?
    Selenium 點擊具有複雜HTML 結構的按鈕當您嘗試使用Selenium 點擊具有複雜HTML 結構的按鈕時,您可能會遇到NoSuchElementException。當按鈕的 HTML 包含多個具有 onclick 屬性的類別或元素時,可能會發生這種情況。 若要精確按一下此類按鈕,請依照下列...
    程式設計 發佈於2024-11-16
  • 如何刪除 PHP 中特定子字串之後的所有內容?
    如何刪除 PHP 中特定子字串之後的所有內容?
    如何刪除PHP 中特定子字串之後的部分字串您可以使用下列指令刪除PHP 中特定子字串之後的所有內容substr() 函數。 substr()函數接受三個參數:輸入字串起始位置長度 要刪除某個子字串之後的所有內容,可以使用strpos() 函數來找出該子字串在輸入字串中的位置。然後,您可以使用 sub...
    程式設計 發佈於2024-11-16
  • 在 Go 中使用 WebSocket 進行即時通信
    在 Go 中使用 WebSocket 進行即時通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要一种比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSoc...
    程式設計 發佈於2024-11-16
  • 我們如何計算 JavaScript 物件的大致記憶體佔用量?
    我們如何計算 JavaScript 物件的大致記憶體佔用量?
    確定 JavaScript 物件的記憶體佔用在 JavaScript 中,了解物件的記憶體消耗對於優化效能和避免記憶體洩漏至關重要。本文解決了獲取 JavaScript 物件大小的查詢,深入研究了估計此類物件所佔用的大致記憶體的解決方案。 確定物件大小In JavaScript 中沒有專門設計的內建...
    程式設計 發佈於2024-11-16
  • 如何使用 CSS 設定圖片地圖區域的樣式?
    如何使用 CSS 設定圖片地圖區域的樣式?
    您可以使用 CSS 在圖片映射上設定滑鼠懸停樣式嗎? 圖像映射用於描繪圖像中的可單擊區域。預設顯示為簡單幾何形狀的這些區域的樣式可以用作視覺互動介面。人們可能會想知道這對 CSS 是否可行,CSS 是網站美觀不可或缺的工具。雖然 CSS 無法直接設定圖像映射區域的樣式,但有一些巧妙的解決方法可以實現...
    程式設計 發佈於2024-11-16
  • 大批
    大批
    方法是可以在物件上呼叫的 fns 數組是對象,因此它們在 JS 中也有方法。 slice(begin):將陣列的一部分提取到新數組中,而不改變原始數組。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index ...
    程式設計 發佈於2024-11-16
  • 當我的傳單地圖位於資料切換標籤內時,為什麼我無法下載它?
    當我的傳單地圖位於資料切換標籤內時,為什麼我無法下載它?
    資料切換標籤阻礙傳單地圖下載當資料切換標籤中的傳單地圖無法正確下載時,就會出現此問題。地圖以前在選項卡外部顯示時可以正常工作。 原因Leaflet 在讀取容器大小時初始化地圖。當容器最初被隱藏或其尺寸發生變化時,Leaflet 仍然不知道這些變化,導致錯誤的切片下載。在 Bootstrap 等框架中...
    程式設計 發佈於2024-11-16
  • 如何在 C++ 中實現 Go 風格的 Defer 而不犧牲效能?
    如何在 C++ 中實現 Go 風格的 Defer 而不犧牲效能?
    C 語言中的 Defer 實作 Go 風格的 defer 概念允許乾淨簡潔的資源清理,在 C 語言中很受歡迎。然而,為此功能找到標準或支援良好的庫實現可能具有挑戰性。 儘管標準範本庫 (STL) 或 Boost 中缺乏對 defer 的內建支持,但仍有可用的外部實作。其中一個實作是輕量級、零開銷的解...
    程式設計 發佈於2024-11-16
  • 如何在 Go 中使用反射自訂 JSON 解組?
    如何在 Go 中使用反射自訂 JSON 解組?
    使用反射自訂 JSON 解組在 Go 中,將 JSON 解組為結構體是一個簡單的過程。然而,當處理具有自訂標籤的欄位時,例如 json:"some_field",標準的解組機制可能不夠。 處理這種情況的一種方法是使用反射。透過使用反射檢查結構體的字段,我們可以檢查字段是否具有特定...
    程式設計 發佈於2024-11-16
  • 如何輕鬆地將程式碼傳輸到 Python 解釋器中而不出現縮排問題?
    如何輕鬆地將程式碼傳輸到 Python 解釋器中而不出現縮排問題?
    便捷的代碼傳輸:繞過Python 的空白敏感度由於語言嚴格的空白,將代碼直接複製粘貼到Python 解釋器中可能會出現問題敏感度。這通常會導致意外的程式碼執行或語法錯誤。 IPython 作為解決方案IPython 是一種高級 Python 命令 shell,透過其專用命令。 %cpaste:將剪貼...
    程式設計 發佈於2024-11-16
  • Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta:列偏移的刪除和恢復Bootstrap 4 在其Beta 1 版本中引入了重大更改柱子偏移了。然而,隨著 Beta 2 的後續發布,這些變化已經逆轉。 從 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    程式設計 發佈於2024-11-16
  • Python 請求如何使用 Javascript 處理動態網站?
    Python 請求如何使用 Javascript 處理動態網站?
    克服 Python 請求的 Javascript 障礙傳統的 Python 請求旨在從靜態 HTML 頁面中提取資訊。然而,許多現代網站使用 Javascript 來動態獲取數據,這給 Requests 帶來了挑戰。 是否有解決方法可以利用 Javascript 頁面的 Requests ? 絕對可...
    程式設計 發佈於2024-11-16
  • 從本地主機到生產:OneBootcamp 的問題優先 SRE 之旅
    從本地主機到生產:OneBootcamp 的問題優先 SRE 之旅
    我在X(以前的Twitter)上遇到了One2N 舉辦的一個問題優先的SRE 訓練營(在這裡你可以構建一個應用程序,並將其從本地主機擴展到生產環境),我想,「哎呀是啊!我會嘗試一下。」這篇部落格文章開啟了我的旅程,我將記錄我在訓練營中處理每項練習的經驗。 這篇介紹文章將連結到其他條目,詳細介紹我對...
    程式設計 發佈於2024-11-16

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3