Introduksjon til Spring Cloud OpenFeign

1. Oversikt

I denne opplæringen skal vi beskrive Spring Cloud OpenFeign - en deklarativ REST-klient for Spring Boot-apper.

Feign gjør det enklere å skrive webtjenestekunder med pluggbar kommentarstøtte, som inkluderer Feign-merknader og JAX-RS-merknader.

Spring Cloud legger også til støtte for Spring MVC-merknader og for bruk av det samme HttpMessageConverters som brukt i Spring Web.

En flott ting med å bruke Feign er at vi ikke trenger å skrive noen kode for å ringe tjenesten, bortsett fra en grensesnittdefinisjon.

2. Avhengigheter

Først begynner vi med å lage et Spring Boot-nettprosjekt og legge til vår-sky-starter-openfeign avhengighet til vår pom.xml fil:

 org.springframework.cloud spring-cloud-starter-openfeign 

Vi må også legge til vår-sky-avhengigheter:

    org.springframework.cloud spring-cloud-dependencies $ {spring-cloud.version} pom import 

Vi finner de nyeste versjonene av vår-sky-starter-openfeign og vår-sky-avhengigheter på Maven Central.

3. Feign-klient

Deretter må vi legge til @EnableFeignClients til hovedklassen vår:

@SpringBootApplication @EnableFeignClients public class EksempelApplication {public static void main (String [] args) {SpringApplication.run (ExampleApplication.class, args); }}

Med denne kommentaren aktiverer vi komponentskanning etter grensesnitt som erklærer at de er Feign-klienter.

Deretter, vi erklærer en Feign-klient ved hjelp av @FeignClient kommentar:

@FeignClient (value = "jplaceholder", url = "//jsonplaceholder.typicode.com/") offentlig grensesnitt JSONPlaceHolderClient {@RequestMapping (method = RequestMethod.GET, value = "/ posts") Liste getPosts (); @RequestMapping (method = RequestMethod.GET, value = "/ posts / {postId}", produserer = "application / json") Post getPostById (@PathVariable ("postId") Long postId); }

I dette eksemplet har vi konfigurert en klient til å lese fra JSONPlaceHolder API-ene.

De verdi argument bestått i @FeignClient kommentar er et obligatorisk, vilkårlig klientnavn, mens det med url argument, spesifiserer vi API-basen URL.

Videre, siden dette grensesnittet er en Feign-klient, kan vi bruke Spring Web-merknadene til å erklære API-ene vi vil nå ut til.

4. Konfigurasjon

Nå er det veldig viktig å forstå det hver Feign-klient består av et sett med tilpassbare komponenter.

Spring Cloud oppretter et nytt standardsett på forespørsel for hver navngitte klient ved hjelp av FeignClientsConfiguration klasse som vi kan tilpasse som forklart i neste avsnitt.

Ovennevnte klasse inneholder disse bønnene:

  • Dekoder - ResponseEntityDecoder, som brytes inn SpringDecoder, brukes til å dekode Respons
  • Koder - SpringEncoder, brukes til å kode RequestBody
  • Logger - Slf4jLogger er standard logger som brukes av Feign
  • Kontrakt - SpringMvcContract, som gir behandling av merknader
  • Feign-Builder - HystrixFeign.Builder brukes til å konstruere komponentene
  • Klient - LoadBalancerFeignClient eller standard Feign-klient

4.1. Tilpasset bønnekonfigurasjon

Hvis vi ønsker å tilpasse en eller flere av disse bønnene, vi kan overstyre dem ved hjelp av a @Konfigurasjon klasse, som vi deretter legger til FeignClient kommentar:

@FeignClient (verdi = "jplaceholder", url = "//jsonplaceholder.typicode.com/", konfigurasjon = MyClientConfiguration.class)
@Configuration public class MyClientConfiguration {@Bean public OkHttpClient client () {return new OkHttpClient (); }}

I dette eksemplet ber vi Feign bruke OkHttpClient i stedet for standard en som støtter HTTP / 2.

Feign støtter flere klienter for forskjellige brukstilfeller, inkludert ApacheHttpClient, som sender flere overskrifter med forespørselen - for eksempel Innholdslengde, som noen servere forventer.

La oss ikke glemme å legge til de nødvendige avhengighetene for å bruke disse klientene pom.xml fil, for eksempel:

 io.github.openfeign feign-okhttp io.github.openfeign feign-httpclient 

Vi finner de nyeste versjonene av feign-okhttp og feign-httpclient på Maven Central.

4.2. Konfigurasjon ved hjelp av egenskaper

Snarere enn å bruke en @Konfigurasjon klasse, vi kan bruke applikasjonsegenskaper for å konfigurere Feign-klienter, som vist i dette application.yaml eksempel:

feign: client: config: default: connectTimeout: 5000 readTimeout: 5000 loggerLevel: basic

Med denne konfigurasjonen setter vi tidsavbrudd til 5 sekunder og loggernivået til grunnleggende for hver erklært klient i applikasjonen.

Til slutt kan vi opprette konfigurasjonen med misligholde som klientnavnet for å konfigurere alle @FeignClient objekter, eller vi kan erklære feign-klientnavnet for en konfigurasjon:

feign: client: config: jplaceholder:

Hvis vi har begge deler @Konfigurasjon bønne- og konfigurasjonsegenskaper, vil konfigurasjonsegenskapene overstyre @Konfigurasjon verdier.

