前后端分离总结(部分)

2023-11-18

本文内容转载于博客:[前后端分离架构概述](https://blog.csdn.net/fuzhongmin05/article/details/81591072)

*********************************************************************************************

1、背景

       前后端分离已成为互联网项目开发的业界标准使用方式,通过nginx+tomcat的方式(也可以中间加一个nodejs)有效的进行解耦,并且前后端分离会为以后的大型分布式架构、弹性计算架构、微服务架构、多端化服务(多种客户端,例如:浏览器,车载终端,安卓,IOS等等)打下坚实的基础。这个步骤是系统架构从猿进化成人的必经之路。

      核心思想是前端HTML页面通过AJAX调用后端的RESTFUL API接口并使用JSON数据进行交互

      Web服务器:一般指像Nginx,Apache这类的服务器,他们一般只能解析静态资源;

      应用服务器:一般指像Tomcat,Jetty,Resin这类的服务器可以解析动态资源也可以解析静态资源,但解析静态资源的能力没有web服务器好;

      一般都是只有web服务器才能被外网访问,应用服务器只能内网访问。

      以前的Java Web项目大多数都是Java程序员又当爹又当妈,又搞前端,又搞后端。随着时代的发展,渐渐的许多大中小公司开始把前后端的界限分的越来越明确,前端工程师只管前端的事情,后端工程师只管后端的事情。正所谓术业有专攻,一个人如果什么都会,那么他毕竟什么都不精。大中型公司需要专业人才,小公司需要全才,但是对于个人职业发展来说,前后端需要分离。

2、未分离时代(各种耦合)

      早期主要使用MVC框架,Jsp+Servlet的结构图如下:

640?wx_fmt=jpeg

      大致就是所有的请求都被发送给作为控制器的Servlet,它接受请求,并根据请求信息将它们分发给适当的JSP来响应。同时,Servlet还根据JSP的需求生成JavaBeans的实例并输出给JSP环境。JSP可以通过直接调用方法或使用UseBean的自定义标签得到JavaBeans中的数据。需要说明的是,这个View还可以采用 Velocity、Freemaker 等模板引擎。使用了这些模板引擎,可以使得开发过程中的人员分工更加明确,还能提高开发效率。

      那么,在这个时期,开发方式有如下两种:

方式一
640?wx_fmt=png
方式二
640?wx_fmt=jpeg

      方式二已经逐渐淘汰。主要原因有两点:
      1)前端在开发过程中严重依赖后端,在后端没有完成的情况下,前端根本无法干活;
      2)由于趋势问题,会JSP,懂velocity,freemarker等模板引擎的前端越来越少;

      因此,方式二逐渐不被采用。然而,不得不说一点,方式一,其实很多小型传统软件公司至今还在使用。那么,方式一和方式二具有哪些共同的缺点呢?

       1、前端无法单独调试,开发效率低;

       2、 前端不可避免会遇到后台代码,例如:

<body>
   <%
       request.setCharacterEncoding("utf-8")
       String name=request.getParameter("username");
       out.print(name);
   %>
</body>
 
 

      这种方式耦合性太强。那么,就算你用了freemarker等模板引擎,不能写Java代码。那前端也不可避免的要去重新学习该模板引擎的模板语法,无谓增加了前端的学习成本。正如我们后端开发不想写前端一样,你想想如果你的后台代码里嵌入前端代码,你是什么感受?因此,这种方式十分不妥。

      3、JSP本身所导致的一些其他问题 比如,JSP第一次运行的时候比较缓慢,因为里头包含一个将JSP翻译为Servlet的步骤。再比如因为同步加载的原因,在JSP中有很多内容的情况下,页面响应会很慢。

3、半分离时代

      前后端半分离,前端负责开发页面,通过接口(Ajax)获取数据,采用Dom操作对页面进行数据绑定,最终是由前端把页面渲染出来。这也就是Ajax与SPA应用(单页应用)结合的方式,其结构图如下:

640?wx_fmt=jpeg

      步骤如下:
