一张图带你了解前后端数据流向全过程

x33g5p2x  于2021-11-12 转载在 其他  
字(2.1k)|赞(0)|评价(0)|浏览(453)

1. 外部建立连接过程

①外网客户端访问 http://www.baidu.com/ -> 地址解析

DNS 解析顺序:本地内存缓存 -> /etc/hosts -> /etc/resolv.conf -> 网卡文件 -> DNS 服务器(迭代,递归两种方式获取 IP 和域名,DNS 协议既有 TCP 又有 UDP,53 端口)

②客户端和服务端建立连接

HTTP1.1建立长连接(请求头、请求行、请求体,方式(GET、POST)

③TCP三次握手过程

TCP 建立连接的过程称为三次握手,为了确认双方收发数据的能力

1.发送方向接收方发送SYN请求

⒉接收方接收到此请求后会主动回复一个ACK,并且同时也发送一个SYN请求

3.发送方接收到接收方发来的SYN请求后,给出一个ACK确认

2. 企业内部数据交互

①防火墙(软硬件)

通过流量过滤、ACL 访问控制、黑白名单、安全组、规则过滤、SNAT、DNAT 等方式控制连接请求并交给负载均衡器

②负载均衡器

LVS+Keepalived、Haproxy、SLB、硬件负载均衡器 …

负载均衡器将流量分发给对应的业务模块( NG+Keepalived 或 apache+Keepalived

  • harpoxy 的服务端中会有 socket 连接,haproxy 的进程监听、接收然后遍历配置文件,找到转发的配置(nginx/apache 的 keepalived VIP 地址),然后对数据报文进行封装和转发,最终转发到 NG/apache 的 VIP。
    ③流量分发

流量发送到 NG/apache 的 80 端口,会被监听 80 端口的后台进程捕捉到 -> 接待请求然后遍历对应的配置文件。( socket 连接被 NG/apache 对应的后台进程捕捉到然后交给服务程序处理)

  • 第一条路径

nginx+keepalived 中的 nginx.conf 匹配 location(location 最少有三种,location /,location /static,location (.+) .jsp) , 匹 配 到 之 后 l o c a t i o n / 处 理 静 态 请 求 , 直 接 获 取 静 态 文 件 资 源 所 在 的 目 录 中 的 文 件 , 然 后 返 回 官 网 , 如 果 要 加 载 一 些 静 态 请 求 l o c a t i o n / s t a t i c / ( p n g ∣ j e p g ∣ . . . ) 。 反 向 代 理 l o c a t i o n ( . + ) . j s p ),匹配到之后 location /处理静态请求,直接获取静态文件资源所在的目录中的文件,然后返回官网,如果要加载一些静态请求 location /static/ (png|jepg|...)。反向代理 location (.+) .jsp),匹配到之后location/处理静态请求,直接获取静态文件资源所在的目录中的文件,然后返回官网,如果要加载一些静态请求location/static/(png∣jepg∣...)。反向代理location(.+).jsp () 匹配到 proxy_pass http://tomcat_server -> upstream tomcat_server 地址池后( server tomcat1_ip:port weight 2 | server tomcat2_ip:port weight 1 )-> 跳转 -> 默认会重新封装数据包 -> 将源 IP 封装为本地 IP(Nginx IP),目标 IP 封装为 tomcat_ip 执行转发(根据服务本身的路由表条目)-> tomcat

  • 第二条路径

apache 通过加载 PHP 模块进行交互,对接 PHP(共享内存)
④tomcat/php收到请求

tomcat 接收到来自 nginx_vip:80 端口的请求,会有监听在 8080 的 connector 连接器(java)捕捉到 java 进程 -> engine引擎 -> 对应的容器处理(web、jsp、serverlet)-> 遍历 web.xml、server.xml、serverlet.xml,在 serverlet.xml 主配置文件中遍历到 <Host(项目)> 项目相关的配置 -> 例如支付宝项目的位置(API),支付宝的代码会需要使用后端存储一些用户数据(新的需求)-> 通过线程池的方式 -> 获取数据。数据的来源分两种

(1) 需要通过 redis,需要发送到 redis 的 6379 端口,redis 中主要通过 内存/缓存 的方式存储一些高热数据,通过缓存命中的方式读取高热数据,如果命中了可以直接返回,不会经过 mysql。( redis 通过监听 6379 端口获取请求)

(2) 不需要经过 redis 发送给 mysql 的 3306 端口 -> 进程接待 -> 线程处理(sock 通讯文件)-> 进入到数据内部 -> 执行 SQL 语句

数据库 select 查询时的顺序:先查询索引目录 -> 有的话直接定位具体的 库.表,获取数据,没有的话遍历 库.表 中的数据,获取后返回

php 接收请求,遍历配置文件,加载对应的项目,然后也需要获取后端存储的数据库 sock 通讯文件。
共享存储 NFS 可以通过提供网络存储的方式分别为导诊平台业务和门户网站的业务提供共享存储。(可以先使用磁盘挂载 /test1 /test2 两个目录,然后通过 NFS exporter 配置文件,提供共享存储)

相关文章