java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Spring Cloud 2026 网关模式

Spring Cloud 2026 网关模式实现示例

作者:亚历克斯神

本文主要介绍了Spring Cloud 2026 网关模式实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

今天我们来聊聊 Spring Cloud 2026 的网关模式,这是微服务架构中流量管理的关键组件。

一、网关概述

在微服务架构中,网关是系统的统一入口,负责请求路由、负载均衡、安全认证、限流熔断等功能。Spring Cloud 2026 提供了强大的网关功能,支持多种网关模式。

核心功能

二、Spring Cloud Gateway 核心概念

1. 路由 (Route)

路由是网关的基本构建块,由 ID、目标 URI、断言集合和过滤器集合组成:

@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
    return builder.routes()
        .route("user-service", r -> r
            .path("/api/users/**")
            .uri("lb://user-service")
        )
        .route("order-service", r -> r
            .path("/api/orders/**")
            .uri("lb://order-service")
        )
        .build();
}

2. 断言 (Predicate)

断言用于匹配请求,决定是否应用路由:

@Bean
public RouteLocator predicateRouteLocator(RouteLocatorBuilder builder) {
    return builder.routes()
        .route("api-route", r -> r
            .path("/api/**")
            .and()
            .method("GET", "POST")
            .and()
            .header("X-Request-Id")
            .uri("lb://api-service")
        )
        .build();
}

3. 过滤器 (Filter)

过滤器用于修改请求和响应:

@Bean
public RouteLocator filterRouteLocator(RouteLocatorBuilder builder) {
    return builder.routes()
        .route("filtered-route", r -> r
            .path("/api/**")
            .filters(f -> f
                .addRequestHeader("X-Gateway-Request", "processed")
                .addResponseHeader("X-Gateway-Response", "processed")
                .rewritePath("/api/(?<segment>.*)", "/$\{segment}")
            )
            .uri("lb://api-service")
        )
        .build();
}

三、常见网关模式

1. API 网关模式

API 网关作为所有微服务的统一入口:

@Configuration
public class ApiGatewayConfig {
    @Bean
    public RouteLocator apiGatewayRoutes(RouteLocatorBuilder builder) {
        return builder.routes()
            .route("user-service", r -> r
                .path("/api/users/**")
                .uri("lb://user-service")
            )
            .route("order-service", r -> r
                .path("/api/orders/**")
                .uri("lb://order-service")
            )
            .route("product-service", r -> r
                .path("/api/products/**")
                .uri("lb://product-service")
            )
            .build();
    }
}

2. 聚合网关模式

聚合多个微服务的响应:

@RestController
@RequestMapping("/api/aggregated")
public class AggregationController {
    private final WebClient webClient;
    public AggregationController(WebClient.Builder webClientBuilder) {
        this.webClient = webClientBuilder.build();
    }
    @GetMapping("/user/{id}")
    public Mono<UserWithDetails> getUserWithDetails(@PathVariable String id) {
        Mono<User> userMono = webClient.get()
            .uri("http://user-service/api/users/{id}", id)
            .retrieve()
            .bodyToMono(User.class);
        Mono<List<Order>> ordersMono = webClient.get()
            .uri("http://order-service/api/orders/user/{id}", id)
            .retrieve()
            .bodyToFlux(Order.class)
            .collectList();
        return Mono.zip(userMono, ordersMono, (user, orders) -> {
            UserWithDetails userWithDetails = new UserWithDetails();
            userWithDetails.setUser(user);
            userWithDetails.setOrders(orders);
            return userWithDetails;
        });
    }
}

3. 安全网关模式

集中处理认证和授权:

@Configuration
public class SecurityGatewayConfig {
    @Bean
    public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
        http
            .authorizeExchange(exchanges -> exchanges
                .pathMatchers("/api/public/**").permitAll()
                .anyExchange().authenticated()
            )
            .oauth2Login()
            .oauth2ResourceServer(oauth2 -> oauth2
                .jwt(jwt -> jwt
                    .jwkSetUri("https://auth-server/.well-known/jwks.json")
                )
            );
        return http.build();
    }
    @Bean
    public RouteLocator secureRoutes(RouteLocatorBuilder builder) {
        return builder.routes()
            .route("secure-api", r -> r
                .path("/api/secure/**")
                .filters(f -> f
                    .filter(new JwtAuthenticationFilter())
                )
                .uri("lb://secure-service")
            )
            .build();
    }
}

四、高级特性

1. 限流熔断

保护后端服务:

