溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Spring Boot集成Flyway實(shí)現(xiàn)數(shù)據(jù)庫(kù)版本控制?

發(fā)布時(shí)間:2020-07-07 09:43:19 來(lái)源:網(wǎng)絡(luò) 閱讀:351 作者:wx5d9ed7c8443c3 欄目:編程語(yǔ)言

Spring Boot集成Flyway實(shí)現(xiàn)數(shù)據(jù)庫(kù)版本控制?

今天給大家介紹一款比較好用的數(shù)據(jù)庫(kù)版本控制工具Flyway。在通過(guò)Spring Boot構(gòu)建微服務(wù)的過(guò)程中,一般情況下在拆分微服務(wù)的同時(shí),也會(huì)按照系統(tǒng)功能的邊界對(duì)其依存的數(shù)據(jù)庫(kù)進(jìn)行拆分。在這種情況下,微服務(wù)的數(shù)據(jù)庫(kù)版本管理對(duì)于研發(fā)工程管理來(lái)說(shuō),就會(huì)是一個(gè)比較棘手的問(wèn)題。

在正常的代碼管理流程中,從產(chǎn)品研發(fā)研發(fā)的過(guò)程看,一般會(huì)經(jīng)歷功能開(kāi)發(fā)、研發(fā)測(cè)試、集成測(cè)試、預(yù)發(fā)布測(cè)試、上線(xiàn)等多個(gè)環(huán)節(jié)。而對(duì)于同一個(gè)產(chǎn)品功能,可能還會(huì)涉及對(duì)多個(gè)微服務(wù)代碼及數(shù)據(jù)庫(kù)結(jié)構(gòu)的改動(dòng)。

而這些改動(dòng)需要我們?cè)谝陨狭鞒讨忻堪l(fā)布一個(gè)環(huán)境,都需要提前預(yù)置好數(shù)據(jù)庫(kù)結(jié)構(gòu)變更的依賴(lài)。假設(shè),我們開(kāi)發(fā)完成需要發(fā)布到測(cè)試環(huán)境,那么就需要我們提前將改動(dòng)的腳本在測(cè)試環(huán)境執(zhí)行,測(cè)試環(huán)境完成測(cè)試后需要發(fā)布到預(yù)發(fā)布環(huán)境測(cè)試,也需要提前在預(yù)發(fā)布環(huán)境執(zhí)行腳本。以往,這種過(guò)程都依賴(lài)于人工執(zhí)行,如果想要保持所有環(huán)境數(shù)據(jù)庫(kù)版本的一致性,很大程度上是需要依賴(lài)于人,環(huán)境比較少還好,但如果環(huán)境比較多的話(huà),久而久之很容易就出現(xiàn)大家不維護(hù)的狀態(tài)了。只有某天在某個(gè)環(huán)境進(jìn)行測(cè)試時(shí)出錯(cuò)了,才會(huì)猛然發(fā)現(xiàn)有些服務(wù)的數(shù)據(jù)庫(kù)變更腳本并沒(méi)有得到執(zhí)行,從而去補(bǔ)缺。

那么有沒(méi)有一種比較智能的方式,在微服務(wù)啟動(dòng)的時(shí)候,就可以檢測(cè)到數(shù)據(jù)庫(kù)版本的變化,從而能夠自動(dòng)去執(zhí)行變更的數(shù)據(jù)庫(kù)腳本,以此來(lái)保證除生產(chǎn)外的大部分環(huán)境的數(shù)據(jù)庫(kù)版本都可以自動(dòng)一致呢?

答案是有多,市面上的方案也有一些,今天給大家介紹的是使用得比較廣泛一點(diǎn)的Flyway。

Flyway概述

Flyway是一款數(shù)據(jù)庫(kù)版本控制管理工具,功能上類(lèi)似Git對(duì)代碼的版本控制。Flyway支持市面上幾乎所有的常用數(shù)據(jù)庫(kù),如Mysql、Oracle、PostgreSQL等。通過(guò)Flyway的管理,我們可以很輕松的跨多個(gè)環(huán)境管理數(shù)據(jù)庫(kù)的schema及相關(guān)業(yè)務(wù)數(shù)據(jù)變更信息。例如,開(kāi)發(fā)一個(gè)新功能創(chuàng)建一個(gè)新表,只需要將腳本按照規(guī)范的命名格式放置在項(xiàng)目的指定目錄,那么應(yīng)用就可以通過(guò)Flyway自動(dòng)檢測(cè)當(dāng)前環(huán)境的數(shù)據(jù)庫(kù)版本,從而自動(dòng)幫我們完成相應(yīng)環(huán)境的結(jié)構(gòu)同步,而不再需要像之前那樣手動(dòng)執(zhí)行。

除了數(shù)據(jù)庫(kù)schema結(jié)構(gòu)的變更外,數(shù)據(jù)的變更也可以通過(guò)這種方式同步,例如我們?cè)谧值浔硇略隽艘粭l字典數(shù)據(jù),類(lèi)似地也可以通過(guò)這種方式去管理同步數(shù)據(jù)變更記錄。

Spring Boot集成Flyway

