** 面试官提问:** 为什么有了 HTTP 协议后还出现了 HTTPS 协议?HTTPS 协议解决了什么问题?题目解析:在研究 HTTPS 协议之前,我们先总结下 HTTP 协议的优点和缺点:优点缺点通信方式简单:基于请求和响应,客户端发起请求,服务器端返回响应明文通信:信息明文传输,安全性低。无需维护状态:HTTP 是无状态协议,不识别客户端。没有状态:例如对于需要保持登录状态的网站,需要依靠其他外部方式(Cookie、Session)维护状态。速度快,效率高。如上表所示,HTTP 协议牺牲了安全性,换来了效率,但是在某些安全性要求高的场景,使用 HTTP 协议是不合适的。HTTP 协议的全称是 Hypertext Transfer Protocol,HTTPS 协议的全程是 Hypertext Transfer Protocol Secure,多了一个 Secure(安全)的限制词。从协议上看,HTTPS 协议基于 HTTP 协议,使用 SSL/TLS 协议对传输内容进行加密,从公式上定义:HTTP + SSL(TLS) = HTTPS。HTTPS 协议将 HTTP 协议的通信部分由 SSL 或者 TLS 协议替代,网络模型划分如下: (HTTP 和 HTTPS 模型图) 除了 SSL 协议以外,HTTPS 协议还涉及几个重要的概念:CA 证书、混淆加密方式,以及 HTTPS 协议具体的工作流程,下面我们拆分解释。
Http 是一种协议,它制定了浏览器客户端和 Web 服务端信息传递的规则,所有的浏览器厂商和所有的 Web 后台服务都是遵从这个规则来实现信息的传递的。Web 服务的信息传递从最早期单一的文字,到后来有了图片,音频视频,而 HTTP 协议随着传递信息的变化也经历了以下几个版本的变化:HTTP/0.9:于 1990 年问世,用于简单文字的交换;HTTP/1.0:被正式列为 www 传输的标准,纳入 RFC1945;HTTP/1.1:在 1.0 的基础上新增了连接方式的规约;HTTP/2.0:随着网络的应用越来越广,内容也越来越丰富。HTTP2.0 在安全,性能,交互场景都有了很大的改进。目前市场上主流的还是 HTTP/1.1 ,随便打开一个浏览器 F12 查看下网络,基本上都可以看到 版本:HTTP/1.1。但是 HTTP/2.0 作为下一代的网络协议,前景可期。因为我们现在的网络都在追求加速,在硬件不断叠加,程序不断优化,CDN资源加速,之后如果继续优化的话那就只有 HTTP 协议本身了。2.0 因为有了多路复用,协议压缩等功能,所以性能上面是要比 1.1 高出不少的,普及只是时间问题。
HTTP 协议,即超文本传输协议,是一个客户端终端(用户)和服务器端(网站)请求和应答的标准。这也是 Web 开发基础。因为大部分网站或者 Web 服务的前后端交互几乎都是走 HTTP 请求。HTTP 协议定义 Web 客户端如何从 Web 服务器请求 Web 页面,以及服务器如何把 Web 页面传送给客户端。HTTP 协议采用了请求 / 响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。HTTP 协议有如下特点:简单快速:客户向服务器请求服务时,只需传送请求方法和路径。由于 HTTP 协议简单,使得 HTTP 服务器的程序规模小,因而通信速度很快;灵活:HTTP 允许传输任意类型的数据对象;无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间;无状态:HTTP 协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。1.1.1 HTTP 常见请求在 HTTP/1.1 协议中共定义了八种方法(也叫 “动作”)来以不同方式操作指定的资源,目前我们比较常见和常用的有以下四个:GET 请求:向指定的资源发出 “显示 “请求。使用 GET 方法应该只用在读取数据,而不应当被用于产生 “副作用” 的操作中。一般在浏览器中直接敲击 URL 并按回车键是执行的 GET 请求;POST 请求:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和 / 或已有资源的修改;PUT 请求:从客户端向服务器传送的数据取代指定的文档的内容;DELETE 请求:请求服务器删除指定的页面。这四种请求和数据的增删改查(CRUD) 可以看成是相对应的,一般在设计 URL 接口时,也会默认使用这样特性,让 GET 请求对应查询数据、POST 请求对应数据的新增等等,这样的接口设计出来才会具备良好的 Restful 风格。1.1.2 HTTP 状态码HTTP 请求通常会返回一个状态码,常见的 HTTP 状态码有:2xx:正确类。表示用户请求被正确接收、理解和处理;200 - 请求成功;3xx:重定向类。表示没有请求成功,必须采取进一步的动作;301 - 资源(网页等)被永久转移到其它 URL;302 - 资源临时移动,资源只是临时被移动,客户端应继续使用原有 URI ;4xx:客户端错误。表示客户端提交的请求包含语法错误或不能正确执行;400 - 往往是 Bad Request 错误。是指请求的方法不对;401 - 用户没有访问权限,需要进行身份认证;403 - 禁止访问;404 - 资源不存在,Not Found 错误;5xx:服务端错误。一般是说明服务器出现了问题;503 - 服务端错误,一般是服务器内部处理异常。实操: 用 curl 命令模拟发送 HTTP 请求。[root@server ~]# curl -I -XGET http://www.baidu.com/index.htmlHTTP/1.1 200 OKAccept-Ranges: bytesCache-Control: private, no-cache, no-store, proxy-revalidate, no-transformConnection: keep-aliveContent-Length: 2381Content-Type: text/htmlDate: Sun, 08 Mar 2020 14:36:01 GMTEtag: "588604c8-94d"Last-Modified: Mon, 23 Jan 2017 13:27:36 GMTPragma: no-cacheServer: bfe/1.0.8.18Set-Cookie: BDORZ=27315; max-age=86400; domain=.baidu.com; path=/
面试官提问: 什么是 HTTP 报文?什么是 HTTP 报文?题目解析: 首先,我们给出 HTTP 的定义:HTTP(HyperText Transfer Protocol,超文本传输协议)是一个请求 - 响应(Request to Response)协议,位于网络模型的应用层,基于传输层的 TCP 协议。 (HTTP 请求 - 响应模型)其次,HTTP 报文是在客户端和服务器端传输的数据报文,由起始行(Start Line)、请求头部(Request Header)和请求主体(Request Body)构成,从类型上分为请求报文(Request Message)和响应报文(Response Message)。 (HTTP 报文格式)
在前面的章节中我们对 Http 已经有了一个很全面的了解,Http 在满足通信的基本功能外,也提供了很多丰富的交互功能,但是在安全性方面,Http 还有很多不足的地方,Https 就是为了解决这个问题而诞生。目前 google / 苹果 / 腾讯的小程序接口都强制要求使用 Https 安全协议。以后的网站全面采用 Https 协议已经是一个可以遇见的趋势了。
Http 底层基于 TCP 协议,分为请求和响应。请求和响应分别有各自的 Header 和 Body 组成。Header 里面通常是本次请求 / 响应的描述信息,比如版本号、长度、UA、Content-Type 等等,而 Body 里面通常就是我们要传递的业务数据了,下面分别浏览一下请求和响应的内容。
生活中的各类电商系统,学校的教务系统,工作中的各种办公软件基本上都是 Web 网站。少部分的是桌面应用,而这一部分的桌面软件也都纷纷在往 Web 应用上面迁移。因为桌面软件还需要下载 APP 安装到本地电脑,而 Web 网站你只要打开浏览器就可以直接访问,在便利性方面 Web 网站是有巨大的优势。作为互联网的从业者,我们需要了解这个表现背后的原理,那就是 Http 协议,它帮助我们将远端服务器的数据信息传输到我们浏览器的客户端。本小节,将会从历史背景,实现原理,协议是什么,几个方面让你对 Http 有一个比较深刻的了解。
本节我们将借助 Socket 实现服务的端口监听并根据 Http 协议的请求和响应结构,实现一个简单的 Web 服务器,加深体验 Web 服务和 Http 协议的原理。
HTTP 是我们进行爬虫的一个基础之一,我们通过 HTTT 协议才能顺利爬取到 HTML 里面的内容,HTTP 相当于是一条道路,HTML 等网页是道路的终点,我们必须遵守 HTTP 的交通规则,才能高效的在这条道路上运输数据。
nginx 七层方向代理处理的是 http 请求,对应的是 http 协议。如果只是转发 http 请求,可以简单使用 proxy_pass 指令即可。这和我们之前简单的反向代理示例一致。# 在转发 http 请求时,URL必须以 http 或者 https 开头 Syntax: proxy_pass URL;Default: —Context: location, if in location, limit_except在使用 prxoy_pass 指令对 http 或者 https 协议进行反向代理时,需要注意一下问题:在 URL 不携带 URI 时,会将对应的 URL 直接转发到上游服务器在 URL 携带 URI 时,会将 location 参数中匹配上的那一段替换为该URL看下面的示例配置:...http { server { listen 8000; location /test { proxy_pass http://ip:port/xyz; } } server { listen 9000; location /test { proxy_pass http://ip:port; } } }... 在代理 http 请求 http://主机ip:8000/test/abc 时,由于 proxy_pass 指令后面的 URL 带了 /xyz 这样的路径,所以转发的请求是 http:// ip:port/xyz/abc,其中匹配的 /test 已经被替换掉了。而对于第二个 http 请求 http://主机ip:9000/test/abc 时,由于 proxy_pass指令后面直接是上游服务器地址,没有带 URI,所以转发的请求为 http://ip:port/test/abc,其中匹配到的/test并没有被替换。
Socket 是传输层协议的具体软件实现,它封装了协议底层的复杂实现方法,为开发人员提供了便利的网络连接。Socket 是网络编程的基石,像 Http 的请求,MySQL 数据库的连接等绝大部分的网络连接都是基于 Socket 实现的。
Http 协议是前后端 API 接口交互的桥梁,不管你是前端开发,移动端开发,后端开发,它都是你工作必不可少的部分。在如今的生产环境中,为了快速实现逻辑业务的开发,往往这部分是被框架封装得很完整了,初学者就更加容易忽视它,以至于遇到问题无从下手。为什么我资源更新了,界面还是旧的,可能是 Http 缓存了;请求的参数该放路径还是 Body 中;接口报错了,返回的状态码看不懂;接口文档如何编写才是规范的;让 Http 协议规范自己的软件开发;虽然 Http 工具封装得很好用,但我必须搞懂它,要做工具的主人而不是奴隶,必要的时候自己造工具。
TCP/IP 的网络模型有 7 层,Http 协议是位于最上层的应用层。应用层协议的意思是它是服务于我们能体验到的一些电脑软件,QQ/邮箱/浏览器这些。应用层下面还有好几层,他们主要保障的是网络传输中的一些安全性(会话加密),可靠性(字节冗余校验),字符转字节,字节转高低电平实现信号的传输等。
握手协议(SSL Handshake Protocol):它建立在 SSL 记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。内部包括SSL握手协议(SSL HandShake Protocol)、SSL密码参数修改协议(SSL Change Cipher Spec Protocol)和SSL告警协议(SSL Alert Protocol)。记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。
TCP/IP 协议族包含了很多协议,一些比较重要的、常用的协议展现如下:依据 TCP/IP 参考模型,我们把协议栈从上到下分为 4 层,每一层都有相应的协议。应用层HTTP(Hypertext Transfer Protocol)超文本传输协议,只要你浏览页面就会用到此协议。SMTP(Simple Mail Transfer Protocol)简单邮件传输协议,用于电子邮件传输。FTP(File Transfer Protocol)文件传输协议,用于文件的上传和下载。现在 FTP 貌似用的不多了,早期主要是在公司内部、大学等研究机构用的比较多。RTMP(Real-Time Messaging Protocol)实时消息协议,用于实时流媒体传输,主要用在音视频直播领域,属于 Adobe 公司出品。不过,从 2020 年开始,Adobe 就不再支持 RTMP 协议了。SNMP(Simple Network Management Protocol)简单网络管理协议,用于电信网络设备的管理。比如,监控设备告警,对设备进行业务配置等。主要是在思科、华为等电信网络设备上用的比较多。其实,应用层除了以上诸多知名协议外,也可以是用户自定义协议。传输层TCP(Transmission Control Protocol)传输控制协议,是面向连接的、可靠的、面向字节流的传输协议。TCP 应用非常广泛,是端到端传输的基石。UDP(User Datagram Protocol)用户数据报协议,是无连接的、不可靠的、面向消息的传输协议。UDP 实时性好,效率高,在音视频传输中有着广泛的应用。网络层IPv4 (Internet Protocol version 4)此协议主要是用于 IP 分组的路由转发,是路由器主要实现的协议。我们经常说的 IP 地址是指 IPv4 地址,用 32 bit 来表示。IPv6 (Internet Protocol version 6)此协议工作原理类似 IPv4。之所以设计 IPv6 的目的是因为上世纪 90 年代中期,因特网爆炸式的增长,32 位 IPv4 地址不够用了,为此才设计了 128 位的 IPv6 地址。ICMP(Internet Control Message Protocol)因特网控制消息协议,主要是用于显示网络错误。比如,我们用 ping 的时候,有时会显示“网络不可达”的错误。ICMPv6 (Internet Control Message Protocol Version 6)整合了 ICMP 协议,针对 IPv6 开发的协议。IGMP(Internet Group Management Protocol)因特网组管理协议,主要是用于 IP Multicast 的场景,比如观看 IP 电视节目。链路层ARP(Address Resolution Protocol)地址解析协议,主要是用于生成 IP 地址和物理地址(比如以太网 MAC 地址)的映射表,用于数据包的快速转发。RARP(Reverse Address Resolution Protocol)反向地址解析协议,主要是用于生成物理地址和 IP 地址的映射。以上这些协议属于计算机网络的基础协议,需要很好的掌握其工作原理。
Http 和 TCP/IP 都是协议,它们的不同之处在于:HTTP 是浏览器和后台服务之间的语言,而 TCP/IP是电脑之间的语言(相同的语言才能互相理解双方要表达的意思)。Http 本身只是约定了传输的时候文字要是什么格式,具体文字如何转成物理的高低电平穿越电脑实现传输的过程它是不知道的。所以它需要借助专业的人士 TCP/IP 来处理。TCP/IP 是专门解决主机之间信息传输的,它不局限于为 Http 服务,像发送邮件也有自己的邮件协议(SMTP),它的底层也需要借助 TCP/IP 来实现。(TCP/IP是整套完整的网络传输框架模型,HTTP 也是属于它里面的应用层)。
迭代协议包括两方面的内容 —— 可迭代协议和迭代器协议,下面我们就来看看这两个协议都是什么。
说起 AMQP 协议,我们可能会感到有点陌生,那么为什么还要了解 AMQP 协议呢? 因为了解什么是 AMQP 协议可以为我们学习 RabbitMQ 打下知识基础,让我们很清楚的知道 RabbitMQ 是用来做什么的。AMQP 协议,即 Advanced Message Queuing Protocol,直译为高级消息队列协议,我们只要知道 AMQP 协议就是一个高级消息队列协议就行了。
TCP 协议是传输控制协议是一个面向连接的协议,所谓的面向连接表示的是通信双方在传输数据之前,需要搭建一个专用的通信线路,并且在结束的时候需要将其关闭。在有了这条专用线路作保障之后,就能准确无误的将数据传递给对方,所以 TCP 是一种可靠的通信方式,它能够准确知道对方是否成功接收了消息。
上节课我们学习了 Web 开发中必备的一些 HTML/CSS/JS 这一节中我们会继续介绍下 Web 开发中的一些基础知识,包括常用术语、HTTP 协议、 URL 的组成部分,以及网站运行原理和开发的流程。只有理解了这些基础知识,才能继续后续的 Django 学习。
首先我们从 Zookeeper 的通信协议开始说起。我们都知道最常用的网络通信协议 TCP/IP 协议,而 Zookeeper 就是基于 TCP/IP 协议实现了自己的通信方式。Zookeeper 的通信协议分为两部分,请求协议和响应协议,接下来我们分别进行介绍。
协议介绍:协议标识符,以一个固定数作为标识符,占用 4 个字节,主要目的是用来识别协议的开头,只要是以该标识开头的协议则进行处理,否则不处理。主要目的是提高处理性能问题,如果随便一个请求都需要进行处理,但是最终处理起来发现协议格式不对,抛异常,肯定会影响系统性能;数据长度,占用 4 个字节,标识数据的真实长度,获取到该值后,往后读取指定长度的数据即可。主要目的是防止粘包和拆包安全性问题;指令,协议是某个应用所有的业务公用的一种规则,那么应该如何区分是哪种业务呢?这里主要通过指令来进行区分;数据,这部分存储的是真实的数据。这算是比较简单,并且常用的设计思路,主要和 Netty 内置的基于长度域拆包器类似,基本上都是有一个字段是用来存储真实的数据长度,这样才能准确的读取数据的完整内容。当然,还可以在该设计基础上加上更多的字段,比如:使用的序列号技术、协议版本号等等。
上面说到了在实现 Symbol.iterator 方法时需要返回一个满足迭代器协议的方法。那么迭代器协议又是什么呢?迭代器协议定义了产生一系列值的一个标准方式,迭起协议规定需要返回一个带 next() 方法的对象。 next() 可以被多次执行,每次执行都会返回一个对象,该对象包含两个属性,done 和 value:done 是一个 boolean,在没有迭代完时返回 false,迭代完成后返回 true;value 就是被迭代的返回值,当 done 为 true 时可以省略。实现了以上两点才会满足一个迭代器协议。一般来说可迭代协议和迭代器协议在实际的场景中是同时存在的。下面我来看看什么是迭代器?并且怎么使用可迭代协议和迭代协议去实现一个迭代器。
UDP 又叫用户数据包协议,相对于 TCP,它是一种面向无连接的协议,也就是通信双方在交换数据之前无需建立一条专用通道,当然在通信结束前也无需释放通道。这样一来,通信的效率非常高,但缺点是我们无法确定发出去的消息对方是否能够准确收到,所以它是一个轻量不可靠的通信方式。以上的定义描述了二者主要的差异,更多细致的内容可以参考其他资料。
Http 协议根据场景约定了一系列请求返回的状态码,方便对请求结果进行细粒度管理。该状态码由互联网号码分配局维护管理。状态码是由3位数字组成,目前总共分为 5 大类,在接下来的章节中将逐一详细介绍。
思路架构图:首先,我们先来了解协议在整个通讯当中的扮演的角色,如下图所示:如上图所示,客户端和服务端之间的通讯流程:客户端发送数据客户端先把一个对象序列化成字节流;然后把字节流根据协议把字节流组装好;最后转换成二进制传输到网络。服务端接受数据从网络中读取二进制数据到本地的缓冲区;根据协议的规则读取指定数据,并且识别是否是完整的数据包;如果是完整的数据包,则转换成实体对象。由此可见,协议主要是管理字节流格式的一种规则,如果把协议环节去掉,那么服务端就无法知道字节流的结束位置。
响应协议会在接收到 Zookeeper 客户端的请求后,对请求协议进行解析并作出响应。和 Zookeeper 的请求协议相对应的,Zookeeper 的响应协议也是由响应头和响应体组成,响应体也需要根据不同的请求类型来封装响应体。在接收到 Zookeeper 客户端的请求后,由 ReplyHeader 类来解析请求头并对响应头进行封装:// ReplyHeader 类实现了 Record 接口来进行序列化操作public class ReplyHeader implements Record { // 客户端序号,记录客户端请求发起的顺序 private int xid; // 事务id private long zxid; // 错误状态码 private int err;}会话创建响应当 Zookeeper 服务端接收到 Zookeeper 客户端的会话创建请求时,使用 ConnectResponse 类来封装响应体:// ConnectResponse 类实现了 Record 接口来进行序列化操作public class ConnectResponse implements Record { // 请求协议的版本信息 private int protocolVersion; // 会话超时时间 private int timeOut; // 会话 id private long sessionId; // 密码 private byte[] passwd;}节点查询响应当 Zookeeper 服务端接收到 Zookeeper 客户端的节点查询请求时,使用 GetDataResponse 类来封装响应体:// GetDataResponse 类实现了 Record 接口来进行序列化操作public class GetDataResponse implements Record { // 节点的数据 private byte[] data; // 节点的状态 private org.apache.zookeeper.data.Stat stat;}节点更新响应当 Zookeeper 服务端接收到 Zookeeper 客户端的节点更新请求时,使用 SetDataResponse 类来封装响应体:// SetDataResponse 类实现了 Record 接口来进行序列化操作public class SetDataResponse implements Record { // 节点的状态 private org.apache.zookeeper.data.Stat stat;}介绍完 Zookeeper 的通信协议后,接下来我们要学习的是 Zookeeper 的会话,包括会话的结构,会话的状态等。
什么是可迭代协议?可以通过 JavaScript 对象定义或定制迭代行为,在 JavaScript 中有一些内置类型并且满足内置的可迭代对象,具有迭代的行为。如 Array、Map、Set 等。还有一个比如字面量对象(Object)则没有,如果要对 Object 进行迭代的话需要使用 for...in 循环,但是 for...in 在循环时需要判断是否是自身属性。所以很多时候如果想用 for...of 进行迭代时就需要使用对象上的 Object.keys() 等方法提取对象中的 keys 后再去进行遍历操作。在 ES6 中可迭代协议规定想要成为可迭代对象,这个对象必须实现 @@iterator 方法。这意味着对象(或者它原型链上的某个对象)必须有一个键为 @@iterator 的属性,可通过常量 Symbol.iterator 访问该属性。所以,一个对象满足可迭代协议的关键在于实现 Symbol.iterator 方法,这个方法的返回值是一个符合迭代器协议的对象,并且是一个无参数的函数。
2.2.1 什么是 ZAB 协议Zookeeper 使用 ZAB 协议来保证 Zookeeper 的数据一致性,ZAB 协议全称 Zookeeper Atomic Broadcast ,原子消息广播协议。ZAB 协议的两种工作模式:崩溃恢复消息广播ZAB 协议定义了三种节点状态:Looking:选举状态;Following:从节点所处的状态;Leading:主节点所处的状态。那么 ZAB 协议的这两种模式什么时候使用呢?三种节点的状态又是如何变化的呢?接下来,我们来详细了解一下 ZAB 的崩溃恢复模式是如何工作的。2.2.2 ZAB 的崩溃恢复模式在 Zookeeper 集群服务的运行过程中,如果 Leader 节点发生故障,无法处理 Follower 节点提交的事务请求,根据 ZAB 协议,此时的 Zookeeper 集群就会暂时停止对外提供服务,进入崩溃恢复。如果此时崩溃的 Leader 服务故障被排除,加入到 Zookeeper 集群中,它也会进入 Looking 状态,参与选举。Zookeeper 的崩溃恢复分为 3 个阶段:Leader election在 Leader 选举阶段,Zookeeper 服务都为 Looking 状态,每个 Zookeeper 服务都会用自身的 ZXID 和 myid 值形成选票,第一轮选举和 Zookeeper 启动时第一轮选举的结果一样,Zookeeper 服务的选票信息都是自身的信息,所以不会产生 Leader,无 Leader 产生 Zookeeper 服务就会更新自身的选票信息,进入下一轮选举,直到选举出 Leader。这一阶段选举出来的 Leader 还不能直接作为真正的 Leader 去处理事务请求,它还需要再次确认自身的数据是最新的,避免网络等原因出现多个 Leader 的情况,接下来就进入 Discovery 发现阶段。Discovery在 Discovery 发现阶段,上一阶段产生的 Follower 服务会把自身 ZXID 中的 epoch 纪元值发送给 Leader 服务,Leader 接收到所有 Follower 的 epoch 纪元值后,会选出其中最大的 epoch 纪元值,然后在这基础上进行加 1 ,作为最新的 epoch 纪元值,返回给所有的 Follower 。Follower 接收到 Leader 发送的最新 epoch 纪元值后,根据此 epoch 纪元值来更新自己的 ZXID ,然后再把更新后的 ZXID 、最新的历史事务日志和 ACK 确认信息返回到 Leader。Leader 接收到 ACK 确认信息后,把接收到最新的 ZXID 和 最新的历史事务日志和自身作比较,把最新的更新到自身。经过这一阶段就能确认 Leader 服务的数据是最新的了,然后就进入下一阶段,Synchronization 同步阶段。SynchronizationSynchronization 同步阶段的主要作用是把 Leader 最新的数据和日志同步到 Follower 中,当半数以上的 Follower 同步数据成功后,Leader 才能成为真正的 Leader ,就可以处理事务请求了。经过崩溃恢复的 3 个阶段,真正的 Leader 选举完成后,Zookeeper 就会进入消息广播模式,重新对外提供服务。
这节课会介绍一下 Web 开发中常用的一些术语,让大家对 Web 开发有一个基本的认知,能够区分一些比较常见的概念。也会对 Web 开发必备基础知识 HTTP 协议进行详细讲解,如果你想要深入了解 HTTP 协议的话,可以学习这门《HTTP 教程》。通过这一小节的学习你会知道,当我们在浏览器中输入 https://www.imooc.com 这个地址按下回车之后到浏览器将慕课网的首页呈现给我们之间到底发生了什么?这个问题也是 Web 工程师面试中必问的一个问题。除了讲解这些概念之外,老师还会结合自身的经验给大家讲解在实际工作中一个公司想要开发一个网站的具体流程是什么,大致划分为几个阶段和步骤。好了,本章的介绍到这里就结束了,下面就开始正式的课程学习啦~