2

來自DropWizard我習慣了它的HttpClientConfiguration,我很困惑,在Spring Boot中,我找不到一些支持以類似的方式控制要使用的http客戶端實例,RestTemplates例如。春天可配置,高性能,計量http客戶端實例

爲了在生產環境中工作,底層的客戶端實現應該是高性能的(例如非阻塞IO,並且連接重用和池化)。

然後,我需要設置超時或身份驗證,可能收集指標,cookie設置,SSL證書設置。

以上所有內容都應該很容易設置爲不同的實例,以便在不同的環境中使用不同的實例(例如,服務X使用這些設置和此池,Y使用另一個池和設置),大多數參數應該通過環境特定的屬性設置爲在生產/ qa /開發中具有不同的值。

有沒有什麼東西可以用於此目的?

回答

5

下面是使用配置類配置HttpClient的示例。它通過這個RestTemplate配置所有請求的基本身份驗證以及對池的一些調整。

HttpClientConfiguration.java

@Configuration 
public class HttpClientConfiguration { 

    private static final Logger log = LoggerFactory.getLogger(HttpClientConfiguration.class); 

    @Autowired 
    private Environment environment; 

    @Bean 
    public ClientHttpRequestFactory httpRequestFactory() { 
    return new HttpComponentsClientHttpRequestFactory(httpClient()); 
    } 

    @Bean 
    public RestTemplate restTemplate() { 
    RestTemplate restTemplate = new RestTemplate(httpRequestFactory()); 
    restTemplate.setInterceptors(ImmutableList.of((request, body, execution) -> { 
     byte[] token = Base64.encodeBase64((format("%s:%s", environment.getProperty("fake.username"), environment.getProperty("fake.password"))).getBytes()); 
     request.getHeaders().add("Authorization", format("Basic %s", new String(token))); 

     return execution.execute(request, body); 
    })); 

    return restTemplate; 
    } 

    @Bean 
    public HttpClient httpClient() { 
    PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(); 

    // Get the poolMaxTotal value from our application[-?].yml or default to 10 if not explicitly set 
    connectionManager.setMaxTotal(environment.getProperty("poolMaxTotal", Integer.class, 10)); 

    return HttpClientBuilder 
     .create() 
     .setConnectionManager(connectionManager) 
     .build(); 
    } 

    /** 
    * Just for demonstration 
    */ 
    @PostConstruct 
    public void debug() { 
    log.info("Pool max total: {}", environment.getProperty("poolMaxTotal", Integer.class)); 
    } 
} 

和示例application.yml

fake.username: test 
fake.password: test 
poolMaxTotal: 10 

可以外化配置值,以你的application.ymlpoolMaxTotal以上等。

要在每個環境中支持不同的值,可以使用Spring配置文件。使用上面的示例,您可以創建application-prod.yml,其中poolMaxTotal的「prod」特定值。然後使用--spring.profiles.active=prod啓動您的應用程序,並使用「prod」值代替application.yml中的默認值。無論您需要多少環境,都可以做到這一點。

application-prod.yml

poolMaxTotal: 20 

對於異步HttpClient,在這裏看到:http://vincentdevillers.blogspot.fr/2013/10/a-best-spring-asyncresttemplate.html

+0

值得稱道的典範(其實有點類似於我做了什麼),但仍從什麼Dropwizard有很遠。 –