如何配置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
相关产品推荐
相关产品推荐

