找回密码
 立即注册
首页 业界区 安全 Spring Cloud Gateway实战:微服务API网关从零到一 ...

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

后沛若 4 小时前
前言

Spring Cloud Gateway 是 Spring 官方推出的 API 网关,基于 WebFlux 实现,性能卓越。本文带你从零搭建一个生产级的微服务 API 网关。
一、核心概念


  • Route(路由):网关的基本构建块,包含 ID、目标 URI、Predicate、Filter
  • Predicate(断言):匹配请求条件(路径、Header、参数等)
  • Filter(过滤器):对请求进行前置/后置处理(鉴权、限流、日志等)
二、快速搭建
  1. <dependency>
  2.     <groupId>org.springframework.cloud</groupId>
  3.     spring-cloud-starter-gateway</artifactId>
  4. </dependency>
  5. # application.yml
  6. server:
  7.   port: 8080
  8. spring:
  9.   application:
  10.     name: api-gateway
  11.   cloud:
  12.     gateway:
  13.       routes:
  14.         - id: user-service
  15.           uri: lb://user-service
  16.           predicates:
  17.             - Path=/api/users/**
  18.           filters:
  19.             - StripPrefix=1
  20.         - id: order-service
  21.           uri: lb://order-service
  22.           predicates:
  23.             - Path=/api/orders/**
  24.           filters:
  25.             - StripPrefix=1
  26.       discovery:
  27.         locator:
  28.           enabled: true  # 自动发现服务
复制代码
三、自定义全局过滤器(JWT 鉴权)
  1. @Component
  2. public class AuthGlobalFilter implements GlobalFilter, Ordered {
  3.     @Override
  4.     public Mono<Void> filter(ServerWebExchange exchange,
  5.                               GatewayFilterChain chain) {
  6.         String path = exchange.getRequest().getPath().value();
  7.         // 白名单路径跳过鉴权
  8.         if (path.startsWith("/api/auth/login") ||
  9.             path.startsWith("/api/auth/register")) {
  10.             return chain.filter(exchange);
  11.         }
  12.         String token = exchange.getRequest()
  13.             .getHeaders().getFirst("Authorization");
  14.         if (token == null || !token.startsWith("Bearer ")) {
  15.             exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
  16.             return exchange.getResponse().setComplete();
  17.         }
  18.         // 验证 JWT(简化示例)
  19.         try {
  20.             String jwt = token.substring(7);
  21.             Claims claims = Jwts.parser()
  22.                 .setSigningKey("secret-key").parseClaimsJws(jwt).getBody();
  23.             String userId = claims.getSubject();
  24.             ServerHttpRequest request = exchange.getRequest()
  25.                 .mutate().header("X-User-Id", userId).build();
  26.             return chain.filter(exchange.mutate().request(request).build());
  27.         } catch (Exception e) {
  28.             exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
  29.             return exchange.getResponse().setComplete();
  30.         }
  31.     }
  32.     @Override
  33.     public int getOrder() { return -100; }
  34. }
复制代码
四、自定义 GatewayFilter(限流)
  1. @Component
  2. public class RateLimitFilter implements GatewayFilter, Ordered {
  3.     private final RateLimiter rateLimiter = RateLimiter.create(100);
  4.     @Override
  5.     public Mono<Void> filter(ServerWebExchange exchange,
  6.                               GatewayFilterChain chain) {
  7.         if (!rateLimiter.tryAcquire()) {
  8.             exchange.getResponse().setStatusCode(HttpStatus.TOO_MANY_REQUESTS);
  9.             return exchange.getResponse().setComplete();
  10.         }
  11.         return chain.filter(exchange);
  12.     }
  13.     @Override
  14.     public int getOrder() { return 0; }
  15. }
  16. # 在路由中使用自定义过滤器
  17. spring.cloud.gateway.routes[0].filters:
  18.   - name: RateLimit
  19.     args:
  20.       redis-rate-limiter.replenishRate: 10
  21.       redis-rate-limiter.burstCapacity: 20
复制代码
五、跨域配置
  1. @Configuration
  2. public class CorsConfig {
  3.     @Bean
  4.     public CorsWebFilter corsWebFilter() {
  5.         CorsConfiguration config = new CorsConfiguration();
  6.         config.addAllowedOrigin("*");
  7.         config.addAllowedHeader("*");
  8.         config.addAllowedMethod("*");
  9.         config.setAllowCredentials(true);
  10.         UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
  11.         source.registerCorsConfiguration("/**", config);
  12.         return new CorsWebFilter(source);
  13.     }
  14. }
复制代码
六、网关 vs Nginx
  1. # Nginx:反向代理 + 负载均衡
  2. # 适合:静态资源、SSL 终止、四层/七层负载均衡
  3. # Spring Cloud Gateway:业务网关
  4. # 适合:动态路由、JWT 鉴权、限流、熔断、灰度发布
  5. # 生产推荐:Nginx(前置)+ Gateway(后置)
  6. # 请求链路:Client → Nginx → Gateway → Microservice
复制代码
总结

Spring Cloud Gateway 是微服务架构的统一入口。核心要点:基于 WebFlux 高性能非阻塞、断言灵活匹配路由、全局过滤器实现统一鉴权、配合 Nginx 构建多层网关架构。

觉得有帮助请点赞收藏!有问题欢迎评论区交流
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册