前后端分离是目前项目开发上主流的一种模式,这个概念已经流传很长时间,在新项目开发中要实现前后端分离并没有特别的难度,但在老项目中真正要实现前后端分离却不是一朝一夕的事情,特别是在经过时间洗礼的项目中,留下了多少前辈的沉淀,历史包袱分分钟让你暴脾气。

在很多开发者相关的 APP 平台上,太多的人谈论或发表过对前后端分离的看法及经验,参考价值大的文章也不少,但大部分情况下并不能拿来主义,基本上都是具有本项目特色的一些实战方案,如何总结出一种适合自己团队的方案才是最优的选择。明道云项目的起点不算晚(8、9年前),技术选型上在当时来看并不存在什么明显的缺陷,单体程序,开发部署快,一个代码库就足够。在明道云当时也并没有前端开发和后端开发的区分,基本都叫 Web 开发工程师,前后端通吃。明道云最初采用的是微软 http://ASP.NET 的 WebForm 产品进行开发,前端可以夹杂后端代码,后端也可以夹杂前端代码,很强大,最终证明改造阻力也很强大

在初期,项目上更多是业务驱动型,核心就一句话,“不要扯那么多,先做出来再说” ,站在商业的角度来看,确实非常合理,而且很多产品初期都是一样的模式,但如果随着时间的发展,对项目架构没有尽快采取改进措施,后期的重构过程中阻力将难以预估。随着明道云整体功能的和产品线的增加,越来越多的服务来支撑明道云主站项目的运行,当时人员职能划分上基本没什么变化,主站项目也依然是前后端混合体,只是在后端服务开发的语言上更多使用了当时比较火的 NodeJs。


后来随着微服务架构慢慢流行,同时更多开发小伙伴的加入和职能专业度上的更高要求,在团队成员上开始区分前端和后端开发工程师,功能模块的开发上也尽量偏向前后端分离的模式,但是随着功能的继续扩展与叠加,主站项目的后端代码接口层持续膨胀,因为太多的业务逻辑依赖关系导致新功能很难独立,这就出现了四周不断扩散的同时中间依然臃肿的状态,所以面临的问题就是不管微服务如何布局,主站项目的后端复杂度及与前端耦合度没有明显改善,如下图:

同时主站项目的代码管理和部署上的问题也越发严重,拉代码后编译就要花几分钟,改几行代码编译又得花几分钟才能跑起来进行测试,修改紧急 bug 发布上线必须全站前后端代码一起上。归根结底,项目太大,需要拆分,但拆分还得从前后端分离开始,可前后端分离并不是一蹴而就的事情,要做到一刀切是不现实的,所以这个事情在当时真的不能想,想想还不如放弃。另外和很多开发团队一样,平时产品上的新需求也很多,开发有很少时间能专注到技改上,但从长远来看,这个事情又是非干不可,所以当时定了以下几个小目标:

  1. 后端接口规范化,请求和返回参数都必须以 JSON 格式传输,同时返回值必须有统一的结构,如:{ “code”: int,“message”: string, “data”: object } ;
  2. 前端封装统一 Ajax请求方法,不要在每个文件内单独设置请求的 host 地址,host 地址有封装的内部配置,这样的目的是为之后与后端分离后只需要修改host 即可,如:开始是 “/api/” ,之后为 “https://getaway.mingdao.com/api/” ;
  3. 原来由服务端渲染的页面改造成接口提供数据由前端进行渲染;
  4. 原来后端实现的各种跳转逻辑全部交给前端(前端路由规则后端不需要关注);

乍一看,要做的事情并不多,但由于当时主站项目的接口写法是直接基于 aspx.cs(熟悉 .NET Framework 开发的应该知道),通过创建 aspx 页面方式,每个页面内定义一批接口,更难搞的是接口的返回格式之前完全没有规范,这也是当时团队中 Web 开发工程师的特色,缺啥我自己给,自己怎么满意怎么来,具体的代码就不拿出来了,有经验的码农朋友肯定能脑补得很形象。

所以前端的改造在很大程度上受限于后端接口的规范化,那后端的改造就成为万众瞩目的焦点。在明道云开发个人化版本架构大改造的过程中,因为涉及改动的接口实在太多,同时又有前后端分离的计划,所以最终决定还是在主站项目下另外实现一个接口层(Web.Ajax),大体实现方式是自定义了一个类似 MVC 中 Controller/Action 模式的程序集,而继续保留在主站项目下主要是考虑稳定性和时间成本,但同时也考虑到前后端分离目标,所以最终提供给前端唯一的 Ajax 请求接收的入口文件,接收 Controller 和 Action 参数,由该入口文件内通过反射的方式实现接口调用,待之后要完全分离时,改动也不复杂。

经过较长时间的改造,最终前面提到的4个方面都有了比较大的推进,基本上达到最初设定目标的 70~80% ,但由于业务的需要,接下来很长一段时间前后端分离的工作基本搁置,不过在前端本身的技术推进中实现了明道云单页模式。

随着容器化技术在明道云的推广及 .NET Core 的盛行,基于 .NET Framework 开发的主站项目就特别显得突兀,同时又因为要落地明道云私有部署版(完全基于 Docker 的容器服务),所以主站项目 .NET Framework 转 .NET Core 已是必然。虽然前后端没有完全分离,但基于之前很长时间的积累,后端优先升级为 .NET Core 并无约束,所以从 Web.Ajax 层开始截肢,Web.Ajax 及以上部分全部是迁移到主站后端 API 服务仓库下,剩下的部分暂留给前端,同时 Web.Ajax 层改造成 http://ASP.NET Core API 类型的应用程序,也与开始构造的类 MVC 程序集基本兼容。

经过以上调整后,主要遗留部分只剩下小目标 3,4 中的一部分,经过团队小伙伴继续相互积极配合,终于在今年初完成了全面的前后端分离工作,而且至此明道云 SaaS 版所有依赖的服务全部采用 Docker 容器化部署。

明道云前后端分离这条路走的并不顺利,中间的阻力也比描述的要大很多,而且经历了各种技术和团队上的变革,反正最终功夫不负有心人,也算是干出来了。

明道云前后端分离这条路相关推荐

  1. 阿里云视频上传视频获取进度条问题(使用session方案,获取进度一直为0的解决方案)补充:前后端分离项目中获取进度解决方案

    1.场景描述: 之前用阿里云上传视频,前端反应上传视频经常出现获取视频url失败问题.但是接口我测过很多遍都是没有问题的.后台这边提供了一个视频上传的接口返回一个videoId,还提供了一个根据vid ...

  2. 基于Spring boot + Mybatis +Netty 实现前后端分离的聊天App,部署到阿里云线上服务器...

    前后端分离Spring boot 项目部署 了解前后端分离项目 配置云服务器 java maven tomcat nginx mysql 部署后端项目 部署前端项目 部署Java环境 1.下载JDK软 ...

  3. 若依前后端分离版数据库已经存在的字典添加一条后刷新没作用,必须清除Redis缓存

    场景 使用若依的前后端分离版,前端下拉框的使用直接查询的是字典表中的数据. 对于某个类型的字典如果之前已经添加过并使用过,后来想要再添加一条此类型的字典. 在数据库中添加后,前端刷新下,发现没有获取到 ...

  4. 《浅谈架构之路:前后端分离模式》 - 山人行 - 博客园

    前言:分离模式 对前后端分离研究了一段时间,恰逢公司有一个大项目决定尝试使用前后端分离模式进行,便参与其中.该项目从2016年初立项至今,平平稳稳得度过,但也涌现出越来越多的问题,绝对不是说前后端分离 ...

  5. 《浅谈架构之路:前后端分离模式》

    前言:分离模式 对前后端分离研究了一段时间,恰逢公司有一个大项目决定尝试使用前后端分离模式进行,便参与其中.该项目从2016年初立项至今,平平稳稳得度过,但也涌现出越来越多的问题,绝对不是说前后端分离 ...

  6. Django + react + 阿里云ecs 前后端分离部署上线

    背景 因为之前一直在捣鼓Python,本人是前端菜鸟一枚~,一直想着做个小demo,把后端和前端给统一跑起来,正好也可以把掌握的知识梳理一遍,这样前端后端就能够打通,岂不快哉!平时上班大家都知道没时间 ...

  7. 阿里云轻量应用服务器部署Node.js+React+MongoDB前后端分离项目

    最近用阿里云服务器部署了一个前端React,后端Node.js(Koa2),数据库MongoDB的前后端分离项目,其间踩了不少的坑,用这篇文章记录一下具体的步骤,希望对你们能有帮助. 1. 服务器的选 ...

  8. B站云E办Vue+SpringBoot前后端分离项目——MVC三层架构搭建后台项目

    本项目来源B站云E办,笔记整理了项目搭建的过程和涉及的知识点.对于学习来说,不是复制粘贴代码即可,要知其然知其所以然.希望我的笔记能为大家提供思路,也欢迎各位伙伴的指正. 项目前端学习笔记目录 B站云 ...

  9. 人人开源前后端分离部署到阿里云服务器

    购买阿里云学生服务器 https://developer.aliyun.com/plan/grow-up?utm_content=se_1011983784 阿里云学生服务器试用 阿里云服务器购买及配 ...

最新文章

  1. 远程连接docker中的mysql容器_docker构建mysql容器及Navicat 远程连接
  2. VTK:Utilities之Coordinate
  3. 工欲善其事必先利其器系列之:在VS里面折叠js代码
  4. js - flex布局测试案例:完美居中
  5. [AGC031E] Snuke the Phantom Thief(网络流)
  6. MySQL子查询作为列_mysql 列子查询
  7. java小_Java小知识点总结
  8. Confluence 6 企业环境或者网站托管的 Java 配置策略
  9. html5判断用户摇晃了手机(转)
  10. HackerOne《2020年黑客驱动安全报告》:中国白帽子的收入增长幅度最大
  11. 中南大学 科学计算和MATLAB 初级语言学习
  12. 内网穿透工具之NATAPP使用教程
  13. HBase-2.0 MOB解决海量图片存储方案
  14. OA多级审批流程表设计方案(干货满满)
  15. php 考试座位编排系统,考试座位编排vba
  16. 珠海市世鸿置业有限公司5周年线下交流会带你学会用基金理财
  17. Linux软件磁盘列阵RAID
  18. freemarker ftl模板语法和指令
  19. K8S集群扩容多master大概思路步骤
  20. Linux大全——Linux系统学习资源合集

热门文章

  1. bios刷新失败,求解决之方
  2. 练习——shell脚本+kickstart自动安装虚拟机
  3. 大学生用笔记本电脑哪一款比较好2022
  4. 笔记本输字母p出现仅计算机,当笔记本计算机连接到外接显示器时,FPS严重下降的解决方案...
  5. 不参加高考去澳洲学计算机,没有参加高考的高三毕业生可以申请澳洲留学吗?...
  6. 拒绝屏幕失灵 Android电容屏保养须知
  7. Citrix ADC负载均衡技术
  8. matlab中的pause函数
  9. Java中的StringBuilder和StringBuffer
  10. 怎样用c语言计算出自己的出生天数,新手编的小程序:计算年龄和出生后经历的天数的小程序...