」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 利用自動設定和與 Quarkus 開發服務的整合來實現高效開發

利用自動設定和與 Quarkus 開發服務的整合來實現高效開發

發佈於2024-11-09
瀏覽:144

JPrime 2024圆满结束!!

JPrime 2024 的组织者再次竭尽全力提供多样化的主题,确保每个人都能有所收获。

然而,今天的文章并不是由 Michael Simons 的一篇关于 “Spring 和 Quarkus 中集成测试的演变” 的演讲引发的,尽管它非常有洞察力。他探索了集成测试策略,重点关注 Spring Boot 中的设置。

作者明确强调,他强调的问题在 Quarkus 中通过利用开发服务得到了有效解决(图 1)。这凸显了我对某些应用程序持怀疑态度的 Spring Boot 的另一个原因 - 它的复杂性与 Quarkus 中的简化解决方案形成鲜明对比,特别是在使用开发服务时。

Harnessing Automatic Setup and Integration with Quarkus Dev Services for Efficient Development

图 1 – JPrime 2024

目睹开发服务在新与会者中引发的惊讶是非常了不起的。然而,值得注意的是,Dev Services 并不是 Quarkus 的最新功能。相当长一段时间以来,它一直是该框架的组成部分。让我们更深入地研究 Quarkus 开发服务并探索其持久的优势。

Quarkus 开发服务

在 Quarkus 中,开发服务有助于在开发和测试模式下自动配置未配置的服务。本质上,如果您在未配置的情况下包含扩展,Quarkus 将自动启动相关服务(通常在后台使用 Testcontainers)并配置您的应用程序以有效地使用此服务。

  1. 自动服务检测和启动

    Quarkus Dev Services 可自动检测和启动必要的服务,例如数据库、消息代理和其他后端服务。此函数利用 pom.xml 或 build.gradle 中指定的应用程序依赖项。例如,添加数据库驱动程序会自动触发开发服务来启动该数据库的相应容器化实例(如果该实例尚未运行)。这里使用的技术主要涉及 Testcontainers,它允许创建通用数据库、Selenium Web 浏览器或任何其他可以在 Docker 容器中运行的轻量级、一次性实例。

  2. 动态配置注入

    一旦实例化所需的服务,Quarkus Dev Services 就会在运行时将相关服务连接详细信息动态注入到应用程序的配置中。这是在没有任何手动干预的情况下完成的,使用称为连续测试的功能将标准数据库或其他服务 URL 重新路由到自动配置的测试容器。 URL、用户凭据和其他操作参数等配置属性是无缝设置的,允许应用程序与这些服务交互,就像手动配置它们一样。

  3. 服务特定行为

    开发服务专为各种类型的服务量身定制:

    • 数据库: 自动提供根据您的应用程序需求量身定制的正在运行的数据库,无论是 PostgreSQL、MySQL、MongoDB 还是任何其他支持的数据库。开发服务确保相应的测试容器在开发过程中可用。
    • 消息系统: 对于使用 Kafka 或 AMQP 等消息系统的应用程序,Quarkus Dev Services 使用 Docker 启动必要的代理并将它们与应用程序连接。
    • 自定义开发服务: 开发人员可以通过创建利用开发服务框架的自定义 Quarkus 扩展来扩展功能。这允许针对特定项目进行定制设置,提供更大的灵活性和控制力。
  4. 网络处理和服务隔离

    Quarkus Dev Services 启动的每个服务都在其隔离的环境中运行。这对于确保不同开发测试之间不存在端口冲突、数据残留或安全问题至关重要。尽管存在这种隔离,服务仍使用 Docker 适当联网,确保它们可以根据需要相互通信,模仿真实世界的部署氛围。

  5. 生命周期管理

    Quarkus 管理这些动态配置的服务的完整生命周期。当您在开发模式下启动应用程序时,必要的服务会自动启动。当您停止 Quarkus 应用程序时,这些服务也会终止。此管理包括根据需要处理数据持久性,使开发人员能够从中断的地方继续操作,而不会出现任何设置延迟。

用法示例

假设您正在 Quarkus 中使用 PostgreSQL 数据库。如果没有检测到现有的 PostgreSQL 配置,Quarkus 将启动 PostgreSQL Docker 容器并自动连接您的应用程序。

