【问题标题】:Flyway migration with single schema and multiple projects单一模式和多个项目的 Flyway 迁移
【发布时间】:2017-08-14 15:06:28
【问题描述】:

我有一个与 Flyway DB 迁移相关的问题。如何通常管理处理相同数据库模式的多个项目(微服务)。每个项目中的 Flyway 迁移脚本如果被其他项目修改,则不允许启动。他们是否有任何文档或最佳实践?

【问题讨论】:

  • 理想情况下,每个微服务都应该管理自己的数据并拥有单独的数据库架构。在服务之间共享数据库架构是一种不好的做法,并且违反了微服务架构的规则。
  • 虽然您的观点是有效的,即数据库模式应该由单个模块管理(包括迁移),但它可以由多个模块共享。具有共享数据库的微服务架构并不是什么新鲜事物,我相信它是在数千个用例中广泛使用的架构。

标签: flyway


【解决方案1】:

对于它的价值,这就是我们所做的。由于模式由多个项目共享,我们将模式由单个项目管理,该项目的任务是维护所述模式。集中模式创建和维护还有其他好处,因为我们有单一的变化点。我们不需要扫描多个项目的变化。

老实说,我认为这是最好的解决方案。我不相信 flyway 具有项目间模式依赖管理。

【讨论】:

  • 这个单独的项目是否只包含 Flyway 配置和迁移文件,或者您是否也将所有应用程序 SQL 语句(普通的 SELECTs 等)移动到了这个中心项目?
  • 为了回答 Anders Thorbeck 的问题,我们只移动了 flyway 配置和迁移文件,而不是 SQL。我们产品的 SQL/JPQL 语句保存在 J2EE 实体 Bean 中,以确保其价值。
【解决方案2】:

我们正在这样做。我们有一个管理模式创建/管理的中心项目,其他项目通过他们自己的 flyway 版本控制来处理他们自己的功能创建。这是通过更改那些其他项目检查其架构版本的表的名称,并在迁移到true 时设置基线来完成的。我们正在使用 spring/flyway-db 配置,所以除了第一个项目之外,这只是将以下内容添加到每个项目的 application.properties 中。

flyway.baselineOnMigrate=true
flyway.table=schema_version_*<some_other_identifier>*

我知道您的问题没有明确指定弹簧配置,但我相信无论您如何使用 flyway,都可以配置它。我想发布一个答案,因为当我自己在谷歌上搜索这个问题时,你的 SO 问题是最好的结果,我认为我的答案可能会对某人有所帮助。

【讨论】:

    【解决方案3】:

    我遇到了同样的问题,因为我正在使用 2-3 个微服务,所以我所做的如下 例如,按以下顺序运行

    micro-service-1 ( which required migration )
    micro-service-2
    micro-service-3 ( which required migration )
    

    所以我在 micro-service-1 中创建了 flyway migration v1__description.sql,然后在 micro-service-3 中创建了 v1_2__description.sql,因为它在运行项目的序列中排在第三位,这是我的发布版本 1,它们是使用版本 1 和 1.2 进行 2 次迁移

    micro-service-1 ( V1_description.sql )
    micro-service-2 // if in future it reuires migration then we can use, V<<currentVersion>>_1__description.sql
    micro-service-3 ( V1_2_description.sql )
    

    【讨论】:

      【解决方案4】:

      对于微服务架构(或两个不同的项目),

      如果需要将两个不同的微服务连接到数据库,那么我们需要制作两个不同的模式,因为根据微服务架构,两个不同的微服务连接到不同的模式(不同的数据库)。

      喜欢,

      • 微服务 1 --> 架构 1
      • 微服务 2 --> 模式 2

      由于这个 flywayDB 在每个模式上维护每个微服务 flywayDB 迁移历史,因此由于这种情况 flyway DB 工作

      【讨论】:

        【解决方案5】:

        如果有人使用 Play 框架,这个问题可以通过每个微服务的独立飞行历史表来解决,这意味着每个微服务都有自己的飞行历史表,名称根据服务而定。这将为每个服务创建飞行路线表 在 conf 文件中添加这些属性以更改 flyway 表名称。

        db.default.migration.table=microservice1    for 1 mircoservice
        db.default.migration.table=microservice2    for 2 mircoservice
        

        在每个微服务配置文件中添加这个属性 这仅用于播放框架

        【讨论】:

          猜你喜欢
          • 2018-09-20
          • 2021-12-18
          • 2015-02-17
          • 2021-05-04
          • 2020-06-11
          • 2015-05-04
          • 2016-09-08
          • 2012-12-20
          • 2013-03-06
          相关资源
          最近更新 更多