Spring Boot: расширить / редактировать Apache HttpClientBuilder с различными конфигурациями? - PullRequest
0 голосов
/ 18 октября 2019

У меня возникла архитектурная проблема с 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 в этом случае, но это кажется нелогичным.

...