解析HTTP请求从NG到网关再到具体服务的流程
数据模拟:
1.前端请求url:http://mum-baby/api/order/buy
2.网关3台机器,网关实例IP为10.0.1.101~103
整体请求如下
用户 → DNS域名解析→ 云负载均衡器(SLB/ALB) → Nginx集群(多台ECS) → Spring Cloud Gateway → 订单服务(Order Service)1. 云负载均衡器配置(以阿里云SLB为例)
核心配置步骤
1.1 创建负载均衡实例
(1)类型:选择「应用型负载均衡(ALB)」或「四层负载均衡(SLB)」。
(2)网络类型:公网或私网(根据业务需求)。
1.2 配置监听器
(1)前端协议:HTTP/HTTPS(如启用HTTPS需上传证书)。
(2)端口:80(HTTP)或 443(HTTPS)。
(3)后端协议:HTTP,端口80(指向Nginx集群)。
1.3 添加后端服务器组
将多台Nginx服务器(ECS实例)添加到服务器组。
健康检查:
(1)检查路径:/health(需在Nginx配置健康检查端点)。
(2)检查间隔:5秒。
(3)超时时间:2秒。
(4)健康阈值:2次成功标记节点健康。
(5)不健康阈值:3次失败标记节点不健康。
2.Nginx配置(每台ECS实例)
定义Spring Cloud Gateway集群(假设网关实例IP为10.0.1.101~103)upstreamspring_cloud_gateway {server10.0.1.101:8080weight=5;权重配置server10.0.1.102:8080weight=3;server10.0.1.103:8080weight=2;keepalive32;连接池复用,减少TCP握手开销}server{listen80;server_namewww.mum-baby.com;健康检查端点(供云负载均衡器调用)location= /health {access_logoff;return200"OK"; }静态资源缓存(图片、CSS/JS)location~* \.(jpg|png|css|js)${root/data/static;expires30d;access_logoff; }动态请求转发至Spring Cloud Gatewaylocation/ {proxy_passhttp://spring_cloud_gateway;proxy_set_headerHost$host;透传域名proxy_set_headerX-Real-IP$remote_addr;透传用户真实IPproxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;代理链IP记录性能优化proxy_http_version1.1;proxy_set_headerConnection"";proxy_connect_timeout3s;连接网关超时时间proxy_read_timeout10s;读取网关响应超时时间容错机制proxy_next_upstreamerrortimeout http_500 http_502 http_503; } }配置解析
健康检查:云负载均衡器通过/health端点定期检查Nginx存活状态。静态资源缓存:直接由Nginx处理,减少网关压力。动态请求转发:所有非静态请求均转发至Spring Cloud Gateway集群,通过upstream实现负载均衡。3. Spring Cloud Gateway配置
核心配置:路由规则与鉴权
spring:cloud:gateway:routes:-id:order-serviceuri:lb://order-service通过服务名负载均衡(需集成注册中心如Nacos)predicates:-Path=/api/order/**匹配路径规则-Host=www.mum-baby.com仅处理指定域名的请求filters:-StripPrefix=1去掉前缀/api/order-AddRequestHeader=X-User-Id,${header.Authorization}透传用户身份集成Sentinel限流sentinel:enabled:trueeager:truetransport:dashboard:localhost:8080注册中心配置(以Nacos为例)application:name:api-gatewaycloud:nacos:discovery:server-addr:10.0.2.100:8848配置解析
路由规则:将/api/order/**的请求路由至order-service服务。使用lb://order-service表示通过注册中心(如Nacos)动态发现服务实例。过滤器:StripPrefix=1:移除路径前缀/api/order,实际转发路径为/buy。AddRequestHeader:透传用户身份信息(如JWT Token)。限流集成:结合Sentinel实现熔断与限流,保护订单服务。4.完整请求流程示例
用户请求:http://mum-baby/api/order/buy
4.1DNS解析
域名mum-baby解析到云负载均衡器的公网IP(如120.76.25.100)。
4.2云负载均衡器处理
根据配置的负载均衡算法(如加权轮询),将请求分发到某一台Nginx服务器(如ECS实例10.0.1.1:80)。
4.3 Nginx转发至网关
Nginx根据location /规则,将请求转发至spring_cloud_gateway集群中的某个网关实例(如10.0.1.101:8080)。请求头透传:Host:www.mum-baby.comX-Real-IP:123.60.25.17(用户真实IP)X-Forwarded-For:123.60.25.17,10.0.1.1(NginxIP)4.4 Spring Cloud Gateway路由
(1)网关根据Path=/api/order/**和Host=mum-baby匹配路由规则。
(2)移除路径前缀/api/order,转发请求至order-service服务的/buy端点。
(3)通过注册中心(Nacos)获取order-service的实例列表(如10.0.3.101:8080)。
4.5 订单服务处理
(1)订单服务接收请求,执行库存扣减、生成订单等逻辑。
(2)返回响应(如{"orderId": "20231001123456"}),沿原路返回至用户。