java 前后端分离

article/2025/10/5 19:42:26

在这里插入图片描述
前后端分离的开发模式,这两年确实被炒得如火如荼,导致这个话题也成了面试极其爱问的一个问题,尤其是换工作、跳槽,之前不管你是做后端,还是前端,都可能会涉及。

面试官常问:

  • 诶?你对前后端分离有什么理解啊?
  • 你觉得一个项目应该如何实施前后端分离呢?
    在这里插入图片描述很明显,这是一个开放性问题,但是却能考察出选手们技术关注点的层级。

其实在回答这个问题时,尤其程序员,一谈到这个问题,上来就一头扎进了某项具体的技术中去了,比如什么:Ajax异步请求、 Vue组件化框架、 RESTFul接口规范、 API接口数据约定、 Mock平台和数据等等。

恕我直言,这估计很难成为面试官内心想要的答案。

因为站在面试官的角度,这个问题大家如果仅仅以某项具体技术、框架来切入,他会觉得你的理解其实很局限。因为很有可能你只知道有前后端分离这个概念,却不知道为什么要做前后端分离这件事情。这尤其对培训班出来的小伙伴,如果只谈到这个深度,就非常危险了。

而且社会上很多公司、团队的一个误区就是:为了做前后端分离而做前后端分离。

从历史渊源说起

以前很长的一段时间里,在一个搞开发的公司里,其实后端工程师是比较有 “门面” 的,往往也是项目和公司的核心团队。这种观念甚至影响了现在很多的应届生求职,都挤破头想去后端开发岗。

那个时候前端开发肯定也是有,但直言不讳,那时候的前端开发人员压根就没什么话语权和公司地位,仅仅是一小撮人散步在团队的小角落,甚至在很多团队里,前端开发都是后端工程师兼任的。

你回想一下,那个年代用的JSP技术不就是这个样子吗?我们就以JSP举例。JSP就是前、后端耦合在一起混着做,套个模板可以把大家弄得死去活来。

这种开发模式在以前那个互联网服务还不是那么繁荣,Web化趋势还不是那么明显的年代,发挥着巨大的作用,大家用得还算开心,毕竟页面不复杂嘛。

但随着社会信息化程度加深,各种各样服务都Web化以后,很多前端展示的东西都变得复杂起来。不信你去数一数淘宝这种网站的页面树,简直太复杂!这时像JSP这种模板技术就没办法高效开发。

究其本质原因,还是因为前端这时候并没有工程化、模块化和可复用化。但那时候的后端不一样,一个Spring这种工程化的开发框架就可以撑起半边天!

所以你想想,这时候开发必然会出现各种不协调、低效率、甚至推诿扯皮的问题。所以从公司项目管理的角度来看,这种开发方式就会非常影响开发效率,所以项目管理者们开始想办法来解决这个问题。

一条永恒的法则!

所以你们说应该如何解决上面的问题呢?

解耦呗!

大家有没有发现,在软件领域,任何复杂问题面前,高内聚、低耦合这个法则几乎都能见效!

所以:

  • 前、后端的事情分开来做吧!
  • 我们要把前端开发的责任从后端工程师身上拿掉!
  • 我们要给前端开发工程师一个单独的岗位和责任领域!
  • 我们要给前端开发者们正名!
  • 我们不能让前端开发总是用野生的模式开发,不能一天到晚到处copy html片段,js片段来人肉试错!
  • 前端开发也需要工程化、项目化的思维来做!
    所以这才是前后端分离开发模式最开始的来源。

说来说去,前后端分离与否,它本身并不是一个技术问题,而是一个项目管理的问题。

自此开始,前端独立出来了,单独行动了。那技术上的问题又怎么解决呢?

组件化框架革了谁的命?

自学过前端开发的小伙伴可能会有一种感觉就是:我去,前端这玩意怎么这么琐碎和玄学!知识非常零碎、不易掌握、学了就忘!

很多人学习、甚至工作了都还是东拼西凑、复制粘贴,copy代码段、东拼西凑,靠往上堆积来完成需要的页面和效果。

你会感觉前端这玩意它就是没有Java后端开发这么有逻辑、易管理、可复用!

所以直到像 Vue.js, React.js等这些前端组件化框架的出现,它才从本质上颠覆了前端开发的游戏规则!我们称它前端组件化框架,但我们更愿意叫它前端工程化框架。因为自此开始,大家都遵循一套体系来进行约束性开发,前端开发迈向了工程化、组件化、迭代化之路!

而且前端代码也更好复用了。自从有了 Vue.js等这种组件化框架的出现,别人写的现成按钮、菜单、布局,我们直接拿过来用得不是挺爽嘛!典型的比如像饿了么的 ElementUI,以及蚂蚁金服的 AntDesignUI,这搁以前哪能做到。在这里插入图片描述在这里插入图片描述而且随着 Node的出现,前端开发可以借助 Node来开发各种各样的工具来辅助高效的开发,比如各种包管理器、预编译工具等等,这也是前端开发步入工程化的一个重要的方面

