简介:本文深入解析网关概念,对比Nginx正反向代理与负载均衡机制,结合Spring Cloud Gateway实战案例,帮助开发者掌握微服务架构下的流量管理核心技能。
网关(Gateway)作为微服务架构中的关键组件,承担着流量入口、协议转换、安全控制等核心职能。其本质是请求的”交通警察”,通过统一入口管理所有外部请求,实现服务解耦与安全隔离。
典型应用场景包括:
传统网关(如硬件负载均衡器)逐渐被软件定义网关取代,现代网关呈现三大趋势:
| 特性 | 正向代理 | 反向代理 |
|---|---|---|
| 客户端感知 | 知道代理存在 | 不知道后端真实服务 |
| 典型场景 | 科学上网/企业内网穿透 | CDN加速/负载均衡 |
| 配置位置 | 客户端配置 | 服务器端配置 |
正向代理示例(客户端配置):
# client-side proxy.confserver {listen 8080;resolver 8.8.8.8;location / {proxy_pass http://$http_host$request_uri;}}
反向代理示例(服务端配置):
# server-side nginx.confupstream backend {server app1.example.com:8080;server app2.example.com:8080;}server {listen 80;location / {proxy_pass http://backend;proxy_set_header Host $host;}}
Nginx支持5种核心负载均衡策略:
upstream backend { server a; server b; }server a weight=3; server b weight=1;ip_hash;(会话保持)least_conn;hash $request_uri consistent;动态权重配置示例:
upstream dynamic_backend {server app1.example.com:8080 weight=5;server app2.example.com:8080 weight=3;server backup.example.com:8080 backup;}
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;server {location / {limit_req zone=one burst=5;proxy_pass http://backend;}}
server {listen 443 ssl;ssl_certificate /path/to/cert.pem;ssl_certificate_key /path/to/key.pem;ssl_protocols TLSv1.2 TLSv1.3;location / {proxy_pass http://backend;proxy_set_header X-Forwarded-Proto https;}}
Spring Cloud Gateway基于以下核心概念构建:
# application.ymlspring:cloud:gateway:routes:- id: user_serviceuri: lb://user-servicepredicates:- Path=/api/users/**filters:- AddRequestHeader=X-Request-ID, ${random.uuid}
public class CustomTimePredicate implements Predicate<ServerWebExchange> {private final LocalTime startTime;private final LocalTime endTime;public CustomTimePredicate(LocalTime startTime, LocalTime endTime) {this.startTime = startTime;this.endTime = endTime;}@Overridepublic boolean test(ServerWebExchange exchange) {LocalTime now = LocalTime.now();return now.isAfter(startTime) && now.isBefore(endTime);}}// 注册方式@Beanpublic RouteLocator customRouteLocator(RouteLocatorBuilder builder) {return builder.routes().route("time_route", r -> r.path("/timed/**").and().filter(new CustomTimeFilter()).uri("http://example.org")).build();}
public class LoggingGlobalFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {log.info("Pre-Filter: Path={}, Headers={}",exchange.getRequest().getPath(),exchange.getRequest().getHeaders());return chain.filter(exchange).then(Mono.fromRunnable(() -> {log.info("Post-Filter: Status={}",exchange.getResponse().getStatusCode());}));}@Overridepublic int getOrder() {return -1; // 高优先级}}
@Beanpublic RateLimiterConfig rateLimiterConfig(RateLimiterRegistry registry) {return registry.rateLimiter("apiLimiter",config -> config.setRateLimiter(RedisRateLimiter.of(10, 20)));}@Beanpublic RouteLocator rateLimitRoute(RouteLocatorBuilder builder, RateLimiterConfig config) {return builder.routes().route("rate_limited", r -> r.path("/api/**").filters(f -> f.requestRateLimiter(c -> c.setRateLimiterKeyResolver(exchange -> Mono.just(exchange.getRequest().getPath())))).uri("lb://service")).build();}
| 维度 | Nginx | Spring Cloud Gateway |
|---|---|---|
| 协议支持 | HTTP/TCP/UDP | HTTP/WebSocket |
| 动态路由 | 需配合Consul/Eureka | 原生支持 |
| 熔断机制 | 需集成Hystrix | 内置Resilience4j |
| 配置方式 | 静态文件/Lua脚本 | Java DSL/YAML |
| 适用场景 | 传统负载均衡/CDN | 微服务架构/云原生 |
推荐分层架构:
典型配置示例:
# 边缘层Nginx配置upstream scg_cluster {server scg1.example.com:8080;server scg2.example.com:8080;}server {listen 443 ssl;location /api/ {proxy_pass http://scg_cluster;proxy_set_header Host $host;}location /static/ {root /var/www/html;expires 30d;}}
连接池调优:
proxy_http_version 1.1;proxy_set_header Connection "";keepalive_timeout 75s;keepalive_requests 100;
缓冲区设置:
proxy_buffers 16 8k;proxy_buffer_size 4k;proxy_busy_buffers_size 16k;
Reactor调优:
线程池配置:
spring:cloud:gateway:httpclient:pool:max-connections: 200acquire-timeout: 45s
502 Bad Gateway:
路由不生效:
Nginx监控:
http {stub_status on;access_log /var/log/nginx/access.log combined;}
Spring Cloud Gateway监控:
@Beanpublic MicrometerMetricsRouteFilter metricsFilter(MeterRegistry registry) {return new MicrometerMetricsRouteFilter(registry);}
通过Prometheus + Grafana构建可视化看板,重点关注:
本文通过理论解析与实战案例相结合的方式,系统阐述了网关技术的核心概念与实现方案。开发者可根据实际业务场景,选择Nginx或Spring Cloud Gateway构建适合的流量管理方案,并通过持续监控与优化保障系统稳定性。