Skip to content

Rationalize HTTP client configuration properties #47398

@DanielLiu1123

Description

@DanielLiu1123

Problem

The current design of spring.http.reactiveclient and spring.http.client introduces unnecessary duplication and complexity.

These two configurations serve blocking clients (RestClient) and reactive clients (WebClient) respectively.
Their configuration options are nearly identical, with the only difference being the underlying implementations (factory vs connector).

spring:
  http:
    client:
      connect-timeout: 1s
      read-timeout: 10s
      factory: jdk
      service:
        group:
          service-a:
            base-url: service-a:8080
            connect-timeout: 2s
            read-timeout: 30s
    reactiveclient:
      connect-timeout: 1s
      read-timeout: 10s
      connector: jdk
      service:
        group:
          service-b:
            base-url: service-b:8080
            connect-timeout: 2s
            read-timeout: 30s

This configuration structure is unnecessarily verbose and difficult to reason about. We can unify spring.http.reactiveclient and spring.http.client into a single spring.http.client configuration.

Proposed Solution

spring:
  http:
    client:
      connect-timeout: 1s
      read-timeout: 10s
      service:
        group:
          service-a:
            base-url: service-a:8080
            connect-timeout: 2s
            read-timeout: 30s
            client-type: rest_client
          service-b:
            base-url: service-b:8080
            connect-timeout: 2s
            read-timeout: 30s
            client-type: web_client

From a user's perspective, this unified configuration is clearer. The trade-off is that we cannot provide factory/connector configuration in properties, which is acceptable compared to the benefit of clearer configuration. Users can easily provide customization through RestClientCustomizer/WebClientCustomizer beans, making this a worthwhile trade-off.

In terms of implementation, we can merge the spring-boot-restclient and spring-boot-webclient modules into spring-boot-http-client, while keeping the spring-boot-starter-restclient and spring-boot-starter-webclient starters.

Overall, we unify the configuration for blocking and reactive clients, sacrificing the ability to configure factory/connector in exchange for more consistent and ergonomic configuration and cleaner code implementation.

Metadata

Metadata

Assignees

Labels

for: team-meetingAn issue we'd like to discuss as a team to make progresstype: enhancementA general enhancement

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions