互联网分层架构,为啥要前后端分离?

随着业务复杂性和产品形态的增加,前后端分离成为一种有效解决数据获取复杂性和提高效率的方法。通过对站点展示层和数据层进行分层抽象,可以显著减少重复工作并加快开发流程。


通用业务服务化之后,系统的典型后端结构如上:

  • web-server通过RPC接口,从通用业务服务获取数据

  • biz-service通过RPC接口,从多个基础数据service获取数据

  • 基础数据service通过DAO,从独立db/cache获取数据

  • db/cache存储数据

 

随着时间的推移,系统架构并不会一成不变,业务越来越复杂,改版越来越多,此时web-server层虽然使用了MVC架构,但以下诸多痛点是否似曾相识?

  • 产品追求绚丽的效果,并对设备兼容性要求高,这些需求不断折磨着使用MVC的Java工程师们(本文以Java举例)

  • 不管是PC,还是手机H5,还是APP,应用前端展现的变化频率远远大于后端逻辑的变化频率(感谢那些喜欢做改版的产品经理),改velocity模版并不是Java工程师喜欢和擅长的工作

 

此时,为了缓解这些问题,一般会成立单独的前端FE部门,来负责交互与展现的研发,其职责与后端Java工程师分离开,但痛点依然没有完全解决:

  • 一点点展现的改动,需要Java工程师们重新编译,打包,上线,重启tomcat,效率极低

  • 原先Java工程师负责所有MVC的研发工作,现在分为Java和FE两块,需要等前端和后端都完成研发,才能一起调试整体效果,不仅增加了沟通成本,任何一块出问题,都可能导致项目延期

 

更具体的,看一个这样的例子,最开始产品只有PC版本,此时其系统分层架构如下:

客户端,web-server,service,非常清晰。

 

随着业务的发展,产品需要新增Mobile版本,Mobile版本和PC版本大部分业务逻辑都一样,唯一的区别是屏幕比较小

  • 信息展现的条数会比较少,即调用service服务时,传入的参数会不一样

  • 产品功能会比较少,大部分service的调用一样,少数service不需要调用

  • 展现,交互会有所区别

 

由于工期较紧,Mobile版本的web-server一般怎么来呢?

没错,把PC版本的工程拷贝一份,然后再做小量的修改

  • service调用的参数有些变化

  • 大部分service的调用一样,少数service的调用去掉

  • 修改展现,交互相关的代码

 

业务继续发展,产品又需要新增APP版本,APP版本和Mobile版本业务逻辑完全相同,唯一的区别是:

  • Mobile版本返回html格式的数据,APP版本返回json格式的数据,然后进行本地渲染

 

由于工期较紧,APP版本的web-server一般怎么来呢?

没错,把Mobile版本的工程拷贝一份,然后再做小量的修改

  • 把拼装html数据的代码,修改为拼装json数据


这么迭代,演化,发展,架构会变成这个样子:

  • ,是PC,Mobile,APP

  • web-server接入,是PC站,M站,APP站

  • 服务层,通用的业务服务,以及基础数据服务

 

这个架构图中的依赖关系是不是看上去很别扭

  • 端到web-server之间连接关系很清晰

  • web-server与service之间的连接关系变成了蜘蛛网

 

PC/H5/APP的web-server层大部分业务是相同的,只有少数的逻辑/展现/交互不一样:

  • 一旦一个服务RPC接口有稍许变化,所有web-server系统都需要升级修改

  • web-server之间存在大量代码拷贝

  • 一旦拷贝代码,出现一个bug,多个子系统都需要升级修改

 

如何让数据的获取更加高效快捷,如何让数据生产与数据展现解耦分离呢?

前后端分离的分层抽象势在必行。

通过前后端分离分层抽象:

  • 站点展示层,node.js,负责数据的展现与交互,由FE维护

  • 站点数据层,web-server,负责业务逻辑与json数据接口的提供,由Java工程师维护

 

