Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Declarative Clients in Spring

Declarative Clients in Spring

What is a declarative HTTP client vs an imperative one? Why are they useful and why should I care? We’ll talk about options that are available in the Spring Portfolio and what is coming on the horizon.

In this session, we will look at the history of declarative clients in Spring via Spring Cloud OpenFeign. We will also dive into upcoming options that are coming to Spring and the advantages that these new technologies bring to the developer experience.


Olga Maciaszek-Sharma

May 27, 2022

More Decks by Olga Maciaszek-Sharma

Other Decks in Technology


  1. Olga Maciaszek-Sharma Rossen Stoyanchev Declarative Clients in Spring Copyright ©

    2020 VMware, Inc. or its affiliates.
  2. About Olga Software Engineer in Spring Cloud team Spring Cloud

    LoadBalancer, Spring Cloud OpenFeign, Spring Cloud Netflix, Spring Cloud Contract, Spring Cloud Square, RSocket HTTP Bridge
  3. About Rossen Spring Framework and Spring for GraphQL teams Spring

    MVC, WebFlux, WebSocket, RSocket
  4. What is a declarative client?

  5. Sample applications Customer Service Verification Service HTTP POST /verify Customer

    Verification Result
  6. Direct use of HTTP client

  7. Client interface

  8. Implementation

  9. Implementation with helper methods

  10. Client interface usage

  11. What if we could just create an annotated interface and

    have a library/ framework translate it into actual HTTP client requests?
  12. Declarative/ interface client Client interface method calls HTTP calls Proxy

  13. Feign

  14. OpenFeign/Feign

  15. Feign Java to HTTP client binder • Core part of

    a former Spring Cloud Netflix module, passed over to the community • Supports various HTTP clients, including Apache HTTP, Apache HC5, Ok HTTP • Contracts - support for custom annotations and argument resolution • Support for a broad range of encoders/ decoders, including Jackson and GSON • Metrics, including Micrometer support
  16. Spring Cloud OpenFeign

  17. Spring Cloud OpenFeign Spring MVC and Spring Cloud support for

    OpenFeign • Spring MVC annotations support • Auto-configurations for Feign-specific beans • Spring Cloud LoadBalancer support • Spring Cloud CircuitBreaker support • Tracing support
  18. A declarative/ interface client

  19. A declarative/ interface client use

  20. Spring Cloud OpenFeign Demo Applications communicating over HTTP Customer Service

    SC OpenFeign Client SC LoadBalancer SC Sleuth Verification Service POST /verify Customer Verification Result Eureka Service Registry
  21. Spring Cloud OpenFeign - popularity Highly-readable interface clients with robust

    integrations • 797 GitHub stars • 8670549 Maven downloads in 2021 • Nearly flat learning curve for Spring MVC users
  22. Spring Cloud OpenFeign - issues • Issues with reusing client

    interfaces as controllers ◦ @RequestMapping at class level user issues (GH-547, GH-678) ◦ CVE-2021-22044 • Maintenance issues caused by dependence on third party upstream project • Lack of non-blocking support
  23. Spring Cloud Square Spring Boot and Spring Cloud support for

    Retrofit and OkHttp • WebClient support for Retrofit interface clients • Auto-configurations • Load-balancing • Tracing • Only Retrofit annotations • Incubator project
  24. RetroSocket Interface client for RSocket • Incubator project

  25. Considerations More third-party integrations or an in-house solution? • HTTP/reactive,

    RSocket/RetroSocket - converging solutions • Opportunity to create a first-class solution in the Spring Framework ◦ No maintenance dependence on third party projects • Previous Spring Cloud support built around external projects ◦ Possibility of providing integration on top of the Spring Framework interface clients
  26. HTTP & RSocket Interface Clients in Spring Framework 6.0

  27. Interface clients are not new in the Spring Framework Same

    mechanism, different protocols
  28. Why HTTP and RSocket now? Discussions with Spring Cloud around

    OpenFeign, Retrofit, and RSocket integrations
  29. Spring Framework 6.0 already had plans for RSocket interface client

  30. Old request for HTTP, deferred to… Spring Cloud OpenFeign

  31. Old request for HTTP, deferred to… Spring Cloud OpenFeign

  32. Opportunity to revisit Underlying mechanism is not specific to Spring

    Cloud Cloud features are extensions on top
  33. Some issues can only be addressed in Spring Framework programming

    model vs reusing @RequestMapping
  34. Decided to explore for Spring Framework 6.0

  35. HTTP interface client programming model Relationship to server @RequestMapping?

  36. Two goals Define a single request (no wildcards of any

    kind!) Avoid outright server-specific
  37. @RequestMapping attributes For mapping of 1..N requests Any HTTP method

    Any URL path
  38. @RequestMapping method parameters ServletRequest HttpMethod @RequestHeader @RequestParam @RequestBody @RequestAttribute @ModelAttribute

  39. @RequestMapping return values ResponseEntity HttpHeaders Body void Model View SseEmitter

  40. New method annotation to declare rather than map requests @RequestMapping

  41. @HttpExchange attributes url method contentType accept

  42. @HttpExchange method parameters Subset of those for @RequestMapping i.e. reusing

    method parameter annotations
  43. @HttpExchange method parameters URI HttpMethod @RequestHeader @PathVariable @RequestBody @RequestParam @CookieValue

  44. @HttpExchange return values Subset of those for @RequestMapping i.e. also

    using return value types
  45. None
  46. Blocking

  47. Reactive

  48. status, headers, body

  49. headers

  50. execute only

  51. None
  52. Spring Boot can declare this as a bean

  53. RSocket interface client planned for Spring Framework 6.0 M5

  54. Resources • Demo code • Spring Cloud OpenFeign • Spring

    Framework documentation for HTTP interface client • Spring Cloud Square • RetroSocket
  55. Thank you Twitter: @olga_maciaszek, @rstoya05 © 2020 Spring. A VMware-backed