[心缘地方]同学录
首页 | 功能说明 | 站长通知 | 编码查看转换 | 代码下载 | 常见问题及讨论 | Python游戏编程讨论 | 《深入解析ASP核心技术》 | Python游戏编程教程 | HEIC转JPG工具
登录系统:用户名: 密码: 如果要讨论问题,请先注册。

[备忘]Spring Cloud Gateway的作用

上一篇:[备忘]Dubbo面试相关。
下一篇:没有了

添加日期:2026/2/12 19:37:54 快速返回   返回列表 阅读73次
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 是微服务架构的守门人,让业务服务专注于业务逻辑,把边缘功能统一收口到网关层。
 

评论 COMMENTS
没有评论 No Comments.

添加评论 Add new comment.
昵称 Name:
评论内容 Comment:
验证码(不区分大小写)
Validation Code:
(not case sensitive)
看不清?点这里换一张!(Change it here!)
 
评论由管理员查看后才能显示。the comment will be showed after it is checked by admin.
CopyRight © 心缘地方 2005-2999. All Rights Reserved