У меня возникла архитектурная проблема с Apache HttpComponents HttpClient.
У нас есть система, в которой у нас есть несколько различных удаленных конечных точек, с которыми мы хотим связаться, и у каждой из них есть несколько различных конфигураций, таких как ssl, basic auth,и так далее.
Я использую Spring Boot и Cloud Sleuth, из которых я получаю HttpClientBuilder
, который дает мне трассировку и другие вещи. Я хочу повторно использовать , что HttpClientBuilder
, но вдобавок к этому добавить моих собственных конкретных конфигураций для каждой уникальной конечной точки.
Проблема заключается в том, чтоHttpCientBuilder
не является неизменяемым с методами withXYZ()
, и при этом нет метода copy
или clone
на сборщике, поэтому я не могу скопировать оригинал и изменить только свои конкретные изменения без изменения базы HttpClientBuilder
и вступать в конфликты с другими, которые используют тот же экземпляр строителя. Будь то условия гонки между потоками или конфликтующие конфигурации между различными конечными точками.
Одно место в проекте Spring Boot, где, как я видел, они, похоже, хотят сделать что-то подобное, находится в HttpClientConfiguration
из Spring Cloud Commons
, где он создаетсобственный ApacheHttpClientFactory
, который берет исходную автопроводку HttpClientBuilder
, а затем устанавливает disableContentCompression()
, disableCookieManagement()
и useSystemProperties()
- но, похоже, делает это с оригинальным экземпляром HttpClientBuilder
, что мне кажется совершенно неправильным,Это изменит работу всех встроенных HttpClient
, а не только того, который они позже будут использовать в своем коде ленты в HttpClientRibbonConfiguration
из Spring Cloud Netflix Ribbon
. Потенциальная ошибка в сокрытии? Мне кажется, это так, потому что это сильно зависит от порядка вызова.
У кого-нибудь есть идеи, как что-то подобное решить?
Простая альтернатива, которую я мог бы сделать, это простоне пытайтесь построить на основе данного HttpClientBuilder
от Sleuth, но вместо этого создавайте совершенно новый с нуля каждый раз, когда он мне нужен, и проверяйте, доступен ли бин HttpTracing
, и используйте TracingHttpCientBuilder
вместо HttpClientBuilder
в этом случае, но это кажется нелогичным.