在 Spring 中配置直连与代理 RestTemplate Bean
为 HTTP 代理和显式直连的 JDK 连接分别创建独立的 RestTemplate Bean,而不是围绕每次调用切换共享路由。
有些调用必须走企业代理,而另一个服务则直接访问。与其在每次调用前后切换共享路由,不如为这些路径提供各自的 RestTemplate 实例,因为请求可能重叠。
在已有的 Spring 配置类中:
@Bean("directRestTemplate")
RestTemplate directRestTemplate() {
var factory = new SimpleClientHttpRequestFactory();
factory.setProxy(java.net.Proxy.NO_PROXY);
return new RestTemplate(factory);
}
@Bean("proxyRestTemplate")
RestTemplate proxyRestTemplate() {
var factory = new SimpleClientHttpRequestFactory();
factory.setProxy(new java.net.Proxy(
java.net.Proxy.Type.HTTP,
new java.net.InetSocketAddress("proxy.example", 8080)));
return new RestTemplate(factory);
}
对于 Spring 6.2 的 JDK 请求工厂,Proxy.NO_PROXY 提供显式的直连策略。若将工厂的代理留空,则允许走通常的 URLConnection 配置路径,该路径可能选中 JVM 代理。
在注入点使用 @Qualifier 选择所需的 Bean,例如 @Qualifier("directRestTemplate") RestTemplate rest。仅仅定义两个 Bean,并不能在依赖有歧义时于二者之间做出选择。
此示例选择不带认证的 HTTP 代理。需要代理认证的传输层可以单独构建,并使用其支持的凭据提供者,同时保留同样的 Bean 选择安排。对于使用 Apache HttpClient 5 的 Spring 6,把该提供者限定在代理端点上。
应用有意安装的其他拦截器或请求工厂仍属于其自身的客户端配置。请把它们与真正需要它们的路由放在一起。