在Spring Boot項(xiàng)目中使用Flyway是非常方便和簡(jiǎn)單的。首先我們需要引入Flyway的依賴(lài)及插件依賴(lài),如下:

<!--引入flyway的依賴(lài)-->
<dependency>
    <groupId>org.flywaydb</groupId>
    <artifactId>flyway-core</artifactId>
    <version>5.0.3</version>
</dependency>
 <!--flyway插件依賴(lài)-->
 <plugin>
     <groupId>org.flywaydb</groupId>
     <artifactId>flyway-maven-plugin</artifactId>
     <version>5.0.3</version>
 </plugin>

至此,我們就完成了Spring Boot項(xiàng)目對(duì)Flyway的集成,是不是很簡(jiǎn)單呢!完成Flyway的集成后,我們的數(shù)據(jù)庫(kù)腳本需要怎么管理才能被Flyway自動(dòng)識(shí)別并得到正確執(zhí)行呢?

我們需要在項(xiàng)目在resources中建立db/migration文件夾,并通過(guò)V1.0__init.sql(是__而不是_)類(lèi)似這樣的命名方式來(lái)命名我們每次需要變更的數(shù)據(jù)庫(kù)腳本。例如我們創(chuàng)建了一個(gè)全新的項(xiàng)目,那么我們就可以把這個(gè)項(xiàng)目的初始化數(shù)據(jù)庫(kù)腳本放到這里,如:V1.0__init_database.sql。

這樣,如果你此時(shí)連接一個(gè)全新的數(shù)據(jù)庫(kù),啟動(dòng)Spring Boot項(xiàng)目Flyway就會(huì)自動(dòng)去掃描db/migration目錄下未被執(zhí)行的腳本,從而幫你完成數(shù)據(jù)庫(kù)腳本的同步。隨著功能的開(kāi)發(fā),假設(shè)有一個(gè)新的數(shù)據(jù)庫(kù)變更需要執(zhí)行,那么我們就需要再建立一個(gè)新的腳本文件,如:V1.1__add_dictdata.sql這樣,下次啟動(dòng)項(xiàng)目的時(shí)候,這個(gè)腳本也就會(huì)自動(dòng)執(zhí)行了。關(guān)于數(shù)據(jù)腳本的命名規(guī)范除了V1.1這樣的版本號(hào)之外,后面的部分大家可以根據(jù)變更的類(lèi)型起一個(gè)有意義、相對(duì)規(guī)范的名字即可。

說(shuō)到這里,是不是有點(diǎn)疑惑,F(xiàn)lyway到底是怎么做才能做到對(duì)數(shù)據(jù)庫(kù)版本的管理的呢?事實(shí)上,如果我們首次集成Flyway,啟動(dòng)項(xiàng)目后Flyway會(huì)在對(duì)應(yīng)的數(shù)據(jù)庫(kù)中創(chuàng)建一張名為"flyway_schema_history"的表,這種表就會(huì)記錄所有腳本版本的執(zhí)行情況,如:

Spring Boot集成Flyway實(shí)現(xiàn)數(shù)據(jù)庫(kù)版本控制?

也就是說(shuō),實(shí)際上Flyway對(duì)數(shù)據(jù)庫(kù)腳本版本的控制完全是依賴(lài)于維護(hù)了這樣一張信息表。假設(shè)有個(gè)腳本已經(jīng)被成功執(zhí)行過(guò),如果我們?nèi)藶榈膭h除這種表中的執(zhí)行記錄,會(huì)怎么樣呢?答案是,F(xiàn)lyway會(huì)再次執(zhí)行,并且因?yàn)閳?zhí)行過(guò),如果腳本中有重建表的SQL,那么很可能會(huì)造成數(shù)據(jù)丟失的情況,所以使用Flyway對(duì)于這種表的維護(hù)是至關(guān)重要的,切記切記!

另外,大多數(shù)情況下,我們?cè)谑褂肍lyway之前,可能數(shù)據(jù)庫(kù)已經(jīng)執(zhí)行過(guò)了一些腳本,如果此時(shí)要重新將其管理起來(lái),并且想達(dá)到之前執(zhí)行過(guò)的腳本不再自動(dòng)執(zhí)行的效果的話(huà),此時(shí)可能就需要我們手工在flyway_schema_history表中插入對(duì)應(yīng)的腳本執(zhí)行版本記錄,從而臨時(shí)繞開(kāi)下Flyway了。

后記

Flyway是一個(gè)比較自動(dòng)化的數(shù)據(jù)庫(kù)版本控制工具,用好了會(huì)方便我們開(kāi)發(fā)提高研發(fā)效率,另一方面,再好的工具也在于人怎么使用,如果沒(méi)有一套完整的操作規(guī)范,太自動(dòng)的工具也可能會(huì)帶來(lái)災(zāi)難,如重要的數(shù)據(jù)被重建導(dǎo)致丟失的情況!所以,大部分情況下Flyway對(duì)于測(cè)試及開(kāi)發(fā)環(huán)境數(shù)據(jù)庫(kù)版本的維護(hù)還是很方便的,至于生產(chǎn)嘛,還是建議通過(guò)一套流程約定,人工執(zhí)行管理比較保險(xiǎn)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI