前言
Spring Cloud Gateway 是 Spring 官方推出的 API 网关,基于 WebFlux 实现,性能卓越。本文带你从零搭建一个生产级的微服务 API 网关。
一、核心概念
- Route(路由):网关的基本构建块,包含 ID、目标 URI、Predicate、Filter
- Predicate(断言):匹配请求条件(路径、Header、参数等)
- Filter(过滤器):对请求进行前置/后置处理(鉴权、限流、日志等)
二、快速搭建
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- spring-cloud-starter-gateway</artifactId>
- </dependency>
- # 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 # 自动发现服务
复制代码 三、自定义全局过滤器(JWT 鉴权)
- @Component
- public class AuthGlobalFilter implements GlobalFilter, Ordered {
- @Override
- public Mono<Void> 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; }
- }
复制代码 四、自定义 GatewayFilter(限流)
- @Component
- public class RateLimitFilter implements GatewayFilter, Ordered {
- private final RateLimiter rateLimiter = RateLimiter.create(100);
- @Override
- public Mono<Void> 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[0].filters:
- - name: RateLimit
- args:
- redis-rate-limiter.replenishRate: 10
- redis-rate-limiter.burstCapacity: 20
复制代码 五、跨域配置
- @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);
- }
- }
复制代码 六、网关 vs Nginx
- # Nginx:反向代理 + 负载均衡
- # 适合:静态资源、SSL 终止、四层/七层负载均衡
- # Spring Cloud Gateway:业务网关
- # 适合:动态路由、JWT 鉴权、限流、熔断、灰度发布
- # 生产推荐:Nginx(前置)+ Gateway(后置)
- # 请求链路:Client → Nginx → Gateway → Microservice
复制代码 总结
Spring Cloud Gateway 是微服务架构的统一入口。核心要点:基于 WebFlux 高性能非阻塞、断言灵活匹配路由、全局过滤器实现统一鉴权、配合 Nginx 构建多层网关架构。
觉得有帮助请点赞收藏!有问题欢迎评论区交流
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |