【SpringBoot系列】微服务集成Flyway

本文涉及的产品
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
云原生数据库 PolarDB MySQL 版,通用型 2核8GB 50GB
简介: 【4月更文挑战第7天】SpringBoot微服务集成Flyway

[toc]


前言

我们在日常工作中通常遇到的大多数服务只是从用户那里获取一些输入并填充数据库,并从数据库中读取并在 UI 上显示。每个数据库都有一个Schema,我们会在需求发生变化时进行迭代过程,以修改我们的Schema。现在,所有这些迁移都可以单独驻留在应用程序中,并且可以由数据库团队处理,我们可以以版本控制的方式将此迁移脚本与应用程序一起保留,并在应用程序启动时应用它们,这就是flyway为我们所做的。

Flyway (https://flywaydb.org/documentation/) 是一个开源数据库迁移工具,用于迁移数据库Schema,它可以独立使用,并且与Spring启动有很好的集成。Liquibase 在数据库迁移的另一个选项中,大多数时候我们会看到这两个选项中的一个被用于生产服务,Flyway 支持很多的数据库,具体情况请查看文档以获取更多详细信息。

一、Flyway

Flyway 偏向于简单和约定俗成,而不是配置。

  • 每个迁移脚本文件的格式为 V.sql
  • 如果我们想撤消迁移,我们可以将该脚本放在文件名 U__.sql
  • Flyway 还存储文件的校验和,一旦应用了文件,就无法更改内容。
  • 它在名为 flyway_schema_history 的表中跟踪迁移历史记录

二、Spring Boot + Flyway

为了展示带有flyway的spring boot 案例,我将使用我们上一次创建的服务。我们的目的是开始创建一个schema,并且使用Flyway。为了将flyway与spring boot集成,我们首先将以下依赖项添加到我们的服务中:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>org.flywaydb</groupId>
    <artifactId>flyway-core</artifactId>
</dependency>
<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
</dependency>

我们首先添加spring-boot-starter-data-jpa,这为我们的应用程序提供了jpa和hibernate 功能。当我们在这里使用 postgresql 时,我们需要添加 postgresql 驱动程序依赖项。最后我们需要添加flyway核心依赖性。

Flyway 使用 spring 数据源配置来查找数据库,将数据库的详细信息添加到我们的应用程序中。这里,我创建了一个名为 inventory 的数据库和一个名为 inventory_rw 的 R/W 用户,我们的应用程序配置如下所示:

spring:
  datasource:
    url: jdbc:postgresql://localhost:5432/inventory
    username: inventory_rw
    password: '*****'

到目前为止,flyway知道要连接哪个数据库与哪些凭据,现在我们需要提供迁移脚本,我们将第一个迁移脚本命名为 V1__init.sql,如下所示 :

CREATE SCHEMA IF NOT EXISTS inv;

SET search_path TO inv,public;

CREATE TABLE IF NOT EXISTS products(
 id UUID PRIMARY KEY,
 product_name  VARCHAR(255) NOT NULL,
 stock NUMERIC NOT NULL default 0,
 manufacturer VARCHAR(255) NOT NULL
);

现在,运行应用程序,我们看到一些日志如下:

uccessfully applied 1 migration to schema "public", now at version v1 (execution time 00:00.046s)

如果我们连接到我们的数据库,我们会看到以下内容:
image.png

查看公共Schema,flyway_schema_history 表也已创建:
image.png

表现在的样子为:
image.png

现在,让我们尝试更改迁移脚本,我们得到以下例外:

Caused by: org.flywaydb.core.api.exception.FlywayValidateException: Validate failed: Migrations have failed validation
Migration checksum mismatch for migration version 1
-> Applied to database : 2071614183
-> Resolved locally    : 387884339. Either revert the changes to the migration, or run repair to update the schema history.

因此,一旦默认应用了您的架构,我们就无法更改脚本。但是,我们可以通过spring.flyway.validate-on-migrate=false禁用此检查。让我们在表格中添加一列。我们需要添加一个版本号大于上一个版本的新迁移脚本。让我们创建一个新的文件名V2_created_on_column.sql并添加以下脚本:

ALTER TABLE products ADD COLUMN created_on TIMESTAMP NOT NULL ;

日志如下:

Current version of schema "public": 1
 Migrating schema "public" to version "2 - created on"
 Successfully applied 1 migration to schema "public", now at version v2 (execution time 00:00.051s)

查看表视图:
image.png

三、已有数据库+Flyway

如果我们已经有一个不是使用 flyway 创建的数据库,并且公共模式中已经有其他表,我们将在下面看到例外。

Found non-empty schema(s) "public" but no schema history table. Use baseline() or set baselineOnMigrate to true to initialize the schema history table.

Flyway 拒绝在没有历史记录模式的非空数据库上迁移,为了解决这个问题,我们需要为Flyway提供一个基线。基线是一种告诉 flway 不关心此版本之前发生了什么,基于当前版本进行任何更改的方法。使用 spring config,我们可以向应用程序添加 below 属性来实现这一功能:

spring:
  flyway:
    baseline-on-migrate: true
    baseline-version: '0'

现在,这里有一个小问题:如果您不提供要作为基线的版本,则提供的默认值为 1。在这里我提供了一个自定义值 0,以便应用我的脚本(如 V1 及以后)。schema历史记录表将如下所示:
image.png

现在,我们的架构历史记录表中有一个名为<>的新条目。

四、自定义用户

到目前为止,在我们的配置中,flyway 正在使用 spring 数据源中提供的用户。我们可以为flyway提供不同的用户,以下配置使用单独的 R/W 用户进行迁移:

spring:
  datasource:
    url: jdbc:postgresql://localhost:5432/inventory
    username: inventory_ro
    password: '******'
  flyway:
    baseline-on-migrate: true
    baseline-version: '0'
    user: inventory_rw
    password: '******'

Spring Boot 的 Flyway 集成有很多属性需要配置,例如我们可以定义自定义模式,flyway_schema_history将在哪里创建表、挑选迁移脚本、默认模式名称等。可以在 https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html 找到这些属性的列表。

小节

这就是这篇文章的内容,我们已经知道如何迭代数据库并使用 flyway 应用迁移。在下一篇文章中,我将展示如何将数据库与 Spring Boot 应用程序集成。

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
4月前
|
安全 Java Apache
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 身份和权限认证
本文介绍了 Apache Shiro 的身份认证与权限认证机制。在身份认证部分,分析了 Shiro 的认证流程,包括应用程序调用 `Subject.login(token)` 方法、SecurityManager 接管认证以及通过 Realm 进行具体的安全验证。权限认证部分阐述了权限(permission)、角色(role)和用户(user)三者的关系,其中用户可拥有多个角色,角色则对应不同的权限组合,例如普通用户仅能查看或添加信息,而管理员可执行所有操作。
149 0
|
4月前
|
安全 Java 数据安全/隐私保护
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 三大核心组件
本课程介绍如何在Spring Boot中集成Shiro框架,主要讲解Shiro的认证与授权功能。Shiro是一个简单易用的Java安全框架,用于认证、授权、加密和会话管理等。其核心组件包括Subject(认证主体)、SecurityManager(安全管理员)和Realm(域)。Subject负责身份认证,包含Principals(身份)和Credentials(凭证);SecurityManager是架构核心,协调内部组件运作;Realm则是连接Shiro与应用数据的桥梁,用于访问用户账户及权限信息。通过学习,您将掌握Shiro的基本原理及其在项目中的应用。
150 0
|
1月前
|
前端开发
SpringBoot2.3.1集成Knife4j接口文档
SpringBoot2.3.1集成Knife4j接口文档
132 44
|
2月前
|
Java 数据库连接 微服务
若依微服务的Mybatis-plus集成过程:一份详细的入门教程。
以上就是Spring Boot项目中集成MyBatis Plus的详细步骤。集成成功后,你就可以使用Mybatis-plus提供的强大功能,让你的增删改查操作更为简单。以上步骤简单易懂,非常适合初学者使用。希望对您有所帮助。
221 20
|
1月前
|
缓存 安全 Java
Shiro简介及SpringBoot集成Shiro(狂神说视频简易版)
Shiro简介及SpringBoot集成Shiro(狂神说视频简易版)
91 6
|
2月前
|
缓存 Java 数据库
SpringBoot集成Ehcache缓存使用指南
以上是SpringBoot集成Ehcache缓存的基本操作指南,帮助你在实际项目中轻松实现缓存功能。当然,Ehcache还有诸多高级特性,通过学习和实践,你可以更好地发挥它的威力。
123 20
|
3月前
|
Java 开发工具 Spring
【Azure Application Insights】为Spring Boot应用集成Application Insight SDK
本文以Java Spring Boot项目为例,详细说明如何集成Azure Application Insights SDK以收集和展示日志。内容包括三步配置:1) 在`pom.xml`中添加依赖项`applicationinsights-runtime-attach`和`applicationinsights-core`;2) 在main函数中调用`ApplicationInsights.attach()`;3) 配置`applicationinsights.json`文件。同时提供问题排查建议及自定义日志方法示例,帮助用户顺利集成并使用Application Insights服务。
|
4月前
|
消息中间件 Java 微服务
微服务——SpringBoot使用归纳——Spring Boot中集成ActiveMQ——发布/订阅消息的生产和消费
本文详细讲解了Spring Boot中ActiveMQ的发布/订阅消息机制,包括消息生产和消费的具体实现方式。生产端通过`sendMessage`方法发送订阅消息,消费端则需配置`application.yml`或自定义工厂以支持topic消息监听。为解决点对点与发布/订阅消息兼容问题,可通过设置`containerFactory`实现两者共存。最后,文章还提供了测试方法及总结,帮助读者掌握ActiveMQ在异步消息处理中的应用。
136 0
|
2月前
|
JavaScript 前端开发 Java
制造业ERP源码,工厂ERP管理系统,前端框架:Vue,后端框架:SpringBoot
这是一套基于SpringBoot+Vue技术栈开发的ERP企业管理系统,采用Java语言与vscode工具。系统涵盖采购/销售、出入库、生产、品质管理等功能,整合客户与供应商数据,支持在线协同和业务全流程管控。同时提供主数据管理、权限控制、工作流审批、报表自定义及打印、在线报表开发和自定义表单功能,助力企业实现高效自动化管理,并通过UniAPP实现移动端支持,满足多场景应用需求。
225 1
|
3月前
|
前端开发 Java 关系型数据库
基于Java+Springboot+Vue开发的鲜花商城管理系统源码+运行
基于Java+Springboot+Vue开发的鲜花商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的鲜花商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。技术学习共同进步
258 7