web开发发展历程-前端、后端、消息队列、后端架构演进

news2024/11/18 1:51:30

文章目录

  • 摘要
  • 主要内容
  • 不同的时代对应不同的技术
  • 前端技术的中间阶段-单页面应用
  • 前后端分离
  • 后端技术演化-云计算平台
  • 总体趋势
    • 反应式编程
  • 消息队列发展史
  • kafka,rocketmq,pulsar
  • 网易后端架构演进
    • 架构瓶颈
    • 数据库瓶颈
    • 服务器瓶颈
    • 数据库缓存瓶颈-缓存击穿、雪崩
    • 网络体验瓶颈
    • 数据库容量瓶颈
    • 数据库存储、搜索瓶颈
    • 开发效率瓶颈
    • 数据库连接数量瓶颈
    • 总结
  • spring家族的一些概念

摘要

在学习web开发时,面对的总是一个一个技术,这让我感觉很割裂,不踏实。因此,我想了解web开发的发展历程,通过不同历史时期技术上、需求上的变化,更好的把握核心。

视频来源

主要内容

在这里插入图片描述
web2.0:ajax。结束了网页只能整存整取的时代,允许网页实现局部刷新。增强了网页的交互性,逼近桌面应用。

移动互联网:2010年,随着智能手机的普及。

万物互联网:在移动互联网的基础上继续发展。元宇宙

不同的时代对应不同的技术

在这里插入图片描述
在这里插入图片描述

前端技术的中间阶段-单页面应用

在这里插入图片描述
数据使用json格式进行传输,就是用一个json对象存储各项数据,客户端和服务端都有专门的用于解析json对象的工具。简单说,就是使用json统一了数据传输的格式

vue:既可以做前后端分离的项目,也可以应用于单页面应用,中庸之道

前后端分离

在这里插入图片描述
在这里插入图片描述
这个构建我倒是挺熟悉的,使用maven提供的构建命令将项目打包,上传到maven仓库,打包好的项目既可以部署,也可以被其他项目作为依赖引用

在这里插入图片描述
移动互联网前端:微信小程序

物联网智能设备:摄像头、智能家居。标准不统一,未来要统一通讯协议,就像互联网一样

网络安全:数字人民币,离线情况下也可以交易

后端技术演化-云计算平台

在这里插入图片描述

.NET: 生态不强,主要用于工业场景,政务、公司内网、流水线、地铁闸机等

总体趋势

在这里插入图片描述

反应式编程

异步非阻塞
比如HTTP服务器,对于这些服务器来说,它肯定服务的不只是一个人,它要服务很多人。如果按照同步的方法,那么服务器一次就要被一个客户端独占了。而在我们通常的使用场景中,一个客户端并不是时时刻刻都在向服务器发送请求,比如我们浏览网页的时候,我们点进去一个页面,get到服务器端返回来的页面以后,我们起码也要在这个页面上浏览好几秒钟才会再次向服务器发送请求跳转到下一个页面吧。如果服务器被一个客户端独占了,自然就没有办法响应其它客户端的请求。那肯定不行。怎么办呢?这时候就采用异步的方法。
所谓的同步和异步就好像是打电话和发邮件的区别。打电话得保证双方都得同时占线,而且双方打电话的时候就不能干其它事情了,如果电话那头话说得又非常慢,你还得耐着性子等着他说完。发邮件则不是,你给对方发邮件,对方空闲下来就会去看看邮箱,没有空的时候他就会忙他的事情。你也是,发完邮件以后你就去干自己的事情,不用像打电话一样必须等着对方说完才会去做自己的事情,这样能极大的提高对时间的利用效率。
这里也是,若HTTP服务器采用异步的方法,服务器就不会被一个客户端独占了。你向服务器发送请求,服务器不会马上响应你,而是会等到它忙忘手中的事情才回来理你。这样的话服务器不会马上响应你的需求,影响大吗?得看你的实际需求,如果你是在浏览网页,可能基本上没什么影响,因为你并不是时时刻刻都会向服务器发起请求,而是隔三岔五的请求一下。而对于服务器来说,这样它就能同时服务很多客户端了,而不会被一个客户端长时间占线。

那我还有一个问题,后端服务器是如何实现异步的????总不能是天生的吧

发展历程

即时响应性,对用户有反应:
对用户有反应我们才说响应,一般我们说的响应,基本上都说得针对跟用户来交互。只要有可能,系统就会及时响应。

