Uvod u Spring Cloud OpenFeign

1. Pregled

U ovom uputstvu opisat ćemo Spring Cloud OpenFeign - deklarativni REST klijent za Spring Boot aplikacije.

Feign olakšava pisanje klijenata web usluga pomoću dodatne podrške za napomene, koja uključuje napomene za Feign i JAX-RS napomene.

Također, Spring Cloud dodaje podršku za proljetne MVC bilješke i za njihovo korištenje HttpMessageConverters kao što se koristi u Spring Webu.

Sjajna stvar u korištenju Feigna je ta što ne moramo pisati bilo koji kod za pozivanje usluge, osim definicije sučelja.

2. Ovisnosti

Prvo ćemo započeti s izradom web projekta Spring Boot i dodavanjem proljeće-oblak-starter-openfeign ovisnost o našoj pom.xml datoteka:

 org.springframework.cloud proljeće-oblak-starter-openfeign 

Također, trebat ćemo dodati ovisnosti proljeća-oblaka:

    org.springframework.cloud proljeće-oblak-ovisnosti $ {spring-cloud.version} pom import 

Možemo pronaći najnovije verzije proljeće-oblak-starter-openfeign i ovisnosti proljeća-oblaka na Maven Central.

3. Pretvarani klijent

Dalje, trebamo dodati @EnableFeignClients u naš glavni razred:

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

Ovom bilješkom omogućavamo skeniranje komponenata za sučelja koja izjavljuju da su klijenti Feign.

Zatim, deklariramo klijenta Feign pomoću @FeignClient napomena:

@FeignClient (value = "jplaceholder", url = "//jsonplaceholder.typicode.com/") javno sučelje JSONPlaceHolderClient {@RequestMapping (method = RequestMethod.GET, value = "/ posts") Popis getPosts (); @RequestMapping (method = RequestMethod.GET, value = "/ posts / {postId}", produce = "application / json") Objavi getPostById (@PathVariable ("postId") Long postId); }

U ovom smo primjeru konfigurirali klijenta za čitanje s JSONPlaceHolder API-ja.

The vrijednost argument proslijeđen u @FeignClient napomena je obvezno, proizvoljno ime klijenta, dok je kod url argument, mi specificiramo API osnovni URL.

Nadalje, budući da je ovo sučelje klijent Feign, možemo upotrijebiti proljetne web bilješke kako bismo deklarirali API-je do kojih želimo doći.

4. Konfiguracija

Sad je vrlo važno to razumjeti svaki klijent Feign sastoji se od skupa prilagodljivih komponenata.

Spring Cloud stvara novi zadani skup na zahtjev za svakog imenovanog klijenta pomoću FeignClientsConfiguration klase koju možemo prilagoditi kako je objašnjeno u sljedećem odjeljku.

Gornja klasa sadrži ove grah:

  • Dekoder - ResponseEntityDecoder, koji obavija SpringDecoder, koristi za dekodiranje Odgovor
  • Davač - SpringEncoder, koristi se za kodiranje RequestBody
  • Sjekač - Slf4jLogger je zadani zapisnik koji koristi Feign
  • Ugovor - SpringMvcContract, koji omogućuje obradu napomena
  • Graditelj fingiranja - HystrixFeign.Builder koristi se za konstrukciju komponenata
  • Klijent - LoadBalancerFeignClient ili zadani klijent Feign

4.1. Prilagođena konfiguracija graha

Ako želimo prilagoditi jedan ili više ovih zrna, možemo ih nadjačati pomoću a @Konfiguracija klase, koju zatim dodajemo u FeignClient napomena:

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

U ovom primjeru kažemo Feignu da koristi OkHttpClient umjesto zadanog da podržava HTTP / 2.

Feign podržava više klijenata za različite slučajeve upotrebe, uključujući ApacheHttpClient, koji uz zahtjev šalje više zaglavlja - na primjer, Duljina sadržaja, što neki poslužitelji očekuju.

Da bismo koristili ove klijente, ne zaboravimo dodati potrebne ovisnosti u naše pom.xml datoteka, na primjer:

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

Možemo pronaći najnovije verzije hinjenje-okhttp i hinje-httpclient na Maven Central.

4.2. Konfiguracija pomoću svojstava

Umjesto da koristite a @Konfiguracija razred, svojstva aplikacije možemo koristiti za konfiguriranje klijenata Feign, kao što je prikazano u ovome primjena.yaml primjer:

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

Ovom konfiguracijom postavljamo vremenska ograničenja na 5 sekundi, a razinu zapisnika na Osnovni, temeljni za svakog deklariranog klijenta u aplikaciji.

Konačno, možemo stvoriti konfiguraciju pomoću zadano kao ime klijenta za konfiguriranje svih @FeignClient objekata, ili možemo deklarirati ime pretvarača za konfiguraciju:

hinjenje: klijent: konfiguracija: jplaceholder:

Ako imamo oboje @Konfiguracija grah i svojstva konfiguracije, svojstva konfiguracije će nadjačati @Konfiguracija vrijednosti.

5. Presretači

Dodavanje presretača je još jedna korisna značajka koju pruža Feign.

