如何基于主机名配置HttpClient5代理,实现单Spring RestClient按需路由?
实现同一Spring RestClient的动态代理逻辑
完全可以在同一个RestClient中实现这个需求,核心是通过自定义HttpClient5的路由规划器(RoutePlanner),根据目标主机名动态决定是否使用代理,无需维护两个RestClient实例。
具体实现步骤:
- 自定义条件路由规划器
继承DefaultProxyRoutePlanner,重写determineRoute方法,添加主机名判断逻辑:
import org.apache.hc.client5.http.routing.DefaultProxyRoutePlanner; import org.apache.hc.client5.http.routing.HttpRoute; import org.apache.hc.core5.http.HttpHost; import org.apache.hc.core5.http.protocol.HttpContext; import java.io.IOException; public class ConditionalProxyRoutePlanner extends DefaultProxyRoutePlanner { public ConditionalProxyRoutePlanner(HttpHost proxy) { super(proxy); } @Override public HttpRoute determineRoute(HttpHost target, HttpContext context) throws IOException { // 判断目标主机名是否包含"internal" if (target.getHostName().contains("internal")) { // 直接返回无代理的路由 return new HttpRoute(target); } // 其他场景沿用默认代理逻辑 return super.determineRoute(target, context); } }
- 配置HttpClient与RestClient
将自定义路由规划器绑定到HttpClient,再把该HttpClient注入RestClient:
// 初始化代理服务器配置 HttpHost proxy = new HttpHost("someproxy", 8080); // 实例化自定义路由规划器 ConditionalProxyRoutePlanner routePlanner = new ConditionalProxyRoutePlanner(proxy); // 构建带条件路由逻辑的HttpClient CloseableHttpClient httpClient = HttpClients.custom() .setRoutePlanner(routePlanner) .build(); // 配置Spring RestClient,使用上述HttpClient RestClient restClient = RestClient.builder() .requestFactory(new HttpComponentsClientHttpRequestFactory(httpClient)) .build();
效果说明
配置完成后,RestClient发送请求时会自动判断目标主机:
- 若主机名包含
internal,则直接发起请求,不经过代理 - 其他场景自动通过指定代理转发请求
内容的提问来源于stack exchange,提问作者Akash tiwari
相关产品推荐
相关产品推荐