回弹性,对失败有反应:
应用失败了系统不能无动于衷,不能等着它挂掉,要有反应,使其具备可恢复性。可恢复性可以通过复制、监控、隔离和委派等方式实现。在可恢复性的系统中,故障被包含在每个组件中,各组件之间相互隔离,从而允许系统的某些部分出故障并且在不连累整个系统的前提下进行恢复。当某个模块出现问题时,需要将这个问题控制在一定范围内,这便需要使用隔绝的技术,避免雪崩等类似问题的发生。或是将出现故障部分的任务委托给其他模块。回弹性主要是系统对错误的容忍。

弹性,对容量和压力变化有反应:
在不同的工作负载下,系统保持响应。系统可以根据输入的工作负载,动态地增加或减少系统使用的资源。这意味着系统在设计上可以通过分片、复制等途径来动态申请系统资源并进行负载均衡,从而去中心化,避免节点瓶颈。如果没有状态的话,就进行水平扩展,如果存在状态,就使用分片技术,将数据分至不同的机器上。

消息驱动,对输入有反应:
响应系统的输入,也可以叫做消息驱动。反应式系统依赖异步消息传递机制,从而在组件之间建立边界,这些边界可以保证组件之间的松耦合、隔离性、位置透明性,还提供了以消息的形式把故障委派出去的手段。

回压:
Backpressure 其实是一种现象,在数据流从上游生产者向下游消费者传输的过程中,上游生产速度大于下游消费速度,导致下游的 Buffer 溢出,这种现象就叫做 Backpressure 出现。这句话的重点不在于”上游生产速度大于下游消费速度”,而在于”Buffer 溢出”。回压和 Buffer 是一对相生共存的概念,只有设置了 Buffer,才有回压出现;只要设置了 Buffer,一定存在出现回压的风险。

比如我们开发一个后端服务,有一个 Socket 不断地接收来自用户的请求来把用户需要的数据返回给用户。我们服务所能承受的同时访问用户数是有上限的,假设最多只能承受 10000 的并发,再多的话服务器就有当掉的风险了。对于超过 10000 的用户,程序会直接丢弃。那么对于这个案例 10000 就是我们设置的 Buffer,当超过 10000 的请求产生时,就造成了回压的产生;而我们程序的丢弃行为,就是对于回压的处理。

对于回压我们一般有两种处理方式,一种就是上面举例中的拒绝或丢弃,这是否定应答的方式,另一种是肯定应答,先收下来,然后再慢慢处理。

反应式编程的实现范式:
反应式编程的规范可以总结为4个接口Publisher,Subscriber,Subscription,Processor

Publisher负责生成数据,并将数据发送给Subscriber。一个Subscriber对应着一个Subscription。Subscriber可以使用Subscription来管理其订阅情况。

首先是Subscriber订阅Publisher。订阅成功以后,Subscriber就会得到一个Subscription对象。Subscription中有两个方法:request方法和cancel方法。

Subscriber得到一个Subscription对象以后,就可以调用该Subscription对象的request方法,请求Publisher发送数据给Subscriber。通过调用cancel方法就可以取消对Publisher的订阅。

Processor则是用来处理Publisher发送给Subscriber的数据。

消息队列发展史

来源
计算机和生活的一个小映射:
肌糖原类似于内存,脂肪类似于磁盘。锻炼首先消耗肌糖原,其次是燃烧脂肪。吃饭首先补充的也是肌糖原,然后多的部分才会累积成脂肪

分区:相当于扩建,比如原来只有面馆1,有多个分区后,就有面馆1,面馆2、面馆i。流量增加之后,就可以通过分区实现水平扩容

在这里插入图片描述
早期的消息队列:聚焦同步调用问题。系统之间层层调用导致时延很高,但是同时又要保证同步。于是考虑是否能将一些同步操作异步化

2010:流量持续增大,数据量持续增大。吞吐量,一致性

2012:线上交易兴起。对于数据一致性要求非常高,远远高于对大流量处理的要求。

2012之后:云计算开始兴起,开始考虑标准化,平台化,避免重复造轮子。同时,这个时期的消息队列,计算节点和存储节点在同一个节点上,不利于容器化,服务容器化要求服务没有状态。如果节点有数据,节点挂了之后需要恢复数据。很困难

kafka,rocketmq,pulsar

在共用一个磁盘条件下,topic越多,kafka效率越低