@Configuration
public class ResilienceGatewayConfig {
    @Bean
    public RouteLocator resilienceRoutes(RouteLocatorBuilder builder) {
        return builder.routes()
            .route("resilient-route", r -> r
                .path("/api/resilient/**")
                .filters(f -> f
                    .requestRateLimiter(c -> c
                        .rateLimiter(RedisRateLimiter.class, config -> {
                            config.setReplenishRate(10);
                            config.setBurstCapacity(20);
                        })
                    )
                    .circuitBreaker(c -> c
                        .name("backend-service-circuit-breaker")
                        .fallbackUri("forward:/fallback")
                    )
                )
                .uri("lb://backend-service")
            )
            .build();
    }
    @Bean
    public RouterFunction<ServerResponse> fallbackRoute() {
        return RouterFunctions.route(
            RequestPredicates.path("/fallback"),
            request -> ServerResponse.ok()
                .bodyValue("Service temporarily unavailable, please try again later")
        );
    }
}

2. 动态路由

从配置中心获取路由配置:

@Configuration
public class DynamicRouteConfig {
    @Bean
    @RefreshScope
    public RouteLocator dynamicRoutes(RouteLocatorBuilder builder, 
                                    @Value("${gateway.routes}") List<RouteConfig> routes) {
        RouteLocatorBuilder.Builder routeBuilder = builder.routes();
        for (RouteConfig route : routes) {
            routeBuilder.route(route.getId(), r -> r
                .path(route.getPath())
                .uri(route.getUri())
            );
        }
        return routeBuilder.build();
    }
    @Data
    public static class RouteConfig {
        private String id;
        private String path;
        private String uri;
    }
}

3. 响应式处理

使用 WebFlux 进行响应式处理:

@Configuration
public class ReactiveGatewayConfig {
    @Bean
    public RouteLocator reactiveRoutes(RouteLocatorBuilder builder) {
        return builder.routes()
            .route("reactive-route", r -> r
                .path("/api/reactive/**")
                .filters(f -> f
                    .filter((exchange, chain) -> {
                        // 自定义响应式过滤器
                        return chain.filter(exchange)
                            .then(Mono.fromRunnable(() -> {
                                // 响应后处理
                                exchange.getResponse().getHeaders().add("X-Reactive-Processed", "true");
                            }));
                    })
                )
                .uri("lb://reactive-service")
            )
            .build();
    }
}

五、部署与集成

1. Kubernetes 部署

apiVersion: apps/v1
kind: Deployment
metadata:
  name: gateway-service
spec:
  replicas: 3
  selector:
    matchLabels:
      app: gateway-service
  template:
    metadata:
      labels:
        app: gateway-service
    spec:
      containers:
      - name: gateway-service
        image: gateway-service:latest
        ports:
        - containerPort: 8080
        env:
        - name: SPRING_CLOUD_KUBERNETES_DISCOVERY_ENABLED
          value: "true"
        - name: SPRING_CLOUD_KUBERNETES_CONFIG_ENABLED
          value: "true"
---
apiVersion: v1
kind: Service
metadata:
  name: gateway-service
spec:
  selector:
    app: gateway-service
  ports:
  - port: 80
    targetPort: 8080
  type: LoadBalancer

2. 服务发现集成

@Configuration
public class DiscoveryGatewayConfig {
    @Bean
    public RouteLocator discoveryRoutes(RouteLocatorBuilder builder, 
                                      DiscoveryClient discoveryClient) {
        RouteLocatorBuilder.Builder routeBuilder = builder.routes();
        // 自动从服务发现中创建路由
        discoveryClient.getServices().forEach(service -> {
            routeBuilder.route(service + "-route", r -> r
                .path("/" + service + "/**")
                .uri("lb://" + service)
            );
        });
        return routeBuilder.build();
    }
}

六、监控与可观测性

1. 指标监控

@Configuration
public class MonitoringGatewayConfig {
    @Bean
    public RouteLocator monitoredRoutes(RouteLocatorBuilder builder) {
        return builder.routes()
            .route("monitored-route", r -> r
                .path("/api/**")
                .filters(f -> f
                    .metrics(c -> c
                        .tag("routeId", "api-route")
                        .tag("service", "api-service")
                    )
                )
                .uri("lb://api-service")
            )
            .build();
    }
    @Bean
    public MeterRegistryCustomizer<MeterRegistry> metricsCommonTags() {
        return registry -> registry.config()
            .commonTags("application", "gateway-service");
    }
}

2. 分布式追踪

