【发布时间】:2019-12-17 08:00:07
【问题描述】:
我已经开始着手一个需要重写的项目。所以,与其做一个大爆炸式的发布 我们决定使用Strangler Pattern,这意味着以下
- 当前应用程序(下面的堆栈详细信息)将在现有域https://app.com 下按原样运行
- 现有(和新)功能将在新堆栈中重写(详情如下)并与现有应用并行部署(在同一域 https://app.com 下)
要求是
- 最终用户始终使用同一个域https://app.com
- 任何现有功能迁移到新应用或新功能都可以在同一域https://app.com 下使用
当前应用的栈和架构是
- 带有硬编码数据的 HTML 文件
- CSS 文件
- 字体文件
- 图片
- 闪存文件 除其他事项外。
您的应用程序是静态的。它没有数据库。它调用其他 3rd 方 API,但没有自己的数据库(文件和图像除外)
它位于一个目录下,并通过在专用服务器上运行 Web 服务器 (Apache) 来提供服务。
新重写的堆栈和架构将
- 使用 React 或 Gatsby
- 生成静态文件的标准构建系统
- 数据(PDF、图片)托管在其他地方
- Flash 文件(直到我们找到更好的方法)
鉴于这些要求,我想到了使用某种负载平衡器(例如 Nginx)的应用程序的 2 个版本,并使用代理提供 URL 模式。
例如
- 发往https://app.com/productPage.html 的请求转到现有应用部署(假设它未迁移)
- 来自https://app.com/profilePage 的请求会转到现有应用部署(假设已迁移)
现在,考虑到这种情况,我想问以下问题
- 这种方法看起来合理吗?有没有更好的方法来处理这种情况?
- 如何实现这样一个基于反向代理的系统(考虑 Nginx)? (或者如果有更好的方法)
我很想听听可以帮助我学习和实施的想法和任何资源/书籍/github。
提前非常感谢!
【问题讨论】:
-
您的应用中是否有任何后端,或者它完全是静态的?
-
@georg,它是完全静态的。它使用一些外部 3rd 方 API,但此应用程序不存在数据库。谢谢你的好问题!我会更新上面的细节
-
您希望何时知道您看到的图像是新应用还是旧应用? nginx 什么时候应该代理到其中一个?
-
好问题,我想我错过了这部分。图像是静态的,因此新应用会将它们复制到自己的项目文件夹中,或从 S3(或其变体)提供。我认为只要它是相同的图像(因为它会由旧应用程序提供),一切看起来都很好!我错过了什么吗?
-
假设您在 abc.html 有一个旧功能。然后你将它迁移到一个新的。我们建议您创建具有相同扩展名的代码,但将其放在不同的 url 下。就像app.com/abc.html 一样,迁移后它将是app.com/v2/abc.html。你代码中的所有链接现在都应该指向 v2。
标签: javascript html reactjs nginx architecture