您好,登錄后才能下訂單哦!
今天給大家介紹一款比較好用的數據庫版本控制工具Flyway。在通過Spring Boot構建微服務的過程中,一般情況下在拆分微服務的同時,也會按照系統功能的邊界對其依存的數據庫進行拆分。在這種情況下,微服務的數據庫版本管理對于研發工程管理來說,就會是一個比較棘手的問題。
在正常的代碼管理流程中,從產品研發研發的過程看,一般會經歷功能開發、研發測試、集成測試、預發布測試、上線等多個環節。而對于同一個產品功能,可能還會涉及對多個微服務代碼及數據庫結構的改動。
而這些改動需要我們在以上流程中每發布一個環境,都需要提前預置好數據庫結構變更的依賴。假設,我們開發完成需要發布到測試環境,那么就需要我們提前將改動的腳本在測試環境執行,測試環境完成測試后需要發布到預發布環境測試,也需要提前在預發布環境執行腳本。以往,這種過程都依賴于人工執行,如果想要保持所有環境數據庫版本的一致性,很大程度上是需要依賴于人,環境比較少還好,但如果環境比較多的話,久而久之很容易就出現大家不維護的狀態了。只有某天在某個環境進行測試時出錯了,才會猛然發現有些服務的數據庫變更腳本并沒有得到執行,從而去補缺。
那么有沒有一種比較智能的方式,在微服務啟動的時候,就可以檢測到數據庫版本的變化,從而能夠自動去執行變更的數據庫腳本,以此來保證除生產外的大部分環境的數據庫版本都可以自動一致呢?
答案是有多,市面上的方案也有一些,今天給大家介紹的是使用得比較廣泛一點的Flyway。
Flyway是一款數據庫版本控制管理工具,功能上類似Git對代碼的版本控制。Flyway支持市面上幾乎所有的常用數據庫,如Mysql、Oracle、PostgreSQL等。通過Flyway的管理,我們可以很輕松的跨多個環境管理數據庫的schema及相關業務數據變更信息。例如,開發一個新功能創建一個新表,只需要將腳本按照規范的命名格式放置在項目的指定目錄,那么應用就可以通過Flyway自動檢測當前環境的數據庫版本,從而自動幫我們完成相應環境的結構同步,而不再需要像之前那樣手動執行。
除了數據庫schema結構的變更外,數據的變更也可以通過這種方式同步,例如我們在字典表新增了一條字典數據,類似地也可以通過這種方式去管理同步數據變更記錄。
在Spring Boot項目中使用Flyway是非常方便和簡單的。首先我們需要引入Flyway的依賴及插件依賴,如下:
<!--引入flyway的依賴-->
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>5.0.3</version>
</dependency>
<!--flyway插件依賴-->
<plugin>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-maven-plugin</artifactId>
<version>5.0.3</version>
</plugin>
至此,我們就完成了Spring Boot項目對Flyway的集成,是不是很簡單呢!完成Flyway的集成后,我們的數據庫腳本需要怎么管理才能被Flyway自動識別并得到正確執行呢?
我們需要在項目在resources
中建立db/migration
文件夾,并通過V1.0__init.sql
(是__
而不是_
)類似這樣的命名方式來命名我們每次需要變更的數據庫腳本。例如我們創建了一個全新的項目,那么我們就可以把這個項目的初始化數據庫腳本放到這里,如:V1.0__init_database.sql。
這樣,如果你此時連接一個全新的數據庫,啟動Spring Boot項目Flyway就會自動去掃描db/migration
目錄下未被執行的腳本,從而幫你完成數據庫腳本的同步。隨著功能的開發,假設有一個新的數據庫變更需要執行,那么我們就需要再建立一個新的腳本文件,如:V1.1__add_dictdata.sql這樣,下次啟動項目的時候,這個腳本也就會自動執行了。關于數據腳本的命名規范除了V1.1這樣的版本號之外,后面的部分大家可以根據變更的類型起一個有意義、相對規范的名字即可。
說到這里,是不是有點疑惑,Flyway到底是怎么做才能做到對數據庫版本的管理的呢?事實上,如果我們首次集成Flyway,啟動項目后Flyway會在對應的數據庫中創建一張名為"flyway_schema_history"的表,這種表就會記錄所有腳本版本的執行情況,如:
也就是說,實際上Flyway對數據庫腳本版本的控制完全是依賴于維護了這樣一張信息表。假設有個腳本已經被成功執行過,如果我們人為的刪除這種表中的執行記錄,會怎么樣呢?答案是,Flyway會再次執行,并且因為執行過,如果腳本中有重建表的SQL,那么很可能會造成數據丟失的情況,所以使用Flyway對于這種表的維護是至關重要的,切記切記!
另外,大多數情況下,我們在使用Flyway之前,可能數據庫已經執行過了一些腳本,如果此時要重新將其管理起來,并且想達到之前執行過的腳本不再自動執行的效果的話,此時可能就需要我們手工在flyway_schema_history表中插入對應的腳本執行版本記錄,從而臨時繞開下Flyway了。
Flyway是一個比較自動化的數據庫版本控制工具,用好了會方便我們開發提高研發效率,另一方面,再好的工具也在于人怎么使用,如果沒有一套完整的操作規范,太自動的工具也可能會帶來災難,如重要的數據被重建導致丟失的情況!所以,大部分情況下Flyway對于測試及開發環境數據庫版本的維護還是很方便的,至于生產嘛,還是建議通過一套流程約定,人工執行管理比較保險!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。