首先,一个请求从Web或者移动App上发起,请求的URL是用域名标识的,比如taobao.com这样,而HTTP网络通信需要得到IP地址才能建立连接,所以先要进行域名解析,访问域名解析服务器DNS,得到域名的IP地址。
这一过程主要涉及相关的网络通信的知识。你应该知道HTTP协议是运行在TCP/IP基础上的,依靠TCP/IP协议来实现数据 的可靠传输。所以浏览器要用HTTP协议收发数据,首先要做的就是建立TCP连接。因为我们在地址栏里直接输入了"www.taobao.com"通过DNS服务器映射为IP地址后,Web服务器的默认端口是80,所以浏览器就要依 照TCP协议的规范,使用“三次握手”建立与Web服务器的连接。经过 SYN、SYN/ACK、ACK的三个包之后,浏览器与服务器的TCP连接就建立起来了。有了可靠的TCP连接通道后,HTTP协议就可以开始工作了。于是,浏览器按照HTTP协议规定的格式,通过 TCP发送某个“GET / HTTP/1.1”请求报文。Web服务器收到报文后在内部就要处理这个请求。同样也是依据HTTP协议的规定,解析报文,看看浏览器 发送这个请求想要干什么。它一看,原来是要求获取某些资源文件,好吧,那我就从磁盘上把那个文件全读出来,再拼成符合 HTTP格式的报文,发回去吧。此时返回一个响应头为“HTTP/1.1 200 OK”的包,底层走的还是TCP协议。同样的,浏览器也要给服务器回复一个TCP的ACK确认,“你的响应报文收到了,多谢。”至此,“键入网址再按下回车”的全过程就结束了。在HTTP1中,由于HTTP/1.1长连接特性,默认不会立即关闭连接。但一段时间后还是会执行四次挥手的过程。
上述仅仅涉及到网络通信知识的基础。下面针对后端的其他知识,继续进行扩展。
通过DNS服务器得到的这个IP地址其实也不是淘宝的服务器的IP地址,而是CDN服务器的IP地址,CDN服务器提供距离用户最近的静态资源缓存服务,比如图片、JS、CSS这些。如果CDN有请求需要的资源就直接返回,如果没有,再把请求转发给真正的淘宝数据中心服务器。请求到达数据中心后,首先处理请求的是负载均衡服务器,它会把这个请求分发给下面的某台具体服务器处理。
这台服具体的服务器通常是反向代理服务器,这里同样缓存着大量的静态资源,淘宝也会把一些通常是动态资源的数据,比如我们购物时经常访问的商品详情页,把整个页面缓存在这里,如果请求的数据在反向代理服务器,就返回;如果没有,请求将发给下一级的负载均衡服务器。
这一级的负载均衡服务器负责应用服务器的负载均衡,将请求分发给下面某个具体应用服务器处理,淘宝是用Java开发的,也就是分发被某个Java Web容器处理。事实上,淘宝在Java Web容器之前,还前置了一台Nginx服务器,做一些前置处理。
应用服务器根据请求,调用后面的微服务进行逻辑处理。如果是一个写操作请求,比如下单请求,应用服务器和微服务之间通过消息队列进行异步操作,避免对后面的数据库造成太大的负载压力。
微服务如果在处理过程中需要读取数据,会去缓存服务器查找,如果没有找到,就去数据库查找,或者NoSQL数据库,甚至用搜索引擎查找,得到数据后,进行相关计算,将结果返回给应用服务器。
应用服务器将结果包装成前端需要的格式后继续返回,经过前面的访问通道,最后到达用户发起请求的地方,完成一次互联网请求的旅程。如果用架构图表示的话,就是下面的样子。
图来自《大型网站技术架构:核心原理与案例分析》一书