第43篇:微服务网关:Spring Cloud Gateway,统一接口入口
专栏Spring Cloud 微服务实战全套教程在微服务架构中我们会将单体应用拆分为用户服务、订单服务、商品服务、支付服务等多个独立微服务。服务数量增多后会出现诸多问题客户端需要维护多个服务接口地址、接口权限重复校验、无法统一限流管控、请求链路杂乱难以运维。为解决以上痛点API网关成为微服务架构的核心门面组件而Spring Cloud Gateway是Spring Cloud官方推出的新一代网关框架替代了老旧的Zuul网关具备高性能、异步非阻塞、功能丰富、适配微服务生态等优势。本文将从零讲解Spring Cloud Gateway核心原理、核心组件、配置方式结合过滤器、Sentinel限流熔断完成一套可落地的微服务网关实战方案。一、微服务网关核心作用网关是所有微服务的统一入口、流量大门所有客户端请求前端、第三方接口必须先经过网关再由网关转发至对应微服务核心能力分为四大类1.1 统一入口收口流量屏蔽后端微服务的真实地址与部署结构客户端仅需对接网关一个地址无需维护多个服务接口简化客户端调用逻辑同时隐藏后端服务细节提升架构安全性。1.2 路由转发负载均衡根据请求路径、请求方式、请求参数等规则精准将请求转发到对应的微服务实例同时整合Spring Cloud负载均衡机制实现多实例流量分发提升服务可用性。1.3 统一权限控制在网关层统一完成Token校验、权限拦截、身份认证无需在每个微服务重复开发鉴权逻辑实现权限逻辑统一维护、统一升级。1.4 限流熔断、流量防护整合Sentinel、Resilience4j等组件在网关层实现全局限流、接口限流、熔断降级、流量整形避免流量洪击、服务雪崩保护后端微服务集群稳定运行。额外拓展能力日志统一打印、请求响应加密解密、跨域统一处理、接口监控统计、灰度发布等所有通用流量处理逻辑均可下沉到网关层实现。二、Spring Cloud Gateway 核心概念Spring Cloud Gateway 的核心架构由Route路由、Predicate断言、Filter过滤器三大核心组件组成所有网关功能均基于这三者实现。2.1 Route 路由核心单元路由是网关最基础的转发单元是一套完整的请求转发规则。每一个路由包含4个核心属性id路由唯一标识自定义命名保证全局唯一uri请求转发的目标地址支持静态地址和服务注册中心地址lb://服务名predicates断言规则请求匹配所有断言后才会触发该路由filters过滤器集合对匹配的请求/响应进行预处理、后处理2.2 Predicate 断言匹配规则断言是请求匹配条件Spring Cloud Gateway内置十余种断言工厂用于匹配HTTP请求的各类属性只有请求满足所有断言条件才会命中当前路由。常用内置断言如下断言类型匹配规则配置示例Path匹配请求路径- Path/order/**Method匹配请求方式- MethodGET,POSTHeader匹配请求头参数- Headertoken,.*Query匹配请求参数- QueryuserIdAfter匹配请求时间- After2025-01-01T00:00:0008:00[Asia/Shanghai]2.3 Filter 过滤器逻辑处理过滤器用于对命中路由的请求、响应进行加工处理分为前置过滤器请求转发前执行和后置过滤器请求响应后执行是网关实现鉴权、限流、日志、参数修改的核心。过滤器整体分为两大类局部过滤器仅对当前路由生效、全局过滤器对所有路由生效。三、网关路由配置实战静态动态路由接下来通过实战演示两种主流路由配置方式静态路由配置文件硬编码、动态路由基于Nacos配置中心热更新。3.1 环境依赖准备网关项目核心依赖Spring Boot 2.7.x Spring Cloud Alibaba 2021重点注意网关项目不能引入web依赖否则会冲突。!-- 网关核心依赖 -- dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-starter-gateway/artifactId /dependency !-- Nacos服务注册发现 -- dependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId /dependency !-- 负载均衡依赖 -- dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-starter-loadbalancer/artifactId /dependency3.2 静态路由配置yml文件静态路由直接在application.yml中配置适合固定不变的路由规则支持负载均衡转发到注册中心服务。spring: cloud: gateway: # 开启网关 enabled: true # 路由配置 routes: # 订单服务路由 - id: order-service-route # lb代表负载均衡转发到nacos中的order-service服务 uri: lb://order-service predicates: # 匹配所有/order开头的请求 - Path/order/** # 仅允许GET、POST请求 - MethodGET,POST # 用户服务路由 - id: user-service-route uri: lb://user-service predicates: - Path/user/**配置说明客户端请求http://网关IP/order/list会自动转发到 nacos 中的 order-service 服务实现接口统一转发。3.3 动态路由配置Nacos热更新静态路由需重启服务生效生产环境推荐动态路由基于Nacos配置中心实现路由规则热更新无需重启网关服务。核心原理监听Nacos配置变更实时刷新网关路由表。实现步骤如下1. 引入Nacos配置中心依赖dependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-starter-alibaba-nacos-config/artifactId /dependency2. 编写动态路由配置类Configuration RefreshScope public class GatewayDynamicRouteConfig { Bean public RouteLocator customRouteLocator(RouteLocatorBuilder builder) { return builder.routes() // 商品服务动态路由 .route(goods-service-route, r - r.path(/goods/**) .uri(lb://goods-service)) .build(); } }3. Nacos配置中心新增网关路由配置修改配置后网关实时生效无需重启服务。四、全局过滤器与局部过滤器实战过滤器是网关实现通用业务逻辑的核心下面分别演示局部过滤器、全局过滤器的开发与使用以常用的Token鉴权为例。4.1 局部过滤器单路由生效局部过滤器仅对当前配置的路由生效适合单个服务的特殊拦截规则。这里使用内置过滤器实现请求头参数过滤。spring: cloud: gateway: routes: - id: order-service-route uri: lb://order-service predicates: - Path/order/** filters: # 局部过滤器去除请求路径前缀 - StripPrefix1 # 局部过滤器添加请求头 - AddRequestHeadersource,gateway4.2 全局过滤器全路由生效全局过滤器对网关所有路由生效适合全局通用逻辑Token鉴权、跨域处理、日志打印、请求拦截等。自定义全局Token鉴权过滤器实战Component Order(-100) // 优先级最高最先执行 public class AuthGlobalFilter implements GlobalFilter { Override public MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain) { ServerHttpRequest request exchange.getRequest(); // 1. 获取请求token String token request.getHeaders().getFirst(token); // 2. 简单校验token生产环境需完善JWT校验 if (StringUtils.isEmpty(token)) { ServerHttpResponse response exchange.getResponse(); response.setStatusCode(HttpStatus.UNAUTHORIZED); return response.setComplete(); } // 3. 校验通过放行请求 return chain.filter(exchange); } }代码说明通过Order设置过滤器执行优先级数值越小优先级越高保证鉴权逻辑优先执行无Token的请求直接拦截返回401未授权。五、网关限流熔断Sentinel集成实战流量防护是网关核心能力生产环境必须配置限流熔断。本文采用Sentinel Gateway实现网关层全局限流、接口限流、熔断降级。5.1 引入Sentinel网关依赖!-- Sentinel网关限流依赖 -- dependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-starter-alibaba-sentinel/artifactId /dependency dependency groupIdcom.alibaba.cloud/groupId artifactIdsentinel-spring-cloud-gateway-adapter/artifactId /dependency5.2 网关限流规则配置基于Sentinel实现路由维度限流对订单服务接口设置每秒最大请求数超出流量直接限流。Configuration public class SentinelGatewayConfig { Bean public GatewayRuleManager gatewayRuleManager() { // 初始化网关限流规则 ListGatewayFlowRule rules new ArrayList(); // 针对order-service-route路由限流 GatewayFlowRule rule new GatewayFlowRule(order-service-route) .setCount(10) // 每秒最大请求数10 .setIntervalSec(1); // 统计时间窗口1秒 rules.add(rule); GatewayRuleManager.loadRules(rules); return new GatewayRuleManager(); } }5.3 自定义限流降级返回结果默认限流返回英文提示自定义友好降级响应Component public class GatewayBlockHandler implements BlockRequestHandler { Override public MonoServerHttpResponse handleRequest(ServerWebExchange exchange, Throwable t) { // 构建统一限流返回结果 MapString,Object result new HashMap(); result.put(code,500); result.put(msg,请求过于频繁请稍后再试); result.put(data,null); ServerHttpResponse response exchange.getResponse(); response.getHeaders().setContentType(MediaType.APPLICATION_JSON); DataBuffer buffer response.bufferFactory().wrap(JSON.toJSONString(result).getBytes(StandardCharsets.UTF_8)); return response.writeWith(Mono.just(buffer)); } }六、完整网关实战总结与项目架构6.1 整体架构流程客户端请求 → Spring Cloud Gateway网关 →全局过滤器鉴权→断言匹配路由→Sentinel限流校验→ 局部过滤器处理 → 负载均衡转发至后端微服务 → 响应返回6.2 核心功能落地清单✅ 统一流量入口隐藏后端服务地址✅ 静态动态双模式路由配置支持热更新✅ 全局局部过滤器实现统一鉴权、参数处理✅ Sentinel网关限流熔断实现流量防护✅ 整合Nacos服务发现、负载均衡七、常见踩坑总结依赖冲突网关项目禁止引入spring-boot-starter-web依赖会导致网关启动失败路由优先级精准路由优先级高于模糊路由配置时避免路径匹配冲突过滤器顺序通过Order注解调整执行优先级鉴权过滤器需优先执行限流不生效必须引入sentinel网关适配依赖且路由ID需与限流规则ID一致八、文末总结Spring Cloud Gateway 作为微服务的流量守门人是微服务架构中不可或缺的核心组件。本文完整讲解了网关的核心价值、三大核心组件、路由配置、过滤器开发、Sentinel限流熔断并提供了可直接落地的实战代码。相比于ZuulGateway基于Netty实现异步非阻塞吞吐量更高、性能更强完全适配高并发微服务场景。后续文章会继续讲解网关灰度发布、日志链路追踪、自定义断言、网关集群部署等高级特性。