使用 Spring Cloud Gateway 时如何负载平衡对所有应用程序 pods 的请求
How to load balance requests to all application pods when using Spring Cloud Gateway
我用两个 pods 在 Kubernetes 中部署了一个应用程序。如果我直接调用它的 Kubernetes 服务 (http://app:8080
),它将使用循环法平衡这两个 pods 之间的请求。
实际运行时在应用程序前面包含一个Spring Cloud Gateway pod,配置如下:
@Bean
fun customRouteLocator(builder: RouteLocatorBuilder): RouteLocator {
logger.info("Gateway configuration: {}", gatewayConfigurationProperties)
var routes = builder.routes()
gatewayConfigurationProperties.routes.forEach { service ->
routes = routes.route(service.key) { r ->
r.path("${service.value.contextPath}/**")
.filters { filters ->
filters.requestRateLimiter { rateLimiterConfig ->
rateLimiterConfig.rateLimiter = RedisRateLimiter(1000, 1000)
}
}
.uri(service.value.uri)
}
}
return routes.build()
}
gateway:
routes:
app:
uri: http://app:8080
context-path: /app
我原以为网关会在两者之间分配负载 pods,但它坚持使用其中之一
----------------------- ------------
--->| spring-cloud-gateway |---calls-----> | app-pod-1 |
----------------------- X ------------
|
| ------------
---> | app-pod-2 |
------------
如何使网关使用循环法平衡请求?
我尝试在服务 url 前加上 lb://
(uri: lb://app:8080
) 前缀,但出现 503 错误。
为了让 Spring Cloud Gateway 分配负载而不是固定在一个 pod 上,我必须:
- 在网关 URI 中使用
lb://
而不是 http://
。
- 添加以下依赖项:
implementation("org.springframework.cloud:spring-cloud-loadbalancer")
implementation("org.springframework.cloud:spring-cloud-starter-kubernetes-fabric8")
有了这个,SCG 将应用循环负载平衡。
我用两个 pods 在 Kubernetes 中部署了一个应用程序。如果我直接调用它的 Kubernetes 服务 (http://app:8080
),它将使用循环法平衡这两个 pods 之间的请求。
实际运行时在应用程序前面包含一个Spring Cloud Gateway pod,配置如下:
@Bean
fun customRouteLocator(builder: RouteLocatorBuilder): RouteLocator {
logger.info("Gateway configuration: {}", gatewayConfigurationProperties)
var routes = builder.routes()
gatewayConfigurationProperties.routes.forEach { service ->
routes = routes.route(service.key) { r ->
r.path("${service.value.contextPath}/**")
.filters { filters ->
filters.requestRateLimiter { rateLimiterConfig ->
rateLimiterConfig.rateLimiter = RedisRateLimiter(1000, 1000)
}
}
.uri(service.value.uri)
}
}
return routes.build()
}
gateway:
routes:
app:
uri: http://app:8080
context-path: /app
我原以为网关会在两者之间分配负载 pods,但它坚持使用其中之一
----------------------- ------------
--->| spring-cloud-gateway |---calls-----> | app-pod-1 |
----------------------- X ------------
|
| ------------
---> | app-pod-2 |
------------
如何使网关使用循环法平衡请求?
我尝试在服务 url 前加上 lb://
(uri: lb://app:8080
) 前缀,但出现 503 错误。
为了让 Spring Cloud Gateway 分配负载而不是固定在一个 pod 上,我必须:
- 在网关 URI 中使用
lb://
而不是http://
。 - 添加以下依赖项:
implementation("org.springframework.cloud:spring-cloud-loadbalancer")
implementation("org.springframework.cloud:spring-cloud-starter-kubernetes-fabric8")
有了这个,SCG 将应用循环负载平衡。