(1)浏览器请求,CDN返回HTML页面;
(2)HTML中的JS代码以Ajax方式请求后台的Restful接口;
(3)接口返回Json数据,页面解析Json数据,通过Dom操作渲染页面;

      后端提供的都是以JSON为数据格式的API接口供Native端使用,同样提供给WEB的也是JSON格式的API接口。

      那么意味着WEB工作流程是:
      1、打开web,加载基本资源,如CSS,JS等;
      2、发起一个Ajax请求再到服务端请求数据,同时展示loading;
      3、得到json格式的数据后再根据逻辑选择模板渲染出DOM字符串;
      4、将DOM字符串插入页面中web view渲染出DOM结构;

      这些步骤都由用户所使用的设备中逐步执行,也就是说用户的设备性能与APP的运行速度联系的更紧换句话说就是如果用户的设备很低端,那么APP打开页面的速度会越慢。

      为什么说是半分离的?因为不是所有页面都是单页面应用,在多页面应用的情况下,前端因为没有掌握controller层,前端需要跟后端讨论,我们这个页面是要同步输出呢,还是异步Json渲染呢?而且,即使在这一时期,通常也是一个工程师搞定前后端所有工作。因此,在这一阶段,只能算半分离。

      首先,这种方式的优点是很明显的。前端不会嵌入任何后台代码,前端专注于HTML、CSS、JS的开发,不依赖于后端。自己还能够模拟Json数据来渲染页面。发现Bug,也能迅速定位出是谁的问题。

      然而,在这种架构下,还是存在明显的弊端的。最明显的有如下几点:
      1)JS存在大量冗余,在业务复杂的情况下,页面的渲染部分的代码,非常复杂;
      2)在Json返回的数据量比较大的情况下,渲染的十分缓慢,会出现页面卡顿的情况;
      3)SEO( Search Engine Optimization,即搜索引擎优化)非常不方便,由于搜索引擎的爬虫无法爬下JS异步渲染的数据,导致这样的页面,SEO会存在一定的问题;
      4)资源消耗严重,在业务复杂的情况下,一个页面可能要发起多次HTTP请求才能将页面渲染完毕。可能有人不服,觉得PC端建立多次HTTP请求也没啥。那你考虑过移动端么,知道移动端建立一次HTTP请求需要消耗多少资源么?

      正是因为如上缺点,我们才亟需真正的前后端分离架构。

4、分离时代

      在前后端彻底分离这一时期,前端的范围被扩展,controller层也被认为属于前端的一部分。在这一时期:
      前端:负责View和Controller层。
      后端:只负责Model层,业务/数据处理等。

      可是服务端人员对前端HTML结构不熟悉,前端也不懂后台代码呀,controller层如何实现呢?这就是node.js的妙用了,node.js适合运用在高并发、I/O密集、少量业务逻辑的场景。最重要的一点是,前端不用再学一门其他的语言了,对前端来说,上手度大大提高。

640?wx_fmt=jpeg

      可以就把Nodejs当成跟前端交互的api。总得来说,Nodejs的作用在mvc中相当于C(控制器)。Nodejs路由的实现逻辑是把前端静态页面代码当成字符串发送到客户端(例如浏览器),简单理解可以理解为路由是提供给客户端的一组api接口,只不过返回的数据是页面代码的字符串而已

      用NodeJs来作为桥梁架接服务器端API输出的JSON。后端出于性能和别的原因,提供的接口所返回的数据格式也许不太适合前端直接使用,前端所需的排序功能、筛选功能,以及到了视图层的页面展现,也许都需要对接口所提供的数据进行二次处理。这些处理虽可以放在前端来进行,但也许数据量一大便会浪费浏览器性能。因而现今,增加Node中间层便是一种良好的解决方案

这里写图片描述

      浏览器(webview)不再直接请求JSP的API,而是:
      1)浏览器请求服务器端的NodeJS;
      2)NodeJS再发起HTTP去请求JSP;
      3)JSP依然原样API输出JSON给NodeJS;
      4)NodeJS收到JSON后再渲染出HTML页面;
      5)NodeJS直接将HTML页面flush到浏览器;

      这样,浏览器得到的就是普通的HTML页面,而不用再发Ajax去请求服务器了。

      淘宝的前端团队提出的中途岛(Midway Framework)的架构如下图所示:

这里写图片描述

      增加node.js作为中间层,具体有哪些好处呢?

      (1)适配性提升;我们其实在开发过程中,经常会给PC端、mobile、app端各自研发一套前端。其实对于这三端来说,大部分端业务逻辑是一样的。唯一区别就是交互展现逻辑不同。如果controller层在后端手里,后端为了这些不同端页面展示逻辑,自己维护这些controller,模版无法重用,徒增和前端沟通端成本。 如果增加了node.js层,此时架构图如下:

640?wx_fmt=jpeg

      在该结构下,每种前端的界面展示逻辑由node层自己维护。如果产品经理中途想要改动界面什么的,可以由前端自己专职维护,后端无需操心。前后端各司其职,后端专注自己的业务逻辑开发,前端专注产品效果开发。

      (2)响应速度提升;我们有时候,会遇到后端返回给前端的数据太简单了,前端需要对这些数据进行逻辑运算。那么在数据量比较小的时候,对其做运算分组等操作,并无影响。但是当数据量大的时候,会有明显的卡顿效果。这时候,node中间层其实可以将很多这样的代码放入node层处理、也可以替后端分担一些简单的逻辑、又可以用模板引擎自己掌握前台的输出。这样做灵活度、响应度都大大提升。

      (3)性能得到提升;大家应该都知道单一职责原则。从该角度来看,我们,请求一个页面,可能要响应很多个后端接口,请求变多了,自然速度就变慢了,这种现象在mobile端更加严重。采用node作为中间层,将页面所需要的多个后端数据,直接在内网阶段就拼装好,再统一返回给前端,会得到更好的性能。

      (4)异步与模板统一;淘宝首页就是被几十个HTML片段(每个片段一个文件)拼装成,之前PHP同步include这几十个片段,一定是串行的,Node可以异步,读文件可以并行,一旦这些片段中也包含业务逻辑,异步的优势就很明显了,真正做到哪个文件先渲染完就先输出显示。前端机的文件系统越复杂,页面的组成片段越多,这种异步的提速效果就越明显。前后端模板统一在无线领域很有用,PC页面和WIFI场景下的页面适合前端渲染(后端数据Ajax到前端),2G、3G弱网络环境适合后端渲染(数据随页面吐给前端),所以同样的模板,在不同的条件下走不同的渲染渠道,模板只需一次开发。

      增加NodeJS中间层后的前后端职责划分:

这里写图片描述

5、总结

      从经典的JSP+Servlet+JavaBean的MVC时代,到SSM(Spring + SpringMVC + Mybatis)和SSH(Spring + Struts + Hibernate)的Java 框架时代,再到前端框架(KnockoutJS、AngularJS、vueJS、ReactJS)为主的MV*时代,然后是Nodejs引领的全栈时代,技术和架构一直都在进步。虽然“基于NodeJS的全栈式开发”模式很让人兴奋,但是把基于Node的全栈开发变成一个稳定,让大家都能接受的东西还有很多路要走。创新之路不会止步,无论是前后端分离模式还是其他模式,都是为了更方便得解决需求,但它们都只是一个“中转站”。前端项目与后端项目是两个项目,放在两个不同的服务器,需要独立部署,两个不同的工程,两个不同的代码库,不同的开发人员。前端只需要关注页面的样式与动态数据的解析及渲染,而后端专注于具体业务逻辑。

      参考:淘宝前后端分离解决方案

      参考:从分布式之的角度告诉你前后端分离架构的必要性!

      参考:浅谈前后端分离技术

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

前后端分离总结(部分) 的相关文章

  • R语言 数据处理(一)

    数据合并 提取及降维处理 install packages dplyr 数据处理包dplyr library dplyr name1 lt c Bob Mary Jane Kim name2 lt c Bob Mary Kim Jane w
  • Animate.css 动画库介绍

    一个漂亮炫酷的网页离不开动画效果的点缀 现在也有很多动画库可供选择 这里我来介绍一个简单好用的动画库Animate css animate css在线效果用一个在线网页演示了所有动画效果 我们只需要在下拉列表中选择一个效果名字 即可查看它的
  • centos7 安装 docker

    文章目录 使用阿里云镜像源安装docker ce 检查内核版本 Docker requires a 64 bit OS and version 3 10 or higher of the Linux kernel uname r 更新yum
  • SSM异常:No qualifying bean of type `CompanyDao` available expected at least 1 bean which qualifies

    1 边写代码边做测试 由于采用聚合架构及Maven的方式创建项目 一个父项目 Project 会有多个子模块 Module 每个子模块都会在resources目录下创建spring文件夹 用于存放spring相应的配置文件 于是测试时遇到了
  • TensorFlow——鸢尾花分类

    准备数据 数据集读入 导入所需模块 import tensorflow as tf from sklearn import datasets from matplotlib import pyplot as plt import numpy
  • 【计算机网络】计算机网络基础

    计算机是人类社会不可或缺的工具 而单独的一台计算机的功能也是有限的 计算机需要和其它的设备相互连接通信形成的计算机网络才能对人类发展带来巨大的影响 目录 计算机网络 通信协议 网络结构 网络边缘 接入网 网络核心 时延和吞吐量 时延 吞吐量
  • wchar_t char wstring string 项目转换

    wchar t char wstring string 项目转换 1 wchart t转wstring wchar t tmpRuleStr 10 0 wstring m tmpRuleStr wstring tmpRuleStr 2 ws
  • Mac安装python3

    可以在命令行中输入 brew install python3 但是出现了error 如下所示 tar Error opening archive Failed to open Users my Library Caches Homebrew
  • springBoot自动装载原理

    springBoot自动装载原理 启动类的核心组合注解 SpringBootApplication 点进去看看 组成 SpringBootApplication注解的三个核心注解 SpringBootConfiguration 继承自 Co
  • 【MySQL】数据库高级查询:修改表、DML语句、DQL语句

    修改表 1 修改表名 ALTER TABLE 旧表名 RENAME TO 新表名 TO为可选参数 使用与否不影响结果 2 添加字段 ALTER TABLE 表名 ADD 字段名 数据类型 属性 3 修改字段 ALTER TABLE 表名 C
  • Spring Bean作用域简介说明

    转自 Spring Bean作用域简介说明 Bean作用域简介 Bean作用域指一个Bean是否为单例模式 还是每次访问新实例 或一个Session一个新实例等方式 那么Bean作用域有哪几种呢 下文将一一道来 作用域 描述 singlet
  • springboot(三)———解决 8/24/2022 6:00类型转换为2022-08-24 06:00:00.0(MM/dd/yyyy H:mm与yyyy-MM-dd HH:mm:ss转换)

    输入 输出 代码 String datastring 8 24 22 6 00 String arrDate datastring split 3 StringBuffer stringBuffer new StringBuffer str
  • 停止和删除Hasplms服务(一)

    使用圣天诺HASP加密的软件都会启动一个叫做Hasplms或Sentinel LDK License Manager的服务项 这个服务是软件运行所必须的 但是在软件卸载后往往这个服务还在运行 重启电脑后也还继续运行 这就非常不厚道了 针对这
  • Gradle介绍1-入门和IDEA整合(Gradle Wrapper)

    1 Gradle 入门 1 1 Gradle 简介 Gradle 是一款Google 推出的基于 JVM 通用灵活的项目构建工具 支持 Maven JCenter 多种第三方仓库 支持传递性依赖管理 废弃了繁杂的xml 文件 转而使用简洁的
  • QGLWidget类的初始化顺序

    这里 我们用一个简单的opengl程序来了解一下QGLWidget类的结构 程序绘制了一个白色的正方形 1 QGLWidget类的定义 cpp view plain copy class Widget public QGLWidget Q
  • 在Linux(Redhat/CentOS)下安装MySQL之yum(rpm)在线安装方式

    在CentOS6之前 yum源默认存在MySQL yum install mysql server mysql client 在CentOS6之后 yum没有MySQL源 意味着我们要自己下载源 下载源 yum install url 安装
  • JMeter压力测试教程(超详细&小白版)

    目录 文章目录 jdk jmeter下载安装 jmeter应用启动 jmeter使用教程 jmeter测试结果分析 一 jdk jmeter下载安装 1 提前下载jdk和jmeter并配置环境 备注 jdk和jmeter版本需对应 否则后期