Presretači mogu izvoditi razne implicitne zadatke, od provjere autentičnosti do zapisivanja, za svaki HTTP zahtjev / odgovor.

U ovom ćemo odjeljku implementirati vlastiti presretač, kao i onaj koji pruža Spring Cloud OpenFeign odmah iz kutije. Oboje će dodajte osnovno zaglavlje za provjeru autentičnosti svakom zahtjevu.

5.1. Provedba ZahtjevInterceptor

Dakle, u isječku ispod, implementiramo naš presretač prilagođenih zahtjeva:

@Bean javni RequestInterceptor requestInterceptor () {return requestTemplate -> {requestTemplate.header ("korisnik", korisničko ime); requestTemplate.header ("lozinka", lozinka); requestTemplate.header ("Prihvati", ContentType.APPLICATION_JSON.getMimeType ()); }; }

Također, da bismo dodali presretač u lanac zahtjeva, samo trebamo dodati ovaj grah u naš @Konfiguracija klase, ili kao što smo ranije vidjeli, prijavite je u datoteci svojstava:

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

5.2. Koristeći BasicAuthRequestInterceptor

Alternativno, možemo koristiti BasicAuthRequestInterceptor klasa koju pruža Spring Cloud OpenFeign:

@Bean public BasicAuthRequestInterceptor basicAuthRequestInterceptor () {return new BasicAuthRequestInterceptor ("korisničko ime", "lozinka"); }

To je jednostavno! Sada će svi zahtjevi sadržavati osnovno zaglavlje za provjeru autentičnosti.

6. Podrška za Hystrix

Feign podržava Hystrix, pa ako smo ga omogućili, možemo primijeniti zamjenski obrazac.

Uz zamjenski obrazac, kada daljinski poziv usluge zakaže, umjesto generiranja iznimke, potrošač usluge izvršit će alternativni put koda kako bi pokušao izvršiti radnju na drugi način.

Da bismo postigli cilj, moramo omogućiti dodavanje Hystrixa feign.hystrix.enabled = true u datoteci svojstava.

To nam omogućuje da implementiramo rezervne metode koje se pozivaju kada usluga zakaže:

@Component javna klasa JSONPlaceHolderFallback implementira JSONPlaceHolderClient {@Override javni popis getPosts () {return Collections.emptyList (); } @Override public Post getPostById (Long postId) {return null; }}

Da bismo Feignu dali do znanja da su osigurane zamjenske metode, također moramo postaviti našu zamjensku klasu u @FeignClient napomena:

@FeignClient (value = "jplaceholder", url = "//jsonplaceholder.typicode.com/", backupback = JSONPlaceHolderFallback.class) javno sučelje JSONPlaceHolderClient {// APIs}

7. Sječa drva

Za svakog klijenta Feign, zapisnik se stvara prema zadanim postavkama.

Da bismo omogućili prijavu, trebali bismo je prijaviti u primjena.vlasništvos datotekom koja koristi naziv paketa klijentskih sučelja:

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

Ili, ako želimo omogućiti bilježenje samo za jednog određenog klijenta u paketu, možemo koristiti puno ime klase:

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

Imajte na umu da prijavljivanje finga odgovara samo na DEBUG nivo.

The Sjekač.Na razini koje možemo konfigurirati po klijentu, naznačuje koliko se prijaviti:

@Configuration javna klasa ClientConfiguration {@Bean Logger.Level feignLoggerLevel () {return Logger.Level.BASIC; }}

Na izboru su četiri razine zapisivanja:

  • NITKO - nema zapisivanja, što je zadana postavka
  • OSNOVNI, TEMELJNI - evidentirati samo način zahtjeva, URL i status odgovora
  • GLAVE - evidentirati osnovne podatke zajedno sa zaglavljima zahtjeva i odgovora
  • PUNO - zabilježite tijelo, zaglavlja i metapodatke i za zahtjev i za odgovor

8. Rukovanje pogreškama

Zadani rukovatelj pogreškama, ErrorDecoder.default, uvijek baca a FeignException.

Ovo ponašanje nije uvijek najkorisnije. Tako, za prilagodbu bačene iznimke možemo koristiti CustomErrorDecoder:

javna klasa CustomErrorDecoder implementira ErrorDecoder {@Override dekodiranje javne iznimke (String methodKey, Response response) {switch (response.status ()) {case 400: return new BadRequestException (); slučaj 404: vrati novi NotFoundException (); zadano: vrati novu iznimku ("Generička pogreška"); }}}

Zatim, kao i ranije, moramo zamijeniti zadani ErrorDecoder dodavanjem graha u @Konfiguracija razred:

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

9. Zaključak

U ovom smo članku raspravljali o Spring Cloud OpenFeignu i njegovoj implementaciji u jednostavnom uzorku aplikacije.

Štoviše, vidjeli smo kako konfigurirati klijenta, kako dodati presretače našim zahtjevima i kako postupati s pogreškama pomoću Hystrix i ErrorDecoder.

Kao i obično, svi uzorci koda prikazani u ovom vodiču dostupni su na GitHubu.