You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置Spring Cloud Gateway MVC路由的最大HTTP连接数?

解决方案

1. 自定义Apache HttpClient连接池配置

创建PoolingHttpClientConnectionManager的配置Bean,直接覆盖全局总连接数和单路由默认连接数,也可按需配置特定路由的连接数:

import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager;
import org.apache.hc.client5.http.socket.ConnectionSocketFactory;
import org.apache.hc.client5.http.socket.PlainConnectionSocketFactory;
import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactory;
import org.apache.hc.core5.http.config.Registry;
import org.apache.hc.core5.http.config.RegistryBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class HttpClientPoolConfig {

    @Bean
    public PoolingHttpClientConnectionManager connectionManager() {
        // 注册HTTP/HTTPS连接工厂
        Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
                .register("http", PlainConnectionSocketFactory.getSocketFactory())
                .register("https", SSLConnectionSocketFactory.getSocketFactory())
                .build();

        PoolingHttpClientConnectionManager manager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
        
        // 设置全局最大总连接数(替换默认值25)
        manager.setMaxTotal(100);
        // 设置单路由默认最大连接数(替换默认值5)
        manager.setDefaultMaxPerRoute(20);
        
        // 可选:针对特定后端服务单独配置连接数
        // HttpRoute targetRoute = new HttpRoute(new HttpHost("a-service.example.com", 9080));
        // manager.setMaxPerRoute(targetRoute, 30);
        
        return manager;
    }
}

2. 构建自定义HttpClient实例

基于上面的连接池管理器,创建CloseableHttpClient实例Bean:

import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.HttpClients;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class HttpClientBeanConfig {

    @Bean
    public CloseableHttpClient customHttpClient(PoolingHttpClientConnectionManager connectionManager) {
        return HttpClients.custom()
                .setConnectionManager(connectionManager)
                // 可选:配置连接超时、读取超时等参数
                // .setDefaultRequestConfig(RequestConfig.custom()
                //         .setConnectTimeout(Timeout.ofSeconds(5))
                //         .setResponseTimeout(Timeout.ofSeconds(10))
                //         .build())
                .build();
    }
}

3. 在路由配置中使用自定义HttpClient

修改原有路由配置,将自定义HttpClient传入HandlerFunctions.http():

import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
import org.springframework.web.servlet.function.RouterFunction;
import org.springframework.web.servlet.function.ServerResponse;
import static org.springframework.cloud.gateway.server.mvc.handler.HandlerFunctions.http;
import static org.springframework.cloud.gateway.server.mvc.handler.GatewayRequestPredicates.path;
import static org.springframework.cloud.gateway.server.mvc.filter.BeforeFilterFunctions.routeId;
import static org.springframework.cloud.gateway.server.mvc.filter.BeforeFilterFunctions.stripPrefix;
import static org.springframework.cloud.gateway.server.mvc.filter.RetryFilterFunctions.retry;
import static org.springframework.cloud.gateway.server.mvc.filter.LoadBalancerFilterFunctions.lb;
import static org.springframework.cloud.gateway.server.mvc.filter.CircuitBreakerFilterFunctions.circuitBreaker;
import java.util.Set;

@Configuration
public class GatewayRouteConfig {

    @Bean
    public RouterFunction<ServerResponse> sampleRoute(CloseableHttpClient customHttpClient) {
        return RouterFunctions
                .route()
                .route(path("/sample-api/a-service/**"), http(customHttpClient)) // 替换为自定义HttpClient
                .before(routeId("sample-route"))
                .before(stripPrefix(2))
                .filter(retry((r) -> r.setRetries(3).setMethods(Set.of(HttpMethod.GET, HttpMethod.OPTIONS, HttpMethod.HEAD))))
                .filter(lb("A-SERVICE"))
                .filter(circuitBreaker("aServiceCircuitBreaker"))
                .build();
    }
}

关键参数说明

  • setMaxTotal:控制连接池全局最大连接总数,需根据网关硬件资源和后端服务承载能力调整,建议从100开始逐步压测优化。
  • setDefaultMaxPerRoute:控制单个后端服务路由的默认最大连接数,避免单一服务耗尽所有连接资源。
  • 若需针对特定服务差异化配置,可通过setMaxPerRoute指定具体HttpRoute单独设置连接上限。

内容的提问来源于stack exchange,提问作者Scott

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 06:52:02