前后端分离如何落地?

换句话说:到底怎样做才是一个比较优雅的前后端分离呢?

一个正常的软件开发可以简化成四大步:设计、开发、测试、部署,所以真正的前后端分离应该渗透到每个步骤中去。

第一个阶段:设计阶段

设计的第一个层面当然是系统设计:后端系统设计较好理解,主要是系统架构、数据库、中间件、缓存等,主要考虑性能、容量、扩展性、维护性;那前端也应如此,假如网站非常复杂,页面极其多,这时前端项目架构也需要做好规划,尽量满足长期演进、可迭代的目标。

设计的第二个层面就是接口设计:前后端系统通过接口进行交互,这时模型( Model)层面的接口约定极其重要,包括:接口请求方式、数据类型、数据格式等。开发前,前后端双方评审到位,都认可之后方可进行下一步开发,否则未来在开发过程中,前、后端开发工程师永远在为了某个破接口扯来扯去!

第二个阶段:开发阶段

各自按照事先评审好的接口独立开发,互相无需扯皮。

现如今,前端在诸如 Vue、 React等当下火热的组件化框架的加持下,的确可以独立驱动页面,数据则从事先规划好的 Mock服务器去拿,完全不依赖于后端。

后端则只需要把接口写好,按照先前评审好的约定提供数据。不管后端用Java的 SpringBoot,PHP的 Laravel,亦或是Python的 Django、 Flask,这些都跟前端没关系。而且后端一套接口可以提供给多种类型的前端使用,譬如:Web网页、手机APP、微信小程序等等。

第三个阶段:测试阶段

基本上要保证的是,前后端独立可测试。前端主要就是页面、跳转、展示、输入、传参、响应数据的展示等;后端主要则考察数据格式、校验、异常情况、数据一致性甚至一些权限问题。

最后一个阶段:上线部署

前后端项目独立部署,这个很关键!在以前的JSP模板时代,前端的html页面、css样式、js效果均由后台来驱动。那个时候所谓的项目部署上线,其实指的也就是后端项目的部署,前端“所谓的”发版本,还是得求着后端来做的。

前后端分离后责任就清晰了,前端项目单独部署。前后端发布上线完全独立,双方可以按照各自的版本规划来发布版本,前端发版本不再受后端约束,后端发版本前端也可以不知道,互相透明了。

还有一个必须提的就是,很多公司里,后端项目都是通过诸如 Jenkins等 CI系统去做持续发布,一键部署,同理前端项目也应该拥有自己的CI系统。

这玩意真那么邪乎?

最后一个问题: 前后端分离吹得这么邪乎,它真的就没有缺点吗?

这个问题就要回归文章开始的讨论了,即:为什么会有前后端分离这件事情的出现。

怕就怕很多公司为了前后端分离而做前后端分离。前后端分离需要成本!尤其当你想做一个彻彻底底的前后端分离,不管是人力成本、开发成本、工具成本、还是部署成本,都是不小的。

不顾实际需求,强行前后端分离开发只会带来麻烦,因为只要落地过程中某一步做得不彻底,就会带来很多负担!毕竟并不是所有项目都适合前后端分离!

还是那句话,前后端分离与否,它本身不是一个技术问题,而是一个项目管理的问题!

**本文旨在梳理整个Java后端的学习路线,所用图片/思路来自b站up主codeSheep,羊哥搭建的网站也有详细的学习路线:原文链接


http://chatgpt.dhexx.cn/article/Z4rl64JE.shtml

相关文章

前后端ajax分离如何做seo,前后端分离 seo

目录 一、bootstrap 前后端分离 表现层完全由前端掌控是最好的。所以掌握jsp和jstl是挺好的,等你全掌握之后麻利得把页面模板搞定就可以嘲笑后端都是bottleneck了。 当然不愿意用jsp/jstl之类的,也可以考虑完全用ajax。 为什么说前后端分离不利于seo的原…

前后端分离

一、项目有前后端分离和前后端不分离: 在前后端不分离架构中,所有的静态资源和业务代码统一部署在同一台服务器上。服务器接收到浏览器的请求后,进行处理得到数据,然后将数据填充到静态页面中,最终返回给浏览器。 实现…

Spring Security 前后端分离