这些服务在开发和测试模式下默认启用,但如有必要,可以通过 application.properties:
禁用

quarkus.datasource.devservices.enabled=false

让我们扩展一下 Quarkus 使用 PostgreSQL 数据库的场景,以及开发服务如何以最小的麻烦来促进这一点。

如果 Quarkus 检测到没有 PostgreSQL 配置处于活动状态(未运行或未显式配置),它将自动使用 Docker 启动 PostgreSQL 容器。这是通过开发服务在幕后设置的。

要通过 ORM 层与数据库交互,请考虑使用 Quarkus Panache,它简化了 Hibernate ORM 操作。以下是如何设置您的环境:

  1. 添加依赖项

    首先,在 pom.xml 中包含必要的依赖项:

    io.quarkusquarkus-hibernate-orm-panacheio.quarkusquarkus-jdbc-postgresql
  2. 定义实体

    接下来,定义您的实体,例如 CityEntity:

    @Entity
    @Table(name = "cities")
    public class CityEntity {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    private String name;
    
    @Column(name = "public_id")
    private String publicId;
    
    @OneToOne
    private StateEntity state;
    
    @Column(nullable = false, name = "created_at")
    private Instant createdAt;
    
    @Column(nullable = false, name = "last_modified")
    private Instant lastModified;
    
    @PrePersist
    protected void onCreate() {
     createdAt = Instant.now();
     lastModified = createdAt;
    }
    
    @PreUpdate
    protected void onUpdate() {
     lastModified = Instant.now();
    }
    }
    
  3. 创建存储库

    实现将直接与数据库交互的存储库:

    @ApplicationScoped
    public class CityRepository implements 
    PanacheRepository {
    }
    
  4. 服务层

    定义使用存储库的服务层:

    @ApplicationScoped
    public class CityServiceImpl implements CityService {
    
      @Inject
      CityRepository cityRepository;
    
      @Override
      public long countCities() {
       return cityRepository.count();
      }
    }
    
    public interface CityService {
     long countCities();
    }
    
  5. 资源端点

    @Path("/cities")
    @Tag(name = "City Resource", description = "City APIs")
    public class CityResource {
    
      @Inject
      CityService cityService;
    
      @GET
      @Path("/count")
      @Operation(summary = "Get the total number of cities", 
       description = "Returns the total count of cities in the 
       system.")
      @APIResponse(responseCode = "200", description = "Successful 
      response", content = @Content(mediaType = "application/json", 
      schema = @Schema(implementation = Long.class)))
      public long count() {
       return cityService.countCities();
      }
     }
    

当您运行 Quarkus 应用程序 (mvn quarkus:dev) 时,观察 PostgreSQL 容器的自动启动情况(图 2)。这种无缝集成体现了 Quarkus 开发服务的强大功能,通过自动配置和连接设置到应用程序所需的外部服务,使开发和测试变得更加简单。

Harnessing Automatic Setup and Integration with Quarkus Dev Services for Efficient Development

图 2 – 应用程序日志

平台开发服务

Quarkus Dev Services 通过处理各种服务的配置和管理来简化开发和测试阶段,使开发人员能够更加专注于实际应用程序。 Quarkus 支持广泛的开发服务,包括:

  • AMQP
  • Apicurio 注册表
  • 数据库
  • 卡夫卡
  • 钥匙斗篷
  • Kubernetes
  • MongoDB
  • RabbitMQ
  • 脉冲星
  • Redis
  • 金库
  • 无限跨度
  • Elasticsearch
  • 可观察性
  • Neo4j
  • WireMock
  • 麦克克斯
  • 钥匙斗篷
  • 还有更多,每一个都旨在无缝增强您的开发环境

结论

Quarkus 开发服务代表了开发人员在开发和测试阶段如何设置和集成外部服务的范式转变。环境设置的自动化不仅加速了开发过程,还减少了配置错误的可能性,使团队更容易专注于创建强大的、功能丰富的应用程序。

Quarkus 开发服务的突出优势之一是强调开发人员的生产力。通过消除手动管理服务依赖项的需要,开发人员可以立即开始处理业务逻辑和应用程序功能。这种简化的工作流程在微服务架构中特别有益,其中多个服务可能需要同时开发和集成

