有些调用必须走企业代理,而另一个服务则直接访问。与其在每次调用前后切换共享路由,不如为这些路径提供各自的 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,把该提供者限定在代理端点上。

应用有意安装的其他拦截器或请求工厂仍属于其自身的客户端配置。请把它们与真正需要它们的路由放在一起。

相关文章