5. Avskjærere

Å legge til interceptors er en annen nyttig funksjon levert av Feign.

Avlytterne kan utføre en rekke implisitte oppgaver, fra autentisering til logging, for hver HTTP-forespørsel / respons.

I denne delen implementerer vi vår egen interceptor, samt bruker den som tilbys av Spring Cloud OpenFeign out-of-the-box. Begge vil legg til en grunnleggende autentiseringshode til hver forespørsel.

5.1. Implementering RequestInterceptor

Så, i kodebiten nedenfor, la oss implementere vår tilpassede forespørselsavlytter:

@Bean public RequestInterceptor requestInterceptor () {return requestTemplate -> {requestTemplate.header ("bruker", brukernavn); requestTemplate.header ("passord", passord); requestTemplate.header ("Godta", ContentType.APPLICATION_JSON.getMimeType ()); }; }

For å legge til interceptor i forespørselskjeden, trenger vi bare å legge denne bønnen til @Konfigurasjon klasse, eller som vi så tidligere, erklær det i egenskapsfilen:

feign: client: config: default: requestInterceptors: com.baeldung.cloud.openfeign.JSONPlaceHolderInterceptor

5.2. Ved hjelp av BasicAuthRequestInterceptor

Alternativt kan vi bruke BasicAuthRequestInterceptor klasse som Spring Cloud OpenFeign gir:

@Bean offentlig BasicAuthRequestInterceptor basicAuthRequestInterceptor () {returner nytt BasicAuthRequestInterceptor ("brukernavn", "passord"); }

Det er enkelt som det! Nå vil alle forespørslene inneholde den grunnleggende autentiseringsoverskriften.

6. Hystrix-støtte

Feign støtter Hystrix, så hvis vi har aktivert det, vi kan implementere reservemønsteret.

Når tilbakemeldingsmønsteret mislykkes, i stedet for å generere et unntak, vil tjenesteforbrukeren utføre en alternativ kodebane for å prøve å utføre handlingen på en annen måte.

For å nå målet, må vi aktivere Hystrix-tilsetning feign.hystrix.enabled = true i eiendomsfilen.

Dette lar oss implementere reservemetoder som kalles når tjenesten mislykkes:

@Komponent offentlig klasse JSONPlaceHolderFallback implementerer JSONPlaceHolderClient {@Override public List getPosts () {return Collections.emptyList (); } @Override public Post getPostById (Long postId) {return null; }}

For å gi Feign beskjed om at tilbakebetalingsmetoder har blitt gitt, må vi også sette vår reserveklasse i @FeignClient kommentar:

@FeignClient (value = "jplaceholder", url = "//jsonplaceholder.typicode.com/", fallback = JSONPlaceHolderFallback.class) offentlig grensesnitt JSONPlaceHolderClient {// APIer}

7. Logging

For hver Feign-klient opprettes en logger som standard.

For å aktivere logging, bør vi erklære det i application.properties-fil ved hjelp av pakkenavnet til klientgrensesnittene:

logging.level.com.baeldung.cloud.openfeign.client: DEBUG

Eller hvis vi bare vil aktivere logging for en bestemt klient i en pakke, kan vi bruke hele klassenavnet:

logging.level.com.baeldung.cloud.openfeign.client.JSONPlaceHolderClient: DEBUG

Merk at Feign-logging bare reagerer på DEBUG nivå.

De Logger. Nivå som vi kan konfigurere per klient angir hvor mye vi skal logge:

@Configuration offentlig klasse ClientConfiguration {@Bean Logger.Level feignLoggerLevel () {return Logger.Level.BASIC; }}

Det er fire loggningsnivåer å velge mellom:

  • INGEN - ingen logging, som er standard
  • GRUNNLEGGENDE - logg bare på forespørselsmetoden, URL og svarstatus
  • HOVEDER - logg på grunnleggende informasjon sammen med forespørsel og svaroverskrifter
  • FULL - logg inn kropp, overskrifter og metadata for både forespørsel og svar

8. Feilhåndtering

Feign standard feilbehandler, ErrorDecoder.default, kaster alltid en FeignException.

Nå er denne oppførselen ikke alltid den mest nyttige. Så, for å tilpasse unntaket som kastes, kan vi bruke en CustomErrorDecoder:

offentlig klasse CustomErrorDecoder implementerer ErrorDecoder {@ Override public Exception decode (String methodKey, Response response) {switch (response.status ()) {case 400: return new BadRequestException (); sak 404: returner nytt NotFoundException (); standard: returner nytt unntak ("Generisk feil"); }}}

Så, som vi har gjort tidligere, må vi erstatte standardverdien ErrorDecoder ved å legge en bønne til @Konfigurasjon klasse:

@Configuration public class ClientConfiguration {@Bean public ErrorDecoder errorDecoder () {return new CustomErrorDecoder (); }}

9. Konklusjon

I denne artikkelen diskuterte vi Spring Cloud OpenFeign og implementeringen av den i en enkel applikasjonseksempel.

Videre har vi sett hvordan vi konfigurerer en klient, hvordan vi legger til interceptors i forespørslene våre, og hvordan vi håndterer feil ved bruk Hystrix og ErrorDecoder.

Som vanlig er alle kodeeksempler vist i denne opplæringen tilgjengelig på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found