spring-cloud / spring-cloud-openfeign

Support for using OpenFeign in Spring Cloud apps
Apache License 2.0
1.17k stars 756 forks source link

Default http client (Client.Default) seems not taking 'spring.cloud.openfeign.httpclient' properties when creating feign client with FeignClientBuilder #1028

Open Siegolas opened 2 months ago

Siegolas commented 2 months ago

I'm creating feign clients using method FeignClientBuilder(context). I'm trying to check the effect of "maxConnections" and "maxConnectionsPerRoute" properties from "spring.cloud.openfeign.httpclient" it seems they are not applied. I'm applying the properties:

spring:
    cloud:
        openfeign:
            httpclient:
                max-connections: 1
                max-connections-per-route: 1

I'm using spring-cloud-openfeign version 4.0.3

A sample of how I create the feign client:

private val target = FeignClientBuilder(context)
        .forType(PhoneMaskingServiceFeignClientExtension::class.java, PHONEMASKINGSERVICE)
        .url(phoneMaskingServiceConfig.url)
        .customize {
            it
                .encoder(GsonEncoder())
                .decoder(gsonDecoder)
                .requestInterceptors(RequestInterceptors.create())
                .requestInterceptor(OpenApiInterceptor())
                .requestInterceptor(HeadersInterceptor(headersConfig.getForwardingHeaders()))
                .requestInterceptor(
                    BasicAuthRequestInterceptor(
                        phoneMaskingServiceConfig.api.user,
                        phoneMaskingServiceConfig.api.password
                    )
                )

        }.build()

However when I force the client to be ApacheHttpClient one and I manually apply the mentioned properties it works as expected and when applying load testing the execution produces timeouts

private val target = FeignClientBuilder(context)
        .forType(PhoneMaskingServiceFeignClientExtension::class.java, PHONEMASKINGSERVICE)
        .url(phoneMaskingServiceConfig.url)
        .customize {
            it
                .encoder(GsonEncoder())
                .decoder(gsonDecoder)
                .client(
                    ApacheHttpClient(
                        HttpClientBuilder.create()
                            .setMaxConnPerRoute(1)
                            .setMaxConnTotal(1)
                            .build()
                    )
                )                
                .requestInterceptors(RequestInterceptors.create())
                .requestInterceptor(OpenApiInterceptor())
                .requestInterceptor(HeadersInterceptor(headersConfig.getForwardingHeaders()))
                .requestInterceptor(
                    BasicAuthRequestInterceptor(
                        phoneMaskingServiceConfig.api.user,
                        phoneMaskingServiceConfig.api.password
                    )
                )

        }.build()

So is there anything wrong in my setup? How can I achieve httpclient props max-connections and max-connections-per-route from "spring.cloud.openfeign.httpclient" are properly applied when using FeignClientBuilder? Is FeignClientBuilder applying "spring.cloud.openfeign.httpclient" properties for the default http client?

Thanks in advance

smileatom commented 1 month ago

@Siegolas I just had to debug this sadly . The httpclient property will not be applied to a client located at:

openfeign:
  httpclient:

nor will it work under the default client If you want it to be set properly move the httpclient underneth your named feign client

my-feignclient:
  httpclient:
    foo:

That will work.