Skip to content

08.2 — 网关与配置中心

核心: Spring Cloud Gateway 路由与过滤器、Nacos Config 动态刷新 面试高频度: ⭐⭐⭐⭐

← 返回 **返回 Spring Cloud 索引**


3. 网关 — Spring Cloud Gateway

路由配置

yaml
spring:
  cloud:
    gateway:
      routes:
        - id: user-service
          uri: lb://user-service           # 负载均衡
          predicates:
            - Path=/api/users/**
          filters:
            - StripPrefix=1                # 去除前缀
            - name: RequestRateLimiter     # 限流
              args:
                key-resolver: "#{@userKeyResolver}"
                redis-rate-limiter.replenishRate: 100
                redis-rate-limiter.burstCapacity: 200
        - id: order-service
          uri: lb://order-service
          predicates:
            - Path=/api/orders/**
          filters:
            - StripPrefix=1
            - name: CircuitBreaker         # 熔断
              args:
                name: orderService
                fallbackUri: forward:/fallback/orders

网关过滤器

java
// 自定义全局过滤器
@Component
@Slf4j
public class AuthGlobalFilter implements GlobalFilter, Ordered {
    
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpRequest request = exchange.getRequest();
        
        // 白名单路径跳过
        String path = request.getURI().getPath();
        if (path.contains("/auth/login") || path.contains("/auth/register")) {
            return chain.filter(exchange);
        }
        
        // 校验 Token
        String token = request.getHeaders().getFirst("Authorization");
        if (token == null || !token.startsWith("Bearer ")) {
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            return exchange.getResponse().setComplete();
        }
        
        // 将用户信息传递给下游服务
        String userId = parseUserId(token);
        exchange.getRequest().mutate()
            .header("X-User-Id", userId)
            .build();
        
        return chain.filter(exchange);
    }
    
    @Override
    public int getOrder() {
        return -100;  // 高优先级
    }
}

4. 配置中心 — Nacos Config

yaml
spring:
  cloud:
    nacos:
      config:
        server-addr: localhost:8848
        namespace: dev
        group: DEFAULT_GROUP
        file-extension: yaml  # 配置文件格式
        refresh-enabled: true  # 支持动态刷新
java
@RestController
@RefreshScope  // 动态刷新配置
public class ConfigController {
    
    @Value("${app.config.version:unknown}")
    private String version;
    
    @GetMapping("/config")
    public String getConfig() {
        return "Version: " + version;
    }
}

Nacos 配置管理优势

特性说明
动态刷新配置变更实时生效,无需重启
命名空间环境隔离(dev/test/prod)
分组管理按业务领域分组配置
版本回滚支持配置历史版本和回滚
监听器配置变更回调通知
权限控制RBAC 权限管理

核心面试题

  1. Spring Cloud Gateway 的工作原理?和 Zuul 有什么区别?
  2. 配置中心的动态刷新原理(@RefreshScope)?

Knowledge4J — Java 知识库