首页 > 解决方案 > Spring Boot:使用不同配置扩展/编辑 Apache HttpClientBuilder?

问题描述

我遇到了 Apache HttpComponents HttpClient 的架构问题。

我们有一个系统,我们有几个不同的远程端点要联系,每个端点都有一些不同的配置,如 ssl、基本身份验证等。

我正在使用 Spring Boot 和 Cloud Sleuth,从中可以得到HttpClientBuilder跟踪和其他功能。我想重用它 HttpClientBuilder但除此之外,为每个唯一的端点添加我自己的特定配置。

但问题是方法HttpCientBuilder不是不可变的,构建器上withXYZ()也没有copyorclone方法,因此我无法复制原始内容并仅更改我的特定更改而不更改基础HttpClientBuilder并与使用的其他人发生冲突构建器的相同实例。无论是线程之间的竞争条件还是不同端点之间的冲突配置。

在 Spring Boot 项目中,我看到他们似乎想要做类似的事情的一个HttpClientConfiguration地方是Spring Cloud Commons,它创建了一个自己的ApacheHttpClientFactory,它采用原始的自动装配HttpClientBuilder然后设置disableContentCompression()disableCookieManagement()并且useSystemProperties()- 但它似乎对HttpClientBuilderwhich的原始实例进行了操作对我来说似乎完全错误。它将改变所有构建的HttpClient工作方式,而不仅仅是他们稍后将HttpClientRibbonConfigurationSpring Cloud Netflix Ribbon. 隐藏的潜在错误?对我来说似乎是这样,因为它高度依赖于调用顺序。

有谁知道应该如何解决这样的问题?

我可以做的一个简单的替代方法是不要尝试在HttpClientBuilderSleuth 给定的基础上进行构建,而是在每次需要时从头开始构建一个全新的,并检查HttpTracingbean 是否可用并使用TracingHttpCientBuilder而不是HttpClientBuilderin这种情况,但这似乎违反直觉。

标签: spring-bootapache-httpclient-4.xapache-httpcomponents

解决方案


我遇到了完全相同的问题。但是,我可以选择定义自己的HttpClientBuilderbean。我不确定你是否处于相同的位置?

但是通过使 bean 范围“原型”每次注入某个地方时都会创建一个新的 bean 实例。然后我可以在注入后安全地修改 HttpClientBuilder 。

    @Bean
    @Scope("prototype")
    public HttpClientBuilder tracingHttpClientBuilder(..) {
    ...
    }


推荐阅读