随机推荐

  • win10系统mysql开发常见问题集锦

    目录 一 mysql56 系统找不到指定文件 二 mysqldump Error Binlogging on server not active 无法导出数据 三 mysql备份导出的数据为空 四 mysql事件不执行 五 修改mysql密
  • python读取文件存到excel中

    用xlwt模块执行代码报下面的错 ValueError column index 256 not an int in range 256 xlwt 模块看源码说最大列只支持255列 所以超过这个值就报错了 改用xlsxwriter模块 im
  • pygame实现飞机大战-第二版代码分析

    目录 一 原代码 第一部分 精灵定义部分 第二部分 游戏运行部分 二 代码分析 一 代码整体结构 1 定义了main 2 创建游戏对象 3 启动游戏 二 局部代码分析 1 精灵的定义 2 主游戏类定义 3 主程序运行 4 细节分析 三 心得
  • Gradle for Android 第三篇( 依赖管理 )

    转自 https segmentfault com a 1190000004237922 依赖管理 这会是一个系列 所以如果你还没有看我之前的几篇文章 请先查看以下文章 Gradle for Android 第一篇 从 Gradle 和 A
  • 【论文精读】QLORA: Efficient Finetuning of Quantized LLMs

    QLORA Efficient Finetuning of Quantized LLMs 前言 Abstract Introduction Background Block wise k bit Quantization Low rank
  • element的嵌套dialog,在打开第二个dialog的时候会被遮罩层遮住

    element嵌套dialog遮罩层的问题 做项目的时候遇到一个问题 在一个弹出层的内容区做处理打开另一个弹出层时 第二个弹出层会被遮罩层遮住 点击五次之后遮罩层关闭 然后才发现 element 的dialog嵌套问题 之所以第二次弹出的会
  • 华为OD机试真题 Java 实现【区块链文件转储系统】【2023Q2 200分】,附详细解题思路

    一 题目描述 区块链底层存储是一个链式文件系统 由顺序的N个文件组成 每个文件的大小不一 依次为F1 F2 Fn 随着时间的推移 所占存储会越来越大 云平台考虑将区块链按文件转储到廉价的SATA盘 只有连续的区块链文件才能转储到SATA盘上
  • 安全基础 --- JSON + 函数声明

    JSON 格式 JSON JavaScript Object Notation缩写 是一种用于数据交换的文本格式 目的是取代繁琐笨重的 XML 格式 1 规定 复合类型的值只能是数组或对象 不能是函数 正则表达式对象 日期对象 原始类型的值
  • centos是arm还是amd_amd系列cpu安装linux

    如何在 Linux 上安装 Intel 微代码固件 linux 的内核可以在引导时更新 cpu 固件 而无需 bios 更新 处理器的微码保存在内存中 在每次启动系统时 内核可以更新这个微码 这些来自 intelamd 的微码的更新可以去修
  • unity多个贴图shader

    在一个Material上放多个贴图的测试 比如一个plane上放四个贴图 Shader aaa Properties MainTex Texture 2D white MainTex2 Texture 2D white MainTex3 T
  • Summer Holiday HDU - 1827 强连通分量+缩点

    To see a World in a Grain of Sand And a Heaven in a Wild Flower Hold Infinity in the palm of your hand And Eternity in a
  • http 11ajax.co,Internet Explorer 11 crashes when Angulars $http.post is used with large/complex json...

    I am consistently able to crash IE11 when I post large complex json object using Angulars http post method I have setup
  • (最详细!)汇编原理中OF(溢出)和CF(进位)的判断方法

    关于这个问题百度查了半天 都没有比较全面的解释 所以我来了 首先我们需要知道 al是用两位16进制的数来保存数据的 所以正数最多保存0 255 十进制 FFH 处理器内部以补码表示有符号数 8个二进制位能够表达的整数范围是 127 128
  • llama2模型部署方案的简单调研-GPU显存占用(2023年7月25日版)

    先说结论 全精度llama2 7B最低显存要求 28GB 全精度llama2 13B最低显存要求 52GB 全精度llama2 70B最低显存要求 280GB 16精度llama2 7B预测最低显存要求 14GB 16精度llama2 13
  • three.js 楼层加载动画

    three js 楼层加载动画 概述 创建场景 创建天空 创建水面 创建模型 开启模型动画 栅栏动画 概述 如有不明白的可以加QQ 2354528292 wx aichitudousien 更多教学视频请访问 https space bil
  • 跋20230325

    很久没有登录csdn 突然上号一次发现n多的评论和私信 时间跨度从2021年到2023年 感谢大家的信任 但是消息太多 且现在笔者已经没有从事相关行业 大家的问题很有深度 都是我答不上来的 这里就不一 一进行回复了 请大佬们见谅 博文都是笔
  • java字符串基础操作

    1 字符串的特点 java lang String使用了final修饰 不能被继承 字符串底层封装了字符数组及针对字符数组的操作算法 字符串一旦创建 对象内容永远无法改变 但字符串引用 可以重新赋值 Java字符串在内存中采用Unicode
  • 今天发现rabbitMQ消息堆积

    发现有三十多万的消息堆积在10的queue里没有被消费 记录一下查看问题的步骤 1 jps 找出程序的PID 2 jstack PID 查看线程dump 发现rabbitMQ的consumer worker线程block住了 Thread
  • 转眼就来字节六个月了,真的不一样

    今天来分享一个学弟 也是我老乡 阿秀 他入职字节跳动 6 个月的感受 希望给向往大厂的小伙伴一点点信心和动力 一 过去 首先来回复下有些小伙伴对字节存在的疑问 1 字节 996 的生活长期来看没有啥意义 我觉得还是挺有意义的 因为见识到了自
  • 前后端分离总结(部分)

    本文内容转载于博客 前后端分离架构概述 https blog csdn net fuzhongmin05 article details 81591072 1 背景 前后端分离已成为互联网项目开发的业界标准使用方式 通过nginx tomc