spring-cloud-openfeign icon indicating copy to clipboard operation
spring-cloud-openfeign copied to clipboard

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

Open Siegolas opened this issue 1 year ago • 1 comments
trafficstars

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

Siegolas avatar May 04 '24 12:05 Siegolas

@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.

smileatom avatar May 29 '24 05:05 smileatom

Hello @Siegolas, this is by design; if you choose to explicitly use Feign's Builder for creating client beans, it's logic will be used for building the beans, not the context-based logic that we use with @EnableFeignClients, with Feign.Client being default client implementation, so you need to build an provide your own Feign client bean, with any additional setup included. In addition to that, the FeignClientBuilder only allows you to set the values that would usually be passed as attributes of the @FeignClient annotation in the resulting bean.

OlgaMaciaszek avatar Oct 03 '24 13:10 OlgaMaciaszek

If you would like us to look at this issue, please provide the requested information. If the information is not provided within the next 7 days this issue will be closed.

spring-cloud-issues avatar Oct 10 '24 13:10 spring-cloud-issues

Closing due to lack of requested feedback. If you would like us to look at this issue, please provide the requested information and we will re-open the issue.

spring-cloud-issues avatar Oct 17 '24 13:10 spring-cloud-issues