卖房小狼人 發表於 2026-4-6 19:28:00

Spring Cloud Gateway实战:微服务API网关从零到一

<h2>前言</h2>
<p>Spring Cloud Gateway 是 Spring 官方推出的 API 网关,基于 WebFlux 实现,性能卓越。本文带你从零搭建一个生产级的微服务 API 网关。</p>
<h2>一、核心概念</h2>
<ul>
<li><strong>Route(路由)</strong>:网关的基本构建块,包含 ID、目标 URI、Predicate、Filter</li>
<li><strong>Predicate(断言)</strong>:匹配请求条件(路径、Header、参数等)</li>
<li><strong>Filter(过滤器)</strong>:对请求进行前置/后置处理(鉴权、限流、日志等)</li>
</ul>
<h2>二、快速搭建</h2>
<pre><code>&lt;!-- pom.xml --&gt;
&lt;dependency&gt;
    &lt;groupId&gt;org.springframework.cloud&lt;/groupId&gt;
    &lt;artifactId&gt;spring-cloud-starter-gateway&lt;/artifactId&gt;
&lt;/dependency&gt;

# application.yml
server:
port: 8080

spring:
application:
    name: api-gateway
cloud:
    gateway:
      routes:
      - id: user-service
          uri: lb://user-service
          predicates:
            - Path=/api/users/**
          filters:
            - StripPrefix=1
      - id: order-service
          uri: lb://order-service
          predicates:
            - Path=/api/orders/**
          filters:
            - StripPrefix=1

      discovery:
      locator:
          enabled: true# 自动发现服务</code></pre>
<h2>三、自定义全局过滤器(JWT 鉴权)</h2>
<pre><code>@Component
public class AuthGlobalFilter implements GlobalFilter, Ordered {

    @Override
    public Mono&lt;Void&gt; filter(ServerWebExchange exchange,
                              GatewayFilterChain chain) {
      String path = exchange.getRequest().getPath().value();
      // 白名单路径跳过鉴权
      if (path.startsWith("/api/auth/login") ||
            path.startsWith("/api/auth/register")) {
            return chain.filter(exchange);
      }
      String token = exchange.getRequest()
            .getHeaders().getFirst("Authorization");
      if (token == null || !token.startsWith("Bearer ")) {
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            return exchange.getResponse().setComplete();
      }
      // 验证 JWT(简化示例)
      try {
            String jwt = token.substring(7);
            Claims claims = Jwts.parser()
                .setSigningKey("secret-key").parseClaimsJws(jwt).getBody();
            String userId = claims.getSubject();
            ServerHttpRequest request = exchange.getRequest()
                .mutate().header("X-User-Id", userId).build();
            return chain.filter(exchange.mutate().request(request).build());
      } catch (Exception e) {
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            return exchange.getResponse().setComplete();
      }
    }

    @Override
    public int getOrder() { return -100; }
}</code></pre>
<h2>四、自定义 GatewayFilter(限流)</h2>
<pre><code>@Component
public class RateLimitFilter implements GatewayFilter, Ordered {

    private final RateLimiter rateLimiter = RateLimiter.create(100);

    @Override
    public Mono&lt;Void&gt; filter(ServerWebExchange exchange,
                              GatewayFilterChain chain) {
      if (!rateLimiter.tryAcquire()) {
            exchange.getResponse().setStatusCode(HttpStatus.TOO_MANY_REQUESTS);
            return exchange.getResponse().setComplete();
      }
      return chain.filter(exchange);
    }

    @Override
    public int getOrder() { return 0; }
}

# 在路由中使用自定义过滤器
spring.cloud.gateway.routes.filters:
- name: RateLimit
    args:
      redis-rate-limiter.replenishRate: 10
      redis-rate-limiter.burstCapacity: 20</code></pre>
<h2>五、跨域配置</h2>
<pre><code>@Configuration
public class CorsConfig {
    @Bean
    public CorsWebFilter corsWebFilter() {
      CorsConfiguration config = new CorsConfiguration();
      config.addAllowedOrigin("*");
      config.addAllowedHeader("*");
      config.addAllowedMethod("*");
      config.setAllowCredentials(true);

      UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
      source.registerCorsConfiguration("/**", config);
      return new CorsWebFilter(source);
    }
}</code></pre>
<h2>六、网关 vs Nginx</h2>
<pre><code># Nginx:反向代理 + 负载均衡
# 适合:静态资源、SSL 终止、四层/七层负载均衡

# Spring Cloud Gateway:业务网关
# 适合:动态路由、JWT 鉴权、限流、熔断、灰度发布

# 生产推荐:Nginx(前置)+ Gateway(后置)
# 请求链路:Client → Nginx → Gateway → Microservice</code></pre>
<h2>总结</h2>
<p>Spring Cloud Gateway 是微服务架构的统一入口。核心要点:基于 WebFlux 高性能非阻塞、断言灵活匹配路由、全局过滤器实现统一鉴权、配合 Nginx 构建多层网关架构。</p>
<p>觉得有帮助请点赞收藏!有问题欢迎评论区交流 🚀</p>

</div>
<div id="MySignature" role="contentinfo">
   

---

📌 **如果觉得文章对你有帮助,欢迎点赞👍收藏⭐!**

💬 有问题或建议?欢迎在评论区留言讨论~

🔗 更多技术干货请关注作者:弥烟袅绕

📚 本文地址:https://www.cnblogs.com/czlws/p/19826872/spring-cloud-gateway-microservice-api<br><br>
来源:https://www.cnblogs.com/czlws/p/19826872/spring-cloud-gateway-microservice-api
頁: [1]
查看完整版本: Spring Cloud Gateway实战:微服务API网关从零到一