从单体式应用迁移到微服务

如果要从旧版单体式应用开始迁移,您必须找出可以拆分并转移到单独微服务的部分。通常,结构良好的单体应用具有非常自然的划分,并已有服务类作为数据存储层和业务逻辑层之间的接口。这些类是将客户端调用连接到微服务的理想位置。

对单体应用中的功能进行拆分

您可以通过几种方法来拆分应用:

  • 在应用中查找可以拆分的业务逻辑。
  • 查找自然隔离的代码,例如使用静态代码分析工具来识别这些部分。
  • 检查应用中那些采用独立的扩缩配置或内存设置可能为您带来益处的逻辑部分。这也许可以节省成本,从而更好地使用资源。

您可能需要重构代码以移除非自然依赖项。我们建议您先重构旧代码并将其部署到生产环境,然后再尝试将应用拆分为单独的服务。

微服务的常见领域包括:

  • 用户或账号信息
  • 授权和会话管理
  • 偏好或配置设置
  • 通知和通信服务
  • 照片和媒体,尤其是元数据
  • 任务队列工作器

迁移应用的步骤

将一组类标识为可成为微服务的候选对象后,您需要执行以下步骤:

  • 保留旧版应用中的现有代码并确保其能正常运行,以便在需要时回滚。
  • 创建新的代码库,或者在现有代码库中至少创建一个子目录。
  • 将相应类复制到新位置。
  • 编写一个视图层来提供 HTTP API 钩子,并将响应文档设置为正确的格式。
  • 将新代码组织为单独的应用(创建 app.yaml)。
  • 将新的微服务部署为服务或单独的项目。
  • 测试代码以确保其运行正常。
  • 将数据从旧版应用迁移到新的微服务。请参阅下文了解相关讨论。
  • 更改现有的旧版应用以使用新的微服务应用。
  • 部署更改后的旧版应用。
  • 确认一切都按预期工作,并且您不需要回滚到旧版应用。
  • 从旧版应用中移除所有不再需要的代码。

在运行中的应用上迁移数据

迁移运行中的应用上的数据可能很复杂,并且与您的具体情况密切相关。通常,为便于前滚和回滚,您需要编写代码以同时填充新旧 Cloud Datastore 实体(为此,可能需要在微服务上使用临时 API),然后编写代码以迁移现有数据集(例如,编写一个 MapReduce)。此过程通常涉及一些临时代码和冗余数据。根据您的具体情况,您可能还需要在发布后执行追加数据迁移。请务必小心,不要用旧数据覆盖新数据。

尽管这项工作看似繁琐,但却十分重要,也是一种常见的做法,这样可以在无法成功切换到新的微服务时,能够进行前滚和回滚。只有在确认一切都已正确迁移并且按预期运行后,才能移除临时代码并从旧存储位置中删除数据。请务必在此过程中进行备份。

后续步骤