一个简单的架构说明前后端数据交互过程


在这里插入图片描述

1. 外部建立连接过程

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

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

客户端和服务端建立连接

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

TCP 三次握手过程:

客户端发送连接请求,SYN 标识为1,序列号为 x(TCP规定 SYN=1 时不能携带数据,x 为随机产生的一个值),然后进入 SYN_SEND 状态。
服务器收到 SYN 报文进行确认,将 SYN 标识为 1,ACK 置为 1,序列号置为 y,Acknowledgment Number 置为 x+1,然后进入 SYN_RECV 状态,这个状态被称为半连接状态。
客户端再进行一次确认,将 ACK 置为 1(此时不用 SYN),序列号置为 x+1,Acknowledgment Number 置为 y+1 发向服务器,最后客户端与服务器都进入 ESTABLISHED 状态。

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 /staticlocation (.+) .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 配置文件,提供共享存储)

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>