JPrime 2024 圓滿結束! !
JPrime 2024 的組織者再次竭盡全力提供多樣化的主題,確保每個人都能有所收穫。
然而,今天的文章並不是由 Michael Simons 的關於 「Spring 和 Quarkus 中整合測試的演變」 的演講引發的,儘管它非常有洞察力。他探索了整合測試策略,並專注於 Spring Boot 中的設定。
作者明確強調,他強調的問題在 Quarkus 中透過使用開發服務得到了有效解決(圖 1)。這凸顯了我對某些應用程式持懷疑態度的 Spring Boot 的另一個原因 - 它的複雜性與 Quarkus 中的簡化解決方案形成鮮明對比,特別是在使用開發服務時。
圖 1 – JPrime 2024
見證開發服務在新與會者中引發的驚訝是非常了不起的。然而,值得注意的是,Dev Services 並不是 Quarkus 的最新功能。相當長一段時間以來,它一直是該框架的組成部分。讓我們更深入地研究 Quarkus 開發服務並探索其持久的優勢。
在 Quarkus 中,開發服務有助於在開發和測試模式下自動配置未配置的服務。本質上,如果您在未配置的情況下包含擴展,Quarkus 將自動啟動相關服務(通常在後台使用 Testcontainers)並配置您的應用程式以有效地使用此服務。
自動服務偵測與啟動
Quarkus Dev Services 可自動偵測和啟動必要的服務,例如資料庫、訊息代理程式和其他後端服務。此函數利用 pom.xml 或 build.gradle 中指定的應用程式依賴項。例如,新增資料庫驅動程式會自動觸發開發服務來啟動該資料庫的相應容器化執行個體(如果該執行個體尚未執行)。這裡使用的技術主要涉及 Testcontainers,它允許建立通用資料庫、Selenium Web 瀏覽器或任何其他可以在 Docker 容器中運行的輕量級、一次性執行個體。
動態設定注入
一旦實例化所需的服務,Quarkus Dev Services 就會在執行時間動態地將相關服務連線詳細資訊注入到應用程式的配置中。這是在沒有任何手動幹預的情況下完成的,使用稱為連續測試的功能將標準資料庫或其他服務 URL 重新路由到自動配置的測試容器。 URL、使用者憑證和其他操作參數等配置屬性是無縫設定的,允許應用程式與這些服務交互,就像手動配置它們一樣。
服務特定行為
開發服務專為各種類型的服務量身定制:
網路處理與服務隔離
Quarkus Dev Services 啟動的每項服務都在其隔離的環境中運作。這對於確保不同開發測試之間不存在連接埠衝突、資料殘留或安全性問題至關重要。儘管有這種隔離,服務仍使用 Docker 適當聯網,確保它們可以根據需要相互通信,模仿真實世界的部署氛圍。
生命週期管理
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 操作。以下是設定環境的方法:
新增依賴項
首先,在 pom.xml 中包含必要的依賴項:
<dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-hibernate-orm-panache</artifactId> </dependency> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-jdbc-postgresql</artifactId> </dependency>
定義實體
接下來,定義您的實體,例如 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(); } }
建立儲存庫
實作將直接與資料庫互動的儲存庫:
@ApplicationScoped public class CityRepository implements PanacheRepository<CityEntity> { }
服務層
定義使用儲存庫的服務層:
@ApplicationScoped public class CityServiceImpl implements CityService { @Inject CityRepository cityRepository; @Override public long countCities() { return cityRepository.count(); } } public interface CityService { long countCities(); }
資源端點
@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 開發服務的強大功能,透過自動配置和連接設定到應用程式所需的外部服務,使開發和測試變得更加簡單。
圖 2 – 應用程式日誌
Quarkus Dev Services 透過處理各種服務的配置和管理來簡化開發和測試階段,使開發人員能夠更加專注於實際應用程式。 Quarkus 支援廣泛的開發服務,包括:
Quarkus 開發服務代表了開發人員在開發和測試階段如何設定和整合外部服務的典範轉移。環境設定的自動化不僅加速了開發過程,還減少了配置錯誤的可能性,使團隊更容易專注於創建強大的、功能豐富的應用程式。
Quarkus 開發服務的突出優勢之一是強調開發人員的生產力。透過消除手動管理服務依賴項的需要,開發人員可以立即開始處理業務邏輯和應用程式功能。這種簡化的工作流程在微服務架構中特別有益,其中多個服務可能需要同時開發和整合
總之,採用 Quarkus 開發服務可以顯著影響您的開發團隊的效率和專案成果。 Quarkus 的簡單性和強大功能鼓勵實驗,
更快的迭代,最終加快開發週期。這種技術槓桿是現代企業在數位時代蓬勃發展所需要的。
以上是利用自動設定和與 Quarkus 開發服務的整合來實現高效開發的詳細內容。更多資訊請關注PHP中文網其他相關文章!