Skip to content

HttpClientCustomizer

Spring Cloud Gateway 中的 HttpClientCustomizer 接口允许定制网关使用的 HTTP 客户端(通常是 Netty HttpClient)。它提供了一个简单的方法 customize,接受一个 HttpClient 作为参数并返回一个定制后的版本。

此接口适用于需要为 HTTP 客户端配置特定设置或行为的场景,例如设置超时、添加自定义 Header 或启用特定功能。通过实现此接口,您可以提供满足特定要求的自定义实现。

以下是如何使用 HttpClientCustomizer 接口的示例:

MyHttpClientCustomizer.java

java
import org.springframework.cloud.gateway.config.HttpClientCustomizer;
import reactor.netty.http.client.HttpClient;
import io.netty.channel.ChannelOption;

public class MyHttpClientCustomizer implements HttpClientCustomizer {

    @Override
    public HttpClient customize(HttpClient httpClient) {
        // 在此处定制 HTTP 客户端
        return httpClient.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000)
                         .option(ChannelOption.SO_TIMEOUT, 10000);
    }
}

注意:原文档中的示例使用了 tcpConfiguration,但在较新版本的 Reactor Netty 中 tcpConfiguration 已被弃用。上面的代码已更新为更现代的写法,直接在 HttpClient 上配置选项。

在这个例子中,MyHttpClientCustomizer 类实现了 HttpClientCustomizer 接口并重写了 customize 方法。在该方法中,通过将连接超时设置为 5 秒和读取超时设置为 10 秒来定制 HTTP 客户端。

要使用此定制器,您需要将其注册到 Spring Cloud Gateway 配置中:

GatewayConfiguration.java

java
@Configuration
public class GatewayConfiguration {

    @Bean
    public HttpClientCustomizer myHttpClientCustomizer() {
        return new MyHttpClientCustomizer();
    }
}

通过将定制器注册为 Bean,它将自动应用于网关使用的 HTTP 客户端。

补充教学 —— 为什么要用 HttpClientCustomizer?

通常情况下,我们可以在 application.yml 中通过 spring.cloud.gateway.httpclient.* 属性来配置大部分常用参数(如连接超时、响应超时)。

但是,Netty 是一个非常强大的底层网络框架,有些高级配置底层参数并没有暴露为简单的 Spring 配置属性。这时候 HttpClientCustomizer 就派上用场了。

常见的高级使用场景

  1. 高级代理配置:如果现有的代理配置属性无法满足需求。
  2. TCP 层面优化:比如配置 TCP_NODELAY, SO_KEEPALIVE, SO_RCVBUF 等 Socket 选项。
  3. 连接池精细控制:自定义连接池的驱逐策略、最大空闲时间等。
  4. Metrics 自定义:深入集成 Netty 的 Metric 收集。

最佳实践: 如果能用配置文件解决的(如超时时间),优先使用配置文件。只有当配置文件不支持时,才考虑写 Java 代码实现 HttpClientCustomizer

Based on Spring Framework.