@Configuration
public class TracingGatewayConfig {
    @Bean
    public RouteLocator tracedRoutes(RouteLocatorBuilder builder) {
        return builder.routes()
            .route("traced-route", r -> r
                .path("/api/**")
                .filters(f -> f
                    .trace(c -> c
                        .spanIdName("gateway.span")
                        .remoteIp(true)
                    )
                )
                .uri("lb://api-service")
            )
            .build();
    }
}

七、最佳实践

1. 性能优化

@Configuration
public class PerformanceGatewayConfig {
    @Bean
    public RouteLocator performanceRoutes(RouteLocatorBuilder builder) {
        return builder.routes()
            .route("performance-route", r -> r
                .path("/api/**")
                .filters(f -> f
                    .removeRequestHeader("X-Forwarded-For")
                    .removeResponseHeader("Server")
                    .modifyResponseBody(String.class, String.class, (exchange, body) -> {
                        // 响应体处理
                        return Mono.just(body);
                    })
                )
                .uri("lb://api-service")
            )
            .build();
    }
    @Bean
    public WebClient webClient(WebClient.Builder builder) {
        return builder
            .clientConnector(new ReactorClientHttpConnector(HttpClient.create()
                .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10000)
                .responseTimeout(Duration.ofSeconds(10))
            ))
            .build();
    }
}

2. 安全最佳实践

@Configuration
public class SecureGatewayConfig {
    @Bean
    public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
        http
            .csrf(csrf -> csrf.disable())
            .authorizeExchange(exchanges -> exchanges
                .pathMatchers("/api/public/**").permitAll()
                .anyExchange().authenticated()
            )
            .oauth2Login()
            .oauth2ResourceServer(oauth2 -> oauth2
                .jwt(jwt -> jwt
                    .jwkSetUri("https://auth-server/.well-known/jwks.json")
                )
            )
            .headers(headers -> headers
                .contentSecurityPolicy(csp -> csp
                    .policyDirectives("default-src 'self'")
                )
                .frameOptions(frameOptions -> frameOptions.deny())
            );
        return http.build();
    }
}

八、实践案例:电商平台网关

场景描述

构建一个电商平台的网关,处理用户、订单、产品等服务的请求。

实现方案

@Configuration
public class EcommerceGatewayConfig {
    @Bean
    public RouteLocator ecommerceRoutes(RouteLocatorBuilder builder) {
        return builder.routes()
            // 用户服务
            .route("user-service", r -> r
                .path("/api/users/**")
                .filters(f -> f
                    .circuitBreaker(c -> c
                        .name("user-service-circuit-breaker")
                        .fallbackUri("/fallback/users")
                    )
                )
                .uri("lb://user-service")
            )
            // 订单服务
            .route("order-service", r -> r
                .path("/api/orders/**")
                .filters(f -> f
                    .circuitBreaker(c -> c
                        .name("order-service-circuit-breaker")
                        .fallbackUri("/fallback/orders")
                    )
                )
                .uri("lb://order-service")
            )
            // 产品服务
            .route("product-service", r -> r
                .path("/api/products/**")
                .filters(f -> f
                    .circuitBreaker(c -> c
                        .name("product-service-circuit-breaker")
                        .fallbackUri("/fallback/products")
                    )
                )
                .uri("lb://product-service")
            )
            .build();
    }
    @Bean
    public RouterFunction<ServerResponse> fallbackRoutes() {
        return RouterFunctions
            .route(RequestPredicates.path("/fallback/users"),
                request -> ServerResponse.ok().bodyValue("User service temporarily unavailable"))
            .andRoute(RequestPredicates.path("/fallback/orders"),
                request -> ServerResponse.ok().bodyValue("Order service temporarily unavailable"))
            .andRoute(RequestPredicates.path("/fallback/products"),
                request -> ServerResponse.ok().bodyValue("Product service temporarily unavailable"));
    }
}

九、总结与建议

Spring Cloud 2026 的网关功能为微服务架构提供了强大的流量管理能力。以下是一些关键建议:

  1. 合理设计路由:根据业务需求设计清晰的路由规则
  2. 加强安全防护:统一处理认证和授权,保护后端服务
  3. 实现限流熔断:防止过载,提高系统可靠性
  4. 优化性能:合理配置连接池、超时时间等参数
  5. 增强可观测性:集成监控和追踪,及时发现问题

这其实可以更优雅一点,通过合理使用 Spring Cloud Gateway,我们可以构建出高性能、高可靠、安全的微服务架构。

到此这篇关于Spring Cloud 2026 网关模式实现示例的文章就介绍到这了,更多相关Spring Cloud 2026 网关模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文