rocketmq:完全顺序写
在这里插入图片描述
为了利用磁盘顺序写更快的特性,将所有topic写到一个文件中

但代价就是,读,变得更加复杂了。需要在读取的时候,挑出相应的部分。这就意味着,需要记录额外的状态,记录同一个topic的起始位置和结束位置。增加了索引文件

PS:之前做计算机视觉项目的时候,中间结果要存到txt文件中,我当时就考虑过存多个文件还是一个文件,最后我选择存一个文件。首先需要设计好存储的格式,什么时候换行,什么时候加tab等等。然后读取的时候,需要根据存储的格式,编写相应的读取逻辑来解析存储文件。不得不说,确实,存的时候简单了,读取就变得麻烦

pulsar
在这里插入图片描述
计算节点和数据节点分层,服务层全部无状态,无数据,有利于容器化

又引入了zookeeper

主从并发写入

在这里插入图片描述
在这里插入图片描述
磁盘快满了,存储层可以动态新增节点
在这里插入图片描述
如果存储层第4个节点挂了,只需要从其他节点找到第4个节点包含的数据,迁移到新增节点即可。对外无感知,运维更加简单

在这里插入图片描述
假设一艘小船就是一个topic,对于kafka、rocketmq的策略,topic3上就没有数据,整体利用率不够高

网易后端架构演进

来源
小型网站:个人开发
在这里插入图片描述
淘宝最初就是采用这套技术方案,一个月就完成了网站上线

但是流量很快就超过了这套技术方案的负载能力

架构瓶颈

在这里插入图片描述
如何用最经济的方式解决上述问题???用100万设计方案解决未来3年的架构问题,还是0成本解决未来3个月的架构问题

v2:服务与数据分离
在这里插入图片描述
在这里插入图片描述
我还没遇到过需要使用文件服务器的场景
在这里插入图片描述

数据库瓶颈

v2的方案随着流量增加又会遇到新的问题

在这里插入图片描述
数据库优化:分布式缓存,分库分表,硬件优化

v3:使用缓存优化数据库
在这里插入图片描述
空间换时间,加载局部性数据到内存,访问内存比访问磁盘快很多

用户数据,量大,不适合本地缓存,可以放到远程缓存;字典数据可以放本地

常用缓存:redis,memcache
redis也是一种轻量化的消息队列组件,其架构与kafka、rocketmq、pulsar都不一样

服务器瓶颈

v3又支撑了几个月
在这里插入图片描述
高并发,提升网站并发处理能力

并发请求数量很大,超出单台计算机处理能力

v4:应用服务集群
应用服务器集群
在这里插入图片描述
为什么用集群服务器,不用更强的服务器???众人拾柴火焰高,李元霸太少,并且李元霸本身也有上限,他一个人能修长城,能修金字塔吗!!还有个就是成本问题,多个小机器的成本远远低于一个大机器

在这里插入图片描述
nginx工作在应用层,LVS工作在传输层,LVS更快,可以处理更高的并发

数据库缓存瓶颈-缓存击穿、雪崩

在这里插入图片描述

v5:数据库读写分离
在这里插入图片描述
主库负责写,从库负责读,主从数据要一致

DAO层的写法不能变,增加模块专门负责数据库操作的转发

在这里插入图片描述

网络体验瓶颈

在这里插入图片描述
v6:反向代理+CDN加速
在这里插入图片描述
CDN:内容分发网络。不是一台机器,而是一个网络。网络的节点就是设置在各地的CDN服务器,比如在重庆,东北,新疆等。缓存静态资源

反向代理:也是用于缓存静态资源

反向代理部署在核心系统的外围,CDN则是在各地部署

在这里插入图片描述

数据库容量瓶颈

在这里插入图片描述
v7:分布式文件系统,分布式数据库系统,分库分表
在这里插入图片描述
分布式文件系统怎么做??
在这里插入图片描述
HDFS:大数据分布式文件系统。大文件,至少128M

比如有几百T的文件。

数据库存储、搜索瓶颈

在这里插入图片描述
在这里插入图片描述
v8:NoSQL、搜索引擎
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

开发效率瓶颈

在这里插入图片描述
v9:业务拆分

在这里插入图片描述

数据库连接数量瓶颈

之前咋应用服务器数量有限的情况下,数据库就难以招架了,现在应用服务器的数量提升了几个数量级,导致数据库可供连接的接口不够了(连接池用完了)

