LoadBalancer 过滤器
LoadBalancer 过滤器接受一个 serviceId
参数。LoadBalancerClient
使用此参数选择用于路由的实例。LoadBalancer 过滤器需要在 Java DSL 中显式使用。使用 LoadBalancer 过滤器时,请使用 org.springframework.cloud.gateway.server.mvc.handler.HandlerFunctions
中的空 http()
方法。
RouteConfiguration.java
import static org.springframework.cloud.gateway.server.mvc.filter.LoadBalancerFilterFunctions.lb;
import static org.springframework.cloud.gateway.server.mvc.handler.GatewayRouterFunctions.route;
import static org.springframework.cloud.gateway.server.mvc.handler.HandlerFunctions.http;
@Configuration
class RouteConfiguration {
@Bean
public RouterFunction<ServerResponse> gatewayRouterFunctionsAddReqHeader() {
return route("api_route")
.GET("/api/**", http())
.filter(lb("apiservice"))
.build();
}
}
在配置中使用 LoadBalancer 过滤器
LoadBalancer 过滤器可以通过使用带有 lb
scheme 的 URI(例如 lb://myservice
)在配置中使用,它使用 Spring Cloud LoadBalancerClient
将名称(本例中的 myservice
)解析为实际的主机和端口,并替换同一属性中的 URI。以下列表配置了一个 LoadBalancer 过滤器
application.yml
spring:
cloud:
gateway:
mvc:
routes:
- id: api_route
uri: lb://apiservice
predicates:
- Path=/api/**
如果使用 lb() 过滤器,它需要放在任何操纵路径的过滤器(如 setPath() 或 stripPrefix() )之后,否则生成的 URL 可能会不正确。配置中的 lb: scheme 处理程序会自动将过滤器放在最高优先级顺序。 |
默认情况下,当 ReactorLoadBalancer 找不到服务实例时,会返回 503 。 |
从 LoadBalancerClient 返回的 ServiceInstance 的 isSecure 值会覆盖发送到 Gateway 的请求中指定的 scheme。例如,如果请求通过 HTTPS 进入 Gateway 但 ServiceInstance 指示它不安全,则下游请求将通过 HTTP 发出。相反的情况也适用。 |
Gateway 支持所有 LoadBalancer 特性。您可以在 Spring Cloud Commons 文档中阅读更多相关信息。 |