Spring Cloud Gateway 的核心作用是:作为系统的统一入口,负责路由转发、过滤拦截、鉴权限流等一系列边缘服务。
你可以把它想象成大公司的前台:
所有外部请求都先找前台(Gateway)
前台判断你要找哪个部门(路由)
前台可能检查你有没有预约(鉴权)、记录来访信息(日志)、限制接待人数(限流)
前台把你带到具体部门(转发给微服务)
一、核心功能详解 1. 路由转发(最基础) 将外部请求按照规则转发到对应的微服务。
yaml spring: cloud: gateway: routes: - id: user-service uri: lb://user-service # 负载均衡到user-service predicates: - Path=/user/** # 访问/user/**的请求都转发给user-service 没有Gateway的情况: 前端要记一堆地址:http://user-service:8081、http://order-service:8082... 有Gateway的情况: 前端只记一个地址:http://gateway:8080,Gateway帮你分发。
2. 统一鉴权(最常见) 在入口处集中处理登录校验、权限验证。
java @Bean public GlobalFilter authFilter() { return (exchange, chain) -> { // 1. 获取token String token = exchange.getRequest().getHeaders().getFirst("token"); // 2. 校验token if (token == null || !JwtUtil.verify(token)) { exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED); return exchange.getResponse().setComplete(); } // 3. 放行 return chain.filter(exchange); }; } 这样每个微服务都不需要重复写鉴权代码。
3. 限流熔断(保护系统) 防止某个服务被突发流量打垮。
yaml spring: cloud: gateway: routes: - id: order-service uri: lb://order-service predicates: - Path=/order/** filters: - name: RequestRateLimiter # 限流过滤器 args: redis-rate-limiter.replenishRate: 10 # 每秒补充10个令牌 redis-rate-limiter.burstCapacity: 20 # 最大容量20个 4. 日志监控(统一记录) 集中记录所有API的访问日志。
java @Bean public GlobalFilter logFilter() { return (exchange, chain) -> { // 记录请求开始时间 long startTime = System.currentTimeMillis(); return chain.filter(exchange).then(Mono.fromRunnable(() -> { // 记录请求耗时 long duration = System.currentTimeMillis() - startTime; String path = exchange.getRequest().getURI().getPath(); System.out.println(path + " 耗时: " + duration + "ms"); })); }; } 5. 跨域处理(统一解决) 解决前端调接口时的跨域问题。
yaml spring: cloud: gateway: globalcors: cors-configurations: '[/**]': allowedOrigins: "http://localhost:3000" # 前端地址 allowedMethods: - GET - POST allowedHeaders: "*" 6. 协议转换/数据聚合 比如将多个服务的返回结果合并后再返回。
二、典型使用场景 场景1:微服务架构的统一入口 text 前端页面 → Gateway → 用户服务 ├─→ 订单服务 ├─→ 商品服务 └─→ 支付服务 场景2:灰度发布/金丝雀发布 让一部分用户先访问新版本服务:
yaml spring: cloud: gateway: routes: - id: user-service-v2 uri: lb://user-service-v2 predicates: - Path=/user/** - Header="version", "v2" # 只有请求头version=v2才走新版 场景3:API版本管理 同一个接口,不同版本转发到不同服务:
yaml predicates: - Path=/api/v1/** # 转发到旧服务
predicates: - Path=/api/v2/** # 转发到新服务 场景4:服务聚合/网关路由 将多个微服务的功能聚合成一个对外接口:
java @RestController public class AggregationController { @Autowired private WebClient.Builder webClientBuilder; @GetMapping("/user-order/{userId}") public Mono<Map> getUserAndOrder(@PathVariable String userId) { // 同时调用用户服务和订单服务,合并返回 Mono<User> user = webClientBuilder.build().get() .uri("http://user-service/user/" + userId).retrieve().bodyToMono(User.class); Mono<List<Order>> orders = webClientBuilder.build().get() .uri("http://order-service/order/user/" + userId).retrieve().bodyToMono(List.class); return Mono.zip(user, orders) .map(tuple -> { Map result = new HashMap(); result.put("user", tuple.getT1()); result.put("orders", tuple.getT2()); return result; }); } } 三、Gateway vs 其他组件 组件 主要作用 区别 Gateway 路由、鉴权、限流 应用层网关,处理HTTP请求 Nginx 负载均衡、反向代理 网络层/传输层,性能更高但功能单一 Zuul 同样是网关 Netflix版,已被Spring Cloud Gateway替代 Feign 服务间调用 内部调用,不对外暴露 四、总结 Spring Cloud Gateway 不是必须的,但有了它:
✅ 代码复用:鉴权、日志、限流写一次
✅ 统一管理:所有入口配置集中管理
✅ 保护服务:限流、熔断在入口层处理
✅ 易于维护:修改入口逻辑不用改业务服务
✅ 透明接入:业务服务不知道谁在调自己
一句话总结:Gateway 是微服务架构的守门人,让业务服务专注于业务逻辑,把边缘功能统一收口到网关层。
|