在这里插入图片描述
v10:分布式服务(服务化),微服务

在这里插入图片描述

微服务架构需要配置中心,所有的服务都要在配置中心进行注册,这样在分发请求的时候才找得到对应的服务

在这里插入图片描述
springcloud:完整的微服务解决方案
dubbo:RPC开发框架

在这里插入图片描述
PS:微服务架构不要无脑上,对硬件资源的消耗很大,一定要根据实际情况选择

总结

在这里插入图片描述

spring家族的一些概念

SSM:spring + spring mvc + mybatis

Spring 是一个开源应用框架,提供了IOC(控制反转)和AOP(面向切面编程),使得开发者能够写出松耦合、易于测试的代码。Spring框架的核心功能可以通过几种方式结合起来,例如:通过Spring MVC提供Web应用开发,通过Spring Cloud提供分布式系统的集成服务。

Spring MVC 是基于Servlet的一个MVC框架,用于构建Web应用。它与Spring框架紧密集成,简化了Web应用的开发。

Spring Cloud 是一系列工具,提供了快速构建分布式系统的通用模式,例如配置管理、服务发现、智能路由、微代理、控制总线、全局锁等。它集成了诸如Netflix OSS等框架,并且使用Spring Boot风格进行封装。

Spring Boot 是一个快速开发的工具,它用于创建独立的、生产级的Spring应用。Spring Boot通过一系列的自动配置来简化Spring应用的开发,使用Spring Boot,你可以“just run”你的应用。

分界线
Spring:一个通用的、用于Enterprise Java的开源应用框架。

Spring MVC:一个MVC的实现,用于构建Web应用。

Spring Cloud:一系列工具,用于快速构建分布式系统的通用模式。

Spring Boot:一个用于快速开发、快速运行、快速部署的工具。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1550308.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Boot:Web开发之三大组件的整合

Spring Boot 前言Spring Boot 整合 ServletSpring Boot 整合 FilterSpring Boot 整合 Listener 前言 在 Web 开发中,Servlet 、Filter 和 Listener 是 Java Web 应用中的三大组件。Servlet 是 Java 代码,通过 Java 的 API 动态的向客户端输出内容。Filt…

7.3*3卷积核生成

1.卷积核 在数字图像处理中的各种边沿检测、滤波、腐蚀膨胀等操作都离不开卷积核的生成。下面介绍如何生成各种3X3的卷积核。为后面的数字图像操作打下基础。   由于图像经过卷积操作后会减少两行两列,因此在生成卷积核的时候一般会对图像进行填充,填充…

day 36 贪心算法 part05● 435. 无重叠区间 ● 763.划分字母区间 ● 56. 合并区间

