Spring Cloud 2026 網(wǎng)關(guān)模式實(shí)現(xiàn)示例
今天我們來(lái)聊聊 Spring Cloud 2026 的網(wǎng)關(guān)模式,這是微服務(wù)架構(gòu)中流量管理的關(guān)鍵組件。
一、網(wǎng)關(guān)概述
在微服務(wù)架構(gòu)中,網(wǎng)關(guān)是系統(tǒng)的統(tǒng)一入口,負(fù)責(zé)請(qǐng)求路由、負(fù)載均衡、安全認(rèn)證、限流熔斷等功能。Spring Cloud 2026 提供了強(qiáng)大的網(wǎng)關(guān)功能,支持多種網(wǎng)關(guān)模式。
核心功能
- 請(qǐng)求路由:將請(qǐng)求轉(zhuǎn)發(fā)到正確的微服務(wù)
- 負(fù)載均衡:在多個(gè)服務(wù)實(shí)例間分配流量
- 安全認(rèn)證:統(tǒng)一處理認(rèn)證和授權(quán)
- 限流熔斷:保護(hù)后端服務(wù)免受過(guò)載影響
- 監(jiān)控日志:記錄和分析流量數(shù)據(jù)
二、Spring Cloud Gateway 核心概念
1. 路由 (Route)
路由是網(wǎng)關(guān)的基本構(gòu)建塊,由 ID、目標(biāo) URI、斷言集合和過(guò)濾器集合組成:
@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)
斷言用于匹配請(qǐng)求,決定是否應(yīng)用路由:
@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. 過(guò)濾器 (Filter)
過(guò)濾器用于修改請(qǐng)求和響應(yīng):
@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();
}三、常見(jiàn)網(wǎng)關(guān)模式
1. API 網(wǎng)關(guān)模式
API 網(wǎng)關(guān)作為所有微服務(wù)的統(tǒng)一入口:
@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. 聚合網(wǎng)關(guān)模式
聚合多個(gè)微服務(wù)的響應(yīng):
@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. 安全網(wǎng)關(guān)模式
集中處理認(rèn)證和授權(quán):
@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();
}
}四、高級(jí)特性
1. 限流熔斷
保護(hù)后端服務(wù):
@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. 動(dòng)態(tài)路由
從配置中心獲取路由配置:
@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. 響應(yīng)式處理
使用 WebFlux 進(jìn)行響應(yīng)式處理:
@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) -> {
// 自定義響應(yīng)式過(guò)濾器
return chain.filter(exchange)
.then(Mono.fromRunnable(() -> {
// 響應(yīng)后處理
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: LoadBalancer2. 服務(wù)發(fā)現(xiàn)集成
@Configuration
public class DiscoveryGatewayConfig {
@Bean
public RouteLocator discoveryRoutes(RouteLocatorBuilder builder,
DiscoveryClient discoveryClient) {
RouteLocatorBuilder.Builder routeBuilder = builder.routes();
// 自動(dòng)從服務(wù)發(fā)現(xiàn)中創(chuàng)建路由
discoveryClient.getServices().forEach(service -> {
routeBuilder.route(service + "-route", r -> r
.path("/" + service + "/**")
.uri("lb://" + service)
);
});
return routeBuilder.build();
}
}六、監(jiān)控與可觀測(cè)性
1. 指標(biāo)監(jiān)控
@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();
}
}七、最佳實(shí)踐
1. 性能優(yōu)化
@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) -> {
// 響應(yīng)體處理
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. 安全最佳實(shí)踐
@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();
}
}八、實(shí)踐案例:電商平臺(tái)網(wǎng)關(guān)
場(chǎng)景描述
構(gòu)建一個(gè)電商平臺(tái)的網(wǎng)關(guān),處理用戶(hù)、訂單、產(chǎn)品等服務(wù)的請(qǐng)求。
實(shí)現(xiàn)方案
@Configuration
public class EcommerceGatewayConfig {
@Bean
public RouteLocator ecommerceRoutes(RouteLocatorBuilder builder) {
return builder.routes()
// 用戶(hù)服務(wù)
.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")
)
// 訂單服務(wù)
.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")
)
// 產(chǎn)品服務(wù)
.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"));
}
}九、總結(jié)與建議
Spring Cloud 2026 的網(wǎng)關(guān)功能為微服務(wù)架構(gòu)提供了強(qiáng)大的流量管理能力。以下是一些關(guān)鍵建議:
- 合理設(shè)計(jì)路由:根據(jù)業(yè)務(wù)需求設(shè)計(jì)清晰的路由規(guī)則
- 加強(qiáng)安全防護(hù):統(tǒng)一處理認(rèn)證和授權(quán),保護(hù)后端服務(wù)
- 實(shí)現(xiàn)限流熔斷:防止過(guò)載,提高系統(tǒng)可靠性
- 優(yōu)化性能:合理配置連接池、超時(shí)時(shí)間等參數(shù)
- 增強(qiáng)可觀測(cè)性:集成監(jiān)控和追蹤,及時(shí)發(fā)現(xiàn)問(wèn)題
這其實(shí)可以更優(yōu)雅一點(diǎn),通過(guò)合理使用 Spring Cloud Gateway,我們可以構(gòu)建出高性能、高可靠、安全的微服務(wù)架構(gòu)。
到此這篇關(guān)于Spring Cloud 2026 網(wǎng)關(guān)模式實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)Spring Cloud 2026 網(wǎng)關(guān)模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Springcloud GateWay網(wǎng)關(guān)配置過(guò)程圖解
- 詳解spring cloud構(gòu)建微服務(wù)架構(gòu)的網(wǎng)關(guān)(API GateWay)
- SpringCloud-Gateway網(wǎng)關(guān)的使用實(shí)例教程
- spring cloud 使用Zuul 實(shí)現(xiàn)API網(wǎng)關(guān)服務(wù)問(wèn)題
- 詳解Spring Cloud Zuul 服務(wù)網(wǎng)關(guān)
- SpringCloud實(shí)戰(zhàn)之Zuul網(wǎng)關(guān)服務(wù)
- springcloud gateway網(wǎng)關(guān)服務(wù)啟動(dòng)報(bào)錯(cuò)的解決
- SpringCloud的Gateway網(wǎng)關(guān)詳解
- 淺談Spring Cloud中的API網(wǎng)關(guān)服務(wù)Zuul
- SpringCLoud搭建Zuul網(wǎng)關(guān)集群過(guò)程解析
相關(guān)文章
SpringBoot中REST API 接口傳參的實(shí)現(xiàn)
我們?cè)陂_(kāi)發(fā)?REST API?的過(guò)程中,經(jīng)常需要傳遞參數(shù),本文主要介紹了SpringBoot中REST API 接口傳參的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2023-12-12
關(guān)于Java中String創(chuàng)建的字符串對(duì)象內(nèi)存分配測(cè)試問(wèn)題
這篇文章主要介紹了Java中String創(chuàng)建的字符串對(duì)象內(nèi)存分配測(cè)試,給大家詳細(xì)介紹了在創(chuàng)建String對(duì)象的兩種常用方法比較,通過(guò)示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-07-07
Spring?Boot接收參數(shù)19種不同的方式總結(jié)
SpringBoot是一個(gè)用于簡(jiǎn)化Spring應(yīng)用開(kāi)發(fā)的框架,它通過(guò)約定大于配置的原則,使得開(kāi)發(fā)者可以更加專(zhuān)注于業(yè)務(wù)邏輯而不是繁復(fù)的配置,這篇文章主要介紹了Spring?Boot接收參數(shù)19種不同的方式,需要的朋友可以參考下2025-12-12
利用idea快速搭建一個(gè)spring-cloud(圖文)
本文主要介紹了idea快速搭建一個(gè)spring-cloud,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
MAC算法之消息摘要算法HmacMD5的實(shí)現(xiàn)
這篇文章主要介紹了MAC算法之消息摘要算法HmacMD5的實(shí)現(xiàn)的相關(guān)資料,這里提供實(shí)例,幫助大家學(xué)習(xí)理解這部分知識(shí),需要的朋友可以參考下2017-08-08
30分鐘入門(mén)Java8之lambda表達(dá)式學(xué)習(xí)
本篇文章主要介紹了30分鐘入門(mén)Java8之lambda表達(dá)式學(xué)習(xí),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-04-04

