1. 程式人生 > >簡化 Spring Boot 專案部署,Flyway 搞起來

簡化 Spring Boot 專案部署,Flyway 搞起來

雖然我之前錄了一個微人事(https://github.com/lenve/vhr)部署視訊(新版微人事部署教程來啦),但是由於這次升級涉及到了 Redis 和 RabbitMQ,所以在本地跑微人事還是一件比較麻煩的事情,有的小夥伴甚至部署失敗,所以我也一直在嘗試簡化部署步驟,這兩天給專案加了 Flyway,資料庫準備這塊算是得到了一定程度簡化。

今天就和大家來大致說說 Flyway 的用法,以及如何在微人事中使用 Flyway。

1.什麼是 Flyway

我們在公司做開發時,由於專案需求的變化,或者前期設計缺陷,導致在後期需要修改資料庫,這應該是一個比較常見的事情,如果專案還沒上線,你可能把表刪除了重新建立,但是如果專案已經上線了,就不能這樣簡單粗暴了,我們需要通過 SQL 指令碼在已有資料表的基礎上進行升級。

目前 Java 這塊,想要對資料庫的版本進行管理主要有兩個工具:

  • Flyway
  • Liquibase

兩個工具各有千秋,但是核心功能都是資料庫的版本管理,這裡主要來看 Flyway。就像我們使用 Git 來管理程式碼版本一樣,Flyway 可以用來管理資料庫版本。

好了,接下來我們就來看看用 Flyway 如何簡化微人事部署,然後再來說說 Flyway 的一個大致原理。

2.嵌入到微人事

如果是在一個全新的專案中使用 Flyway,那麼在新建一個 Spring Boot 專案時,就有 Flyway 的選項,如下圖:


專案建立成功後,resources 目錄下也會多出來一個 db/migration 目錄,這個目錄用來存放資料庫指令碼,如下:

注意

這個如果建立專案時就選擇了 Flyway 依賴,就會有這個目錄。現在我要在已經做好的微人事中加入 Flyway,這個目錄就需要我手動建立了。

首先在微人事中新增 flyway 依賴:

<dependency>
    <groupId>org.flywaydb</groupId>
    <artifactId>flyway-core</artifactId>
</dependency>

然後在 vhr-web 模組下的 resources 目錄下,手動建立 db/migration 目錄,然後在該目錄下建立資料庫指令碼,資料庫指令碼的命名方式如下:

  • V<VERSION>__<NAME>.sql

首先是大寫字母 V,然後是版本號,要是有小版本可以用下劃線隔開,例如 2_1,版本號後面是兩個下劃線,然後是指令碼名稱,檔案字尾是 .sql。

例如我這裡建立我的第一個資料庫指令碼,取名為 V1__vhr.sql,指令碼內容就是微人事的資料庫指令碼,大家可以在 https://github.com/lenve/vhr 這裡獲取到。

完了之後,可以不用新增額外配置,大家只需要在本地 MySQL 中建立一個空的 vhr 資料庫即可,然後直接啟動微人事專案,專案啟動成功後,我們檢視啟動日誌:

從這段啟動日誌中,我們可以看到 Flyway 的執行資訊,資料庫指令碼的執行執行,同時這裡還說了,Flyway 還給建立了一個 flyway_schema_history 表,這個表用來記錄資料庫的更新歷史。

這個時候,開啟本地資料庫,我們發現 vhr 庫中該有的表都有了。同時還發現了 flyway_schema_history 表,如下:

有了這條記錄,下次再啟動 vhr 專案,V1__vhr.sql 這個指令碼檔案就不會執行了,因為系統知道這個指令碼已經執行過了,如果你還想讓 V1__vhr.sql 指令碼再執行一遍,需要手動刪除 flyway_schema_history 表中的對應記錄,那麼專案啟動時,這個指令碼就會被執行了。

3.執行細節

  • 我們在定義指令碼的時候,除了 V 字開頭的指令碼之外,還有一種 R 字開頭的指令碼,V 字開頭的指令碼只會執行一次,而 R 字開頭的指令碼,只要指令碼內容發生了變化,啟動時候就會執行。
  • 使用了 Flyway 之後,如果再想進行資料庫版本升級,就不用該以前的資料庫指令碼了,直接建立新的資料庫指令碼,專案在啟動時檢測了有新的更高版本的指令碼,就會自動執行,這樣,在和其他同事配合工作時,也會方便很多。因為正常我們都是從 Git 上拉程式碼下來,不拉資料庫指令碼,這樣要是有人更新了資料庫,其他同事不一定能夠收到最新的通知,使用了 Flyway 就可以有效避免這個問題了。
  • 所有的指令碼,一旦執行了,就會在 flyway_schema_history 表中有記錄,如果你不小心搞錯了,可以手動從 flyway_schema_history 表中刪除記錄,然後修改 SQL 指令碼後再重新啟動(生產環境不建議)。

4.其他配置

在 Spring Boot 中,關於 Flyway 也有不少配置,這些配置都在 application.properties 中進行配置,常用的幾個來和大家說下:

  • spring.flyway.enabled:是否開啟 flyway,預設就是開啟的
  • spring.flyway.encoding:flyway 字元編碼
  • spring.flyway.locations:sql 指令碼的目錄,預設是 classpath:db/migration,如果有多個,用 , 隔開
  • spring.flyway.clean-disabled:這個屬性非常關鍵,它表示是否要清除已有庫下的表,如果執行的指令碼是 V1__xxx.sql,那麼會先清除已有庫下的表,然後再執行指令碼,這在開發環境下還挺方便,但是在生產環境下就要命了,而且它預設就是要清除,生產環境一定要自己配置設定為 true。
  • spring.flyway.table:配置資料庫資訊表的名稱,預設是 flyway_schema_history。

好了,關於 Flyway 我就先說這麼多,程式碼也已經更新到 vhr (https://github.com/lenve/vhr)上了,感興趣的小夥伴不妨下載試一下