前后端分离是什么
理解前后端分离的概念、优势和实践中的问题
问题
什么是前后端分离?为什么需要前后端分离?
解答
什么是前后端分离
前后端分离就是前端与后端分开开发、分开部署。
传统的 Java Web 开发中,前后端是耦合在一起的:
Spring MVC 时代:前端使用 JSP 展示页面,后端用 Servlet 处理请求。
Spring Boot 时代:前端使用 Thymeleaf 或 FreeMarker 模板引擎,后端用 Controller 处理请求。
这些方案的共同问题是页面可以内嵌 Java 代码,导致前后端高度耦合。部署时前后端代码打包在同一个 war/jar 包中,任何修改都需要重新打包部署整个项目。
前后端分离的做法:
- 前端只写 HTML + CSS + JavaScript
- 后端不再使用 JSP 或模板引擎渲染页面
- 前端项目和后端项目独立开发、独立部署
为什么需要前后端分离
项目难以维护
项目越来越大时,前后端工程师需要在同一个页面上协作,沟通成本高。前端或后端任何改动都需要重新打包编译整个项目,项目越大耗时越长。
代码难以复用
页面中嵌入 Java 代码,复用后端接口时需要重新修改前端页面并添加相应代码,复用成本高。
性能和资源浪费
使用模板引擎需要先解析页面中的代码再渲染,比静态页面慢。扩展并发能力时只能整体部署多个实例,浪费服务器资源。
前后端分离的优势
提升开发效率
前后端各自负责擅长的领域,只需约定好接口文档即可并行开发。前端可以用 Mock 数据测试,后端可以用 Postman 测试接口,开发进度互不影响。
简化更新维护
前端或后端有改动时,只需要打包部署对应的项目。招聘时也更容易找到专注单一职责的开发人员。
提高接口复用率
后端模块可以直接复用,不需要迁移页面中的 Java 代码。
加快页面加载
前端部署为静态页面,无需解析模板引擎代码,加载更快。可以引入 Node.js 作为中间层处理页面渲染,进一步提升性能。
优化资源利用
扩展并发能力时,可以只增加前端实例部署,做好负载均衡即可。只有后端接口 QPS 不足时才需要扩展后端服务。
前后端分离的问题
跨域问题(CORS)
使用 Ajax 请求数据时会遇到跨域问题。解决方法是在后端返回的响应头中添加 Access-Control-Allow-Origin。
单点登录问题
对接 CAS 等单点认证系统时,登录请求直接发送到后端,前端无法正常获取登录后的 JWT。需要在后端将 token 和 jsessionid 写入前端认证页面,由前端完成页面跳转和后续认证流程。
关键点
- 前后端分离是指前端和后端分开开发、分开部署,前端只写 HTML/CSS/JS,后端不使用模板引擎
- 主要优势是提升开发效率、简化维护、提高复用率、优化性能和资源利用
- 需要解决跨域问题(通过 CORS)和单点登录等技术问题
- 前后端通过约定接口文档协作,可以并行开发互不阻塞
目录