前后端分离概述 前后端分离指的就是前后端分离部署,前端 调用后端API,后端 返回 JSON格式数据,页面是由前端渲染并展示到浏览器中。 相比较传统的单体项目 ,页面是由后端渲染完成后返回给浏览器的。(jsp、thymeleaf、…

实现前后端分离

对目前的web来说,前后端分离已经变得越来越流行了,越来越多的企业/网站都开始往这个方向靠拢。那么,为什么要选择前后端分离呢?前后端分离对实际开发有什么好处呢? 为什么选择前后端分离 1. 在以前传统的网站开发中&#xff0c…

何为前后端分离?一文搞懂前后端分离发展史

目录 一、前言 二、前后端分离的演进过程 2.1 发展的三个阶段 2.2 前后端不分离阶段(Java的JSP作为前端视图时代) 2.3 前后端半分离阶段(前后端使用Ajax交互的半分离时代) 2.4 前后端完全分离阶段(前后端使…

前后端分离架构概述

1、背景 前后端分离已成为互联网项目开发的业界标准使用方式,通过nginxtomcat的方式(也可以中间加一个nodejs)有效的进行解耦,并且前后端分离会为以后的大型分布式架构、弹性计算架构、微服务架构、多端化服务(多种客户…

前后端分离架构,超全面详解~

此文通俗易懂,全面讲解前后端分离架构核心思想与作用,对学习微服务、开发企业项目大有裨益,建议收藏细品,好好领悟!~ 一、简介 前后端分离已成为互联网项目开发的业界标准使用方式,通过nginxtomcat的方式&a…

到底什么是前后端分离

1、到底什么是前后端分离? 前后端分离的"前"特指浏览器端(或客户端),直接呈现给用户的;后端是服务器端,处理业务逻辑和数据,不呈现给用户。 Java服务器端初学者最容易引起误解的一个概念就是:J…

c语言 链表基本操作

对于c语言的单链表来说,应该是数据结构中比较简单的一类结构,我们只要认识链表结构,对指针和结构体掌握好,其实编写代码并不算太难。 链表结构: 对于链表中的每一个结点,我们可以定义如下的结构体&#xf…

C语言——反转链表

大家好,本人第一次发布博客,目前正在学习数据结构,写博客的目的是一是想分享自己的学习过程,二也是每次写完代码后进行总结。希望大家一起共同学习! 现在我正在看《大话数据结构》这本书,每次学习过后我都会…

C语言数据结构之链表

前面的文章我们就一直说,学一个新东西之前一定要弄明白它的作用是什么,我们为什么要用它。之前讲C语言时我们讲到数组,数组的实质是一种顺序储存、随机访问、存储单元连续的线性表,既然存储单元连续,那么对其进行插入和…

C语言来实现链表创建

链表原理理解 链表作为一种线性数据,通过前后节点的指针指向,将所有数据串联起来。为了实现链表数据域的整体耦合,需要额外的指针域来标定前后数据的连接。通过下面的链表结构图,可以非常容易的理解链表的组成结构 头节点作为链表…

链表C语言和C++两种方式实现

一、C语言版本链表&#xff1a; 方向1&#xff1a;无表头 法一&#xff1a;尾插法 #include<stdio.h> #include<malloc.h> //打印 创建 释放 删除某个数 插入某个数 &#xff08;T_T&#xff09;5个功能 struct Node {int data;struct Node* next; }; typedef st…

C语言实现链表创建

C语言实现链表的创建 链表:是一种物理存储单元上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点链表中每一个元素称为结点&#xff09;组成&#xff0c;结点可以在运行时动态生成。每个结点包括两个部分&#xf…

链表(c语言实现)

1.链表的分类 实际中链表的结构非常多样&#xff0c;以下情况组合起来就有8种链表结构&#xff1a; &#xff08;1&#xff09;单向或者双向 &#xff08;2&#xff09;带头或者不带头 &#xff08;3&#xff09;循环或者非循环 虽然有这么多的链表的结构&#xff0c;但是我们…

用c语言写链表

链表是数据结构的一种&#xff0c;是其他三个数据结构栈&#xff0c;树&#xff0c;图的基础&#xff0c;只有将链表这一数据结构弄懂&#xff0c;才能理解其他三种数据结构。 举一个例子&#xff0c;老师让你设计一个联系人系统&#xff0c;其中包括姓名&#xff0c;电话号&am…

C语言链表超详解

✅作者简介&#xff1a;嵌入式入坑者&#xff0c;与大家一起加油&#xff0c;希望文章能够帮助各位&#xff01;&#xff01;&#xff01;&#xff01; &#x1f4c3;个人主页&#xff1a;rivencode的个人主页 &#x1f525;系列专栏&#xff1a;玩转数据结构 &#x1f4ac;保持…

C语言——链表简单介绍

一、链表的引入 我们至少可以通过两种结构存储数据。 数组&#xff1a;数组是一个固定长度的存储相同数据类型的数据结构&#xff0c;数组中的元素被存储在一段连续的内存空间中。 优点&#xff1a;存取速度快。 缺点&#xff1a;需要一个连续的很大的内存&#xff1b; 插入和…

c语言链表示例

链表是一种常见的基础数据结构&#xff0c;结构体指针在这里得到了充分的利用。链表可以动态的进行存储分配&#xff0c;也就是说&#xff0c;链表是一个功能极为强大的数组&#xff0c;他可以在节点中定义多种数据类型&#xff0c;还可以根据需要随意增添&#xff0c;删除&…

反转链表c语言

反转链表 初始化三个指针 循环执行 temp cur→next cur→next pre pre cur ; cur temp 对于单链表&#xff0c;所有操作都是从头指针开始 // An highlighted block struct ListNode* ReverseList(struct ListNode* pHead ) {// 三指针法struct ListNode* pre pHead;s…