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

Declarative_Clients_in_Spring - JNation

Declarative_Clients_in_Spring - JNation

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

June 09, 2022

More Decks by Olga Maciaszek-Sharma

Other Decks in Technology


  1. Olga Maciaszek-Sharma 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. What is a declarative client?

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

    Verification Result
  5. Direct use of HTTP client

  6. Client interface

  7. Implementation

  8. Implementation with helper methods

  9. Client interface usage

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

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

  12. Feign

  13. OpenFeign/Feign

  14. 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
  15. Spring Cloud OpenFeign

  16. 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
  17. A declarative/ interface client

  18. A declarative/ interface client use

  19. 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
  20. 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
  21. 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
  22. 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
  23. RetroSocket Interface client for RSocket • Incubator project

  24. 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
  25. HTTP & RSocket Interface Clients in Spring Framework 6.0

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  40. @HttpExchange attributes url method contentType accept

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

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

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

    using return value types
  44. None
  45. Blocking

  46. Reactive

  47. status, headers, body

  48. headers

  49. execute only

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

  52. RSocket interface client planned for Spring Framework 6.0 M5

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

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