如何利用 CDN 进一步的前后端分离

最近在优化一下项目,梳理整个链路之后,开始逐步优化,发现了很多可以改进的点。下面是对开发模式、部署方式的一些思考,希望对你有所启发。

1. 开发背景

1.1 部署方式

如上图,简单描述一下应用的架构。采用的是经典三层架构,接入层,逻辑层,存储层。其中,接入层和存储层,是全部应用共用的服务。逻辑层由 K8S 部署,每个应用会有多个实例。接入层能支持的并发量很大,由一个 LVS 将流量分给 多个 Nginx 实例。逻辑层主要是将代码以 Slug 的形式打包到基础镜像,然后进行多实例部署。为了保证数据一致性,逻辑层不会保存任何状态,状态全部需要通过外部服务的形式管理。存储层提供各种状态服务,比如 MySQL、对象存储等。

1. 2 开发模式

如上图,简单讲一下目前的开发模式。我们采用的是前后端分离的开发模式。后端采用的 Django,前端 Webpack + Vuejs。前后端的交互通过 index.html 和接口进行。开发者服务分为两部分:CI,CDCI,也就是开发者持续集成。开发者分别向同一个仓库,提交代码。为了确保开发质量,会做一些 Merge Request 流程。当代码合并到 master 分支之后,CI Runner 会被触发执行,编译前端 Webpack 工程,然后将编译生成的前端文件和后端代码推送到 SVN 发布仓库。CD,持续部署部分主要是由 PaaS Engine 提供。这是一套由 K8S 提供的部署引擎。

2. 开发问题

虽然采取的是前后端分离的开发模式,但是实际上代码仓库使用的是同一个。这是由于 PaaS Engine 只支持 SVN 方式部署。同时,PaaS Engine 是一套通用的部署引擎,并不会针对前后端开发模式进行特殊适配。使用同一个代码仓库进行开发,由于使用不同的目录,代码层面不会产生冲突,但是在部署上进行了强绑定 — 必须前后端一起部署。这导致了一系列问题。
  • 代码仓库大,GitLab CI 推送 SVN 慢
  • PaaS Engine 转发前端静态文件效率低
  • 在开发迭代过程中,线上问题不能即时有效修复
  • 正式环境不能进行灰度测试,只有一个版本
  • 前后端仓库权限混乱,职责不清
  • 不同地区、网络访问应用的速度差别大