总之,采用 Quarkus 开发服务可以显着影响您的开发团队的效率和项目成果。 Quarkus 的简单性和强大功能鼓励实验,
更快的迭代,最终加快开发周期。这种技术杠杆是现代企业在数字时代蓬勃发展所需要的。

版本聲明 本文轉載於:https://dev.to/yanev/harnessing-automatic-setup-and-integration-with-quarkus-dev-services-for-efficient-development-27m2?1如有侵犯,請洽study_golang@163 .com刪除
最新教學 更多>
  • JavaScript 可以使用座標模擬點擊嗎?
    JavaScript 可以使用座標模擬點擊嗎?
    在 JavaScript 中以座標模擬點擊在 Web 開發中,有時需要模擬使用者交互,例如點擊。 JavaScript 提供了一種利用特定座標來實現此目的的方法。 在 JavaScript 中基於 x,y 座標模擬點擊是否可行? 是的,可以使用 JavaScript 中的座標模擬來點擊。但是,重要的...
    程式設計 發佈於2024-11-09
  • 如何在 Go 中自動執行外部命令輸入:繞過「登入」等命令的使用者互動的指南
    如何在 Go 中自動執行外部命令輸入:繞過「登入」等命令的使用者互動的指南
    Go 自動化外部命令輸入在 Go 中,執行外部命令並管理其輸入和輸出是一項常見任務。但是,在處理提示使用者輸入的命令(例如「登入」)時,以程式設計方式自動執行這些輸入可能具有挑戰性。 解決此問題的一種方法是直接寫入命令的標準輸入(stdin) )使用位元組緩衝區。讓我們深入研究提供的解決方案:lo...
    程式設計 發佈於2024-11-09
  • 如何使用並發在 Go 中高效率地讀寫 CSV 檔案?
    如何使用並發在 Go 中高效率地讀寫 CSV 檔案?
    Go 中高效的 CSV 讀寫Go 中高效的 CSV 讀寫package main import ( "encoding/csv" "fmt" "log" "os" "strconv"...
    程式設計 發佈於2024-11-09
  • 如何在 CSS 中為多個父級中的特定 n 個子級設定樣式
    如何在 CSS 中為多個父級中的特定 n 個子級設定樣式
    跨多個父級設定特定第n 個子級的樣式使用第n 個子級選擇器設定嵌套元素的樣式時,需要注意的是,選擇器在單父上下文中運行。當針對多個父級中的特定子元素時,這可能會帶來挑戰。 問題:考慮以下標記:<div class="foo"> <ul> ...
    程式設計 發佈於2024-11-09
  • 如何使用字串插值將 CSS 屬性設定為 SASS 中的 mixin 值?
    如何使用字串插值將 CSS 屬性設定為 SASS 中的 mixin 值?
    將 SASS Mixin 值設為 CSS 屬性建立通用邊距/填入 mixin 時,可能需要將 CSS 屬性設為 mixin 值。為此,需要使用字串插值。 CSS 屬性的字串插值要使用變數作為 CSS 屬性名稱,需要字串插值 (#{$var})。 範例下面的 mixin 示範如何使用字串設定 CSS ...
    程式設計 發佈於2024-11-09
  • MUI TextField:建立變體、顏色和樣式
    MUI TextField:建立變體、顏色和樣式
    The mui textfield is a fundamental component in Material-UI, designed to capture user inputs efficiently and stylishly. This guide explores its build ...
    程式設計 發佈於2024-11-09
  • 在 Java 中如何安全地將 Long 轉換為 Int?
    在 Java 中如何安全地將 Long 轉換為 Int?
    在Java 中安全地將Long 轉換為Int:一個全面的解決方案在Java 中使用數位類型時,請確保轉換至關重要操作不會導致資料遺失。當將 long 值轉換為 int 時,這一點尤其重要,因為 long 的精度可能超過 int。 Java 8:簡化流程Java 8 之前的版本,安全地將 long 轉...
    程式設計 發佈於2024-11-09
  • 如何修復整合 Authorize.net 支付網關時出現「呼叫未定義函數curl_init()」錯誤?
    如何修復整合 Authorize.net 支付網關時出現「呼叫未定義函數curl_init()」錯誤?
    未定義的函數:curl_init()在實作Authorize.net的支付網關的上下文中,您可能會遇到錯誤「呼叫未定義」函數curl_init()」。這表示您的系統上未正確配置或安裝PHP curl 擴充功能。Windows 作業系統對於Windows 使用者,請驗證您的php.ini 檔案中的以下...
    程式設計 發佈於2024-11-09
  • Next.js 中的 SSR 應用程式路由與頁面路由相比有何新變化
    Next.js 中的 SSR 應用程式路由與頁面路由相比有何新變化
    介绍 Next.js 长期以来一直是构建服务器渲染 React 应用程序的流行选择。凭借其对服务器端渲染 (SSR) 的内置支持,开发人员可以创建动态、SEO 友好的应用程序。然而,Next.js 13 中 App Router 的引入以及 Next.js 14 中的改进显着简化和...
    程式設計 發佈於2024-11-09
  • CSS 中的垂直對齊實際上是如何運作的?
    CSS 中的垂直對齊實際上是如何運作的?
    CSS 中的垂直對齊:了解細微差別vertical-align 屬性可讓您將內聯元素垂直放置在其父元素中。然而,除非您掌握基本原理,否則它的行為可能是不可預測的。 內聯元素與高度Vertical-align 僅影響內聯元素。 和 等元素是區塊級元素,不受影響。對於沒有固有行高的內聯元素,例如 ...
    程式設計 發佈於2024-11-09
  • 將日期物件轉換為時間戳記時,一元加運算子有何作用?
    將日期物件轉換為時間戳記時,一元加運算子有何作用?
    Unary Plus:將日期物件轉換為毫秒時間戳在JavaScript 中,您可能會遇到類似以下內容的程式碼:function fn() { return new Date; }此表達式傳回表示當前時間的時間戳,而不是完整的 Date 物件。然而,加號 ( ) 的作用並不是立即顯而易見。 答案...
    程式設計 發佈於2024-11-09
  • Astra 專案:多模式人工智慧的新時代
    Astra 專案:多模式人工智慧的新時代
    Astra 项目由 Google DeepMind 开发,代表了多模式人工智能发展的突破性一步。与依赖单一输入类型(例如文本或图像)的传统人工智能系统不同,Project Astra 将多种形式的数据(包括视觉、听觉和文本输入)集成到一个有凝聚力的交互式人工智能体验中。这种方法旨在创建一个更直观、反...
    程式設計 發佈於2024-11-09
  • 為什麼我的 HTML 輸出顯示為純文字而不是渲染?
    為什麼我的 HTML 輸出顯示為純文字而不是渲染?
    HTML 輸出解釋為純文本而不是作為HTML 接收這裡的問題涉及HTML 輸出呈現為純文本的場景被解析為正確的HTML。提供了基本的 Go 實現,但呈現的輸出在 pre 標記內顯示逐字 HTML 程式碼。 要修正此問題,必須設定 Content-Type 標頭以指定回應為 HTML。這可確保瀏覽器正...
    程式設計 發佈於2024-11-09
  • 如何使用 Dualite 建立登陸頁面
    如何使用 Dualite 建立登陸頁面
    我花了几个小时创建登陆页面的 Figma 设计。每种颜色都恰到好处,每个像素都就位,并且具有无缝的用户流程,但现在是实际编码此着陆页的令人畏惧的部分。 构建 Figma 设计是一项艰巨的任务。这就是我了解 Dualite 的地方,它使用 AI 将 Figma 设计转化为实际代码,帮助像我这样的开发人...
    程式設計 發佈於2024-11-09
  • 如何在 PHP 中透過壓縮將 PNG 轉換為 JPG 並保持透明度?
    如何在 PHP 中透過壓縮將 PNG 轉換為 JPG 並保持透明度?
    在PHP 中通過壓縮將PNG 轉換為JPG許多用戶尋求通過減小圖像文件大小同時保持視覺效果來優化其Web 應用程式品質。將高品質 PNG 檔案轉換為 JPG 是實現此目的的常用方法,因為 JPG 通常具有較小的檔案大小。 PHP 提供了多個函數和函式庫來促進這種轉換。 要安全地將 PNG 轉換為透明...
    程式設計 發佈於2024-11-09

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

Copyright© 2022 湘ICP备2022001581号-3