一遍过。首先把区间按左端点排序,然后右端点有两种情况。 假设是a区间,b区间。。。这样排列的顺序,那么 假设a[1]>b[0],如果a[1]>b[1],就应该以b[1]为准,否则以a[1]为准。 class Solution { public:static bo…

一个基于.NET Core构建的简单、跨平台、模块化的商城系统

前言 今天大姚给大家分享一个基于.NET Core构建的简单、跨平台、模块化、完全开源免费(MIT License)的商城系统:Module Shop。 商城后台管理端功能 商品:分类、品牌、单位、选项(销售属性)、属性、属性模…

人脸68关键点与K210疲劳检测

目录 人脸68关键点检测 检测闭眼睁眼 双眼关键点检测 计算眼睛的闭合程度: 原理: 设置阈值进行判断 实时监测和更新 拓展:通过判断上下眼皮重合程度去判断是否闭眼 检测嘴巴是否闭合 提取嘴唇上下轮廓的关键点 计算嘴唇上下轮廓关键点之间的距…

LangChain入门:2.OpenAPI调用ChatGPT模型

快速入门 本篇文章正式进入LangChain的编码阶段,今天实现的功能是使用OpenAPI调用ChatGPT模型来进行文本问答。 1. 申请OpenAPI的访问令牌 这里介绍两种获取到OpenAPI访问令牌的方式,大家按照自己需求进行选择,之后的文章我会基于第二种选…

政安晨:【深度学习神经网络基础】(二)—— 神经元与层

政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 收录专栏: 政安晨的机器学习笔记 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正! 神经元是深度学习神经网络中的基本单元,模拟了…

淘宝详情数据采集(商品上货,数据分析,属性详情,价格监控),海量数据值得get

淘宝详情数据采集涉及多个环节,包括商品上货、数据分析、属性详情以及价格监控等。在采集这些数据时,尤其是面对海量数据时,需要采取有效的方法和技术来确保数据的准确性和完整性。以下是一些关于淘宝详情数据采集的建议: 请求示…

DevSecOps平台架构系列-互联网企业私有化DevSecOps平台典型架构

目录 一、概述 二、私有化DevSecOps平台建设思路 2.1 采用GitOps公有云建设 2.2 采用GitOps私有云建设 2.3 总结 三、GitOps及其生态组件 3.1 采用GitOps的好处 3.1.1 周边生态系统齐全 3.1.2 便于自动化的实现 3.1.3 开发人员属性GitOps 3.2 GitOps部分生态组件介绍…

红黑树的Java实现

红黑树的Java实现 文章目录 红黑树的Java实现一、概述二、添加元素三、删除元素四、完整代码总结 一、概述 红黑树也是一种二叉平衡搜索树,向比与AVL树,是一种弱平衡树。因为AVL树是通过平衡因子,左右树的高度相差不能大于1来保证平衡&#…

实测梳理一下kafka分区分组的作用

清空topickafka-topics.sh --bootstrap-server localhost:9092 --delete --topic second创建分区kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 3 --topic second发kafka-console-producer.sh --bootstrap-server localhos…

ospf实验

基础配置 如上图所示,按照上图所示的配置,俩个路由器之间按照12.12.12.X/30网段配置,左端的路由器和交换机之间按照192.168.1.X网段配置,右端的路由器和交换机之间按照192.168.2.X网段配置,下面的两个pc机按照所对应的…

Java 学习和实践笔记(48):怎样用二维数组来存储表格数据?

怎样用数组的方式,来存储下面这个表格的数据? 示例代码如下: import java.util.Arrays;public class Test001 {public static void main(String[] args) {/*object类对象是类层次结构的根。每个类都有Object作为超类。所有对象,包…

使用llamafile 构建本地大模型运用

安装 https://github.com/Mozilla-Ocho/llamafile 下载 大模型文件,选择列表中任意一个 wget https://huggingface.co/jartine/llava-v1.5-7B-GGUF/resolve/main/llava-v1.5-7b-q4.llamafile?downloadtrue https://github.com/Mozilla-Ocho/llamafile?tabre…

软件部署资源计算工具:精确评估资源需求

软件部署资源计算工具:精确评估资源需求 在当今快速发展的信息技术时代,软件部署已成为企业运营不可或缺的一部分。然而,一个常见的挑战是如何精确评估软件部署所需的资源。资源评估不仅关系到软件的性能和稳定性,还直接影响到成…

区块链食品溯源案例实现(二)

引言 随着前端界面的完成,我们接下来需要编写后端代码来与区块链网络进行交互。后端将负责处理前端发送的请求,调用智能合约的方法获取食品溯源信息,并将结果返回给前端。 通过前后端的整合,我们可以构建一个食品溯源系统&#xf…

【第三方登录】Twitter

创建应用 APPID 和 相关回调配置 重新设置api key 和 api secret 设置回调和网址 还有 APP的类型 拿到ClientID 和 Client Secret 源码实现 获取Twitter 的登录地址 public function twitterUrl() {global $db,$request,$comId;require "inc/twitter_client/twitte…

2018年亚马逊云科技推出基于Arm的定制芯片实例

2018年,亚马逊云技术推出了基于Arm的定制芯片。 据相关数据显示,基于Arm的性价比比基于x86的同类实例高出40%。 这打破了对 x86 的依赖,开创了架构的新时代,现在能够支持多种配置的密集计算任务。 这些举措为亚马逊云技术的其他创…

《数据结构学习笔记---第三篇》---单链表具体实现

目录 1.链表 1.1 链表的概念及结构 2.不带头单链表的实现 2.1创建头文件“SList.h” 2.2 创建具体接口实现文件SList.c 2.2.1打印 2.2.2申请链表结点 2.2.3创建一个长度为n的链表 2.2.4尾插尾删 2.2.5头插头删 2.2.6寻找x元素,返回pos 2.2.7插入和删除pos…

基于模糊控制算法的倒立摆控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 对倒立摆模型进行模糊控制器simulink建模,利用倒立摆的摆角角度与小车的位置来控制小车的推力,控制了倒立摆的摆角问题,使得小车最终停在稳…