这样的好处是:

  • 复杂的业务逻辑与数据生成,只有在站点数据层处写了一次,没有代码拷贝

  • 底层service接口发生变化,只有站点数据层一处需要升级修改

  • 底层service如果有bug,只有站点数据层一处需要升级修改

  • 站点展现层可以根据产品的不同形态,传入不同的参数,调用不同的站点数据层接口

 

除此之外:

  • 产品追求绚丽的效果,并对设备兼容性要求高,不再困扰Java工程师,由更专业的FE对接

  • 一点点展现的改动,不再需要Java工程师们重新编译,打包,上线,重启tomcat

  • 约定好json接口后,Java和FE分开开发,FE可以用mock的接口自测,不再等待一起联调

 

结论

业务越来越复杂,端上的产品越来越多,展现层的变化越来越快越来越多,站点层存在大量代码拷贝,数据获取复杂性成为通用痛点的时候,就应该进行前后端分离分层抽象,简化数据获取过程,提高数据获取效率,向上游屏蔽底层的复杂性。

 

最后再强调两点:

  • 是否需要前后端分离,和业务复杂性,以及业务发展阶段有关,不可一概而论

  • 本文强调的前后端分离的思路,实际情况下有多种实现方式,文章并没有透彻展开实现细节

 

任何脱离业务的架构设计,都是耍流氓

思路比细节重要


阅读前序文章,“分层架构设计”的背景与来龙去脉更加清晰:


若有收获,随手帮转哟。

### SpringBoot 前后分离的必要性及原因 #### 1. **前后职责清晰** 在传统的 Web 应用中,前页面逻辑和后业务逻辑往往耦合在一起,这使得代码维护变得困难。而通过前后分离的方式,可以将前负责界面展示的部分与后负责数据处理和服务的部分完全解耦[^4]。这种方式让开发者能够专注于各自领域的工作,从而提高开发效率。 #### 2. **提升可扩展性和灵活性** 前后分离架构下,后主要提供 RESTful API 或 GraphQL 接口供前调用,这样的设计允许不同的前应用(如移动、Web 甚至第三方服务)共享同一套后接口[^1]。这意味着即使未来需要新增其他类型的客户支持,也无需重新构建整个系统,只需对接已有的接口即可完成功能扩展。 #### 3. **促进团队协作** 由于前后工作被独立开来,不同技能背景的技术人员可以在同一个项目里并行作业而不互相干扰——前工程师可以专心于用户体验优化以及视觉效果呈现;而后程序员则更关注数据库操作、安全性验证等方面的内容[^4]。这样不仅加快了整体进度安排还提高了产品质量水平。 #### 4. **便于测试与部署** 对于基于微服务理念搭建起来的应用程序来说尤其重要的是自动化持续集成/持续交付(CI/CD)流程的支持程度如何直接影响着最终产品的上线速度。当实现了彻底意义上的分层之后(即所谓的“全栈拆分”),每一个单独组件都可以分别进行单元测试,集成测试乃至性能压测等等一系列质量保障活动;而且因为彼此之间不存在紧密依赖关系的缘故所以在发布新版本或者修复Bug时也可以做到更加精准控制影响范围最小化风险系数最大化收益回报率最高化的目的[^2]。 ```python # 示例:简单的RESTful API定义 from flask import Flask, jsonify app = Flask(__name__) @app.route('/api/data', methods=['GET']) def get_data(): data = {"message": "This is a sample response from backend."} return jsonify(data) if __name__ == '__main__': app.run(debug=True) ``` #### 5. **适应现代技术趋势** 随着 SPA (Single Page Application 单页应用程序) 技术的发展壮大及其所带来的良好交互体验越来越受到用户的青睐 , 越来越多的企业开始倾向于采用此类新型解决方案代替传统模式下的多页面加载方式 。 同样地 , 在移动互联网时代背景下诞生出来的众多跨平台框架也都普遍遵循这一原则 —— 将所有的视图渲染交给专门定制好的轻量级容器去执行而不是由服务器动态生成 HTML 文档再返回给浏览器解析显示出来 [^3]. --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值