Spring Data 2020.0 - Spring Data Neo4j 6.0 的新功能與亮點

工程 | Christoph Strobl | 2020 年 11 月 20 日 | ...

Spring Data Neo4j 是一個 Spring Data 社群專案,由 Neo4j, Inc. 維護和開發。我們很高興代表 Neo4j 團隊分享他們對於 2020.0.0 發佈版本中近期變更和新功能的見解。

使用 Spring Boot 2.3 的 Neo4j 使用者需要特別注意,因為 Spring Data Neo4j 6.0 的設定基礎架構已發生不相容的變更。

也就是說,不僅設定基礎架構已變更,整個專案也已變更。

該模組有一些歷史,並且經歷了幾個重大變更。大約四年來,它遵循 Spring Data JPA 的原則:使用 Spring Data 作為一個薄層來協調底層的物件對映器。

對於 Neo4j 來說,該對映器稱為 Neo4j-OGM。雖然 Neo4j-OGM 非常靈活,但它也有代價。它不僅像任何物件對映器一樣抽象化我們的查詢語言,而且還抽象化傳輸。它可用於啟動嵌入式的 Neo4j,使用 HTTP 或我們自己的 Bolt 協定。最後但並非最不重要的是,它在客戶端重新建立圖形的許多抽象概念。也就是說,它在對映期間建立一個本機圖形模型,並透過從該模型迭代來建立物件,而不是以記錄導向的方式工作。

有了這麼多的抽象概念,許多事情變得越來越困難

  • 以一種方式支援反應式程式設計範例,使其不僅僅是一個頂部的偽反應式層

  • 支援不可變的物件

  • 提供可組合的堆疊

  • 使使用 Cypher 和自訂查詢變得容易 - 無論是否進行對映

新的 Spring Data Neo4j 6.0 主要版本解決了所有這些問題。

我們大約在 2019 年 3 月開始了這項工作,很大程度上受到了 Spring Data 團隊圍繞 Spring Data JDBC 所做的出色工作的啟發。SDN 6 最初是一個名為 SDN/RX 的副專案。透過 SDN/RX,我們收集了來自客戶和早期採用者的意見回饋,其中包括 JHipster 使用者。

最終,它變成了 SDN 6,我們在 Spring One 2020 期間宣布了它

投影片:https://speakerdeck.com/michaelsimons/spring-up-your-graph

對您有什麼好處

  • 完全支援反應式程式設計,從對映層到資料庫(需要 Neo4j)。

  • 與各種 Neo4j Java Driver 版本相容:從 4.0 到 4.2 和未來版本,因此支援 Neo4j 3.5 到 4.2(尚未發佈)。

  • 符合 Spring Framework 和 Spring Data 的 JDK 8 基準,但它在 JDK 15 中也運行良好,包括使用 Records-preview 作為領域類別。

  • 說到記錄,對映是面向記錄的,因此可以完全不可變地檢索管道式和對映的資料。這適用於 Kotlin-Data 類別、Java 15 記錄,當然也適用於帶有 withers 的 "data" 類別,無論是手動建立還是透過 Lombok。

  • Spring Data Neo4j 首次支援基於 findByExample 的方法。

  • 推出我們新的 https://github.com/neo4j-contrib/cypher-dsl。我們在內部使用它,但您也可以使用它來建立自訂查詢。

  • 支援實驗性的 Spring Native 專案、Spring Data Neo4j。Cypher-DSL 和 Neo4j Java 驅動程式與 GraalVM 的原生映像完全相容。

  • Neo4j 範本的回歸。

  • 定義良好的多個抽象層次

    • SDN 6 不再負責建立資料庫連線。它也不能負責啟動嵌入式執行個體。相反,您需要提供驅動程式(或讓 Spring Boot 為您處理)。

    • 隨心所欲地使用驅動程式。以您需要的方式管理您的交易。

    • SDN 6 為您提供了一個驅動程式上的薄型用戶端。我們希望該用戶端有一些不錯且可用的鉤子用於您自己的對映。至少我們對它感到滿意,並在幕後使用它。該用戶端已與 Spring 的交易管理器整合。

    • Neo4j 範本位於用戶端的頂部。它了解您的領域模型。

    • 範本由儲存庫抽象使用。

我們非常重視的一點是:支援 Neo4j 是嵌入式的。雖然 Neo4j-OGM 不僅可以啟動嵌入式執行個體,還可以直接使用 Graphdatabase API,但我們完全不建議這種方法。從物件對映層啟動任何資料庫都會開啟一個充滿問題的世界。這始於資料庫帶入應用程式的大量依賴性,並繼續同步同一服務的多個執行個體,並可能以關閉時序問題結束,尤其是在 Kubernetes 上運作時,Kubernetes 傾向於快速終止事物。

如果您意識到這些缺點,您仍然可以啟動嵌入式 Neo4j。這裡有一個可以轉換為 Spring bean 的範例。

然後,SDN 6 可以使用此嵌入式執行個體。您可以開啟與它的本機 Bolt 連線。

Spring Boot 的基礎架構具有以下變更

  • 頂層有新的屬性:現在使用 spring.neo4j.* 來設定資料庫連線。

  • spring.data.neo4j.* 具有新的屬性來設定正在使用的資料庫名稱。

  • 更好的健康狀況和(希望很快)出色的 Micrometer 指標支援。

  • @DataNeo4jTest 不再啟動嵌入式執行個體。

關於最後一點,我們建議使用 Testcontainers Neo4j 或手動建立和管理嵌入式執行個體。

您需要做什麼?註解已變更,我們在 文件中提供了一個專用頁面,用於描述 OGM 的哪個註解已由 Spring Data Neo4j 註解取代。對映有點主觀,您可能需要在幾個地方重新設計您的領域模型。

我們認為我們設法為未來幾年奠定了穩定的框架基礎,我們期待您的意見回饋。

我們感謝 Spring Data 團隊的負責人 Mark Paluch。Mark 對於我們提出的所有關於 Spring Data commons 內部運作的問題都非常有耐心,並且樂於接受任何討論。

此外,還要感謝 Project Reactor 的 Sergei Egorov:Sergei 不僅是 Java 生態系統中最友善的人之一,而且還是所有反應式事物的熱門來源。

當然,還要感謝 Stéphane Nicoll,他在過去兩年中與我們合作,以多種方式改進了 Spring Boot 中的 Neo4j 支援:透過挑戰我們的想法、完善我們的程式碼,並引導整合現在更加乾淨,並且有望對我們的共同用戶群更具吸引力。

Michael Simons,代表 Spring Data Neo4j 團隊。

取得 Spring 電子報

與 Spring 電子報保持聯繫

訂閱

領先一步

VMware 提供培訓和認證,以加速您的進度。

了解更多

取得支援

Tanzu Spring 在一個簡單的訂閱中提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位檔案。

了解更多

即將舉行的活動

查看 Spring 社群中所有即將舉行的活動。

檢視全部