Úvod do hry Feign

1. Prehľad

V tomto tutoriáli si predstavíme Feign - deklaratívny klient HTTP vyvinutý spoločnosťou Netflix.

Cieľom Feign je zjednodušenie klientov HTTP API. Jednoducho povedané, vývojárovi stačí deklarovať a anotovať rozhranie, zatiaľ čo skutočná implementácia je zabezpečená za behu.

2. Príklad

V celom tomto výučbe budeme používať ukážkovú aplikáciu pre kníhkupectvá, ktorá sprístupňuje koncový bod REST API.

Projekt môžeme ľahko naklonovať a spustiť lokálne:

mvn nainštalovať spring-boot: spustiť

3. Inštalácia

Najskôr pridajme potrebné závislosti:

 io.github.openfeign feign-okhttp 10.11 io.github.openfeign feign-gson 10.11 io.github.openfeign feign-slf4j 10.11 

Okrem závislosti na predstieranom jadre (ktorá je tiež stiahnutá) použijeme niekoľko doplnkov, najmä: feign-okhttp na interné použitie klienta OkHttp spoločnosti Square na zadávanie požiadaviek, feign-gson na použitie GSON spoločnosti Google ako procesora JSON a feign- slf4j pre použitie Jednoduchá fasáda s ťažbou dreva na prihlásenie požiadaviek.

Aby sme skutočne získali nejaký výstup protokolu, budeme potrebovať našu obľúbenú implementáciu záznamníka podporovanú SLF4J na ceste triedy.

Predtým, ako začneme vytvárať naše klientske rozhranie, najskôr nastavíme a Kniha model uchovávania údajov:

verejná trieda Book {private String isbn; súkromný autor reťazcov; súkromný názov reťazca; súkromná Synopsa strún; súkromný reťazcový jazyk; // štandardný konštruktor, getre a setre}

POZNÁMKA: Procesor JSON vyžaduje minimálne „konštruktor bez argumentov“.

Náš poskytovateľ REST je v skutočnosti hypermediálne riadené API, takže budeme navyše potrebovať jednoduchú triedu obálky:

public class BookResource {súkromná kniha kníh; // štandardný konštruktor, getre a setre}

Poznámka: MyZachovám BookResource jednoduché, pretože náš vzorový klient Feign nemá výhody z hypermediálnych funkcií!

4. Strana servera

Aby sme pochopili, ako definovať klienta Feign, najskôr sa pozrieme na niektoré metódy a odpovede podporované našim poskytovateľom REST.

Vyskúšame to pomocou jednoduchého príkazu na zvlnenie, aby sme uviedli zoznam všetkých kníh. Musíme si uvedomiť, že predvoľby musia byť všetky / api, čo je servletový kontext aplikácie:

zvlnenie // localhost: 8081 / api / knihy

Vo výsledku dostaneme kompletné úložisko kníh vo formáte JSON:

[{"book": {"isbn": "1447264533", "autor": "Margaret Mitchell", "title": "Gone with the Wind", "synopsis": null, "language": null}, "odkazy ": [{" rel ":" self "," href ":" // localhost: 8081 / api / books / 1447264533 "}]}, ... {" book ": {" isbn ":" 0451524934 ", "author": "George Orwell", "title": "1984", "synopsis": null, "language": null}, "links": [{"rel": "self", "href": "/ / localhost: 8081 / api / books / 0451524934 "}]}]

Môžeme sa pýtať aj jednotlivcov Kniha zdroj, pripojením kódu ISBN k žiadosti o získanie:

zvlnenie // localhost: 8081 / api / books / 1447264533

5. Falošný klient

Na záver definujeme nášho klienta Feign.

Použijeme @RequestLine anotácia na určenie slovesa HTTP a časti cesty ako argumentu. Parametre budú modelované pomocou @Param anotácia:

verejné rozhranie BookClient {@RequestLine ("GET / {isbn}") BookResource findByIsbn (@Param ("isbn") Reťazec isbn); @RequestLine ("ZÍSKAŤ") Zoznam findAll (); @RequestLine ("POST") @Headers ("Content-Type: application / json") void create (kniha); }

POZNÁMKA: Falošní klienti sa dajú použiť iba na konzumáciu textových HTTP API, čo znamená, že nemôžu spracovávať binárne údaje, napr. nahrávanie alebo sťahovanie súborov.

To je všetko! Teraz použijeme Feign.builder () nakonfigurovať nášho klienta založeného na rozhraní. Skutočná implementácia bude poskytnutá za behu:

BookClient bookClient = Feign.builder () .client (nový OkHttpClient ()). Encoder (nový GsonEncoder ()) .decoder (nový GsonDecoder ()) .logger (nový Slf4jLogger (BookClient.class)) .logLevel (Logger.Level. FULL) .target (BookClient.class, "// localhost: 8081 / api / books");

Feign podporuje na vykonávanie požiadaviek rôzne doplnky, ako sú napríklad kodéry a dekodéry JSON / XML alebo podkladový klient HTTP.

6. Test jednotky

Vytvorme tri testovacie prípady na otestovanie nášho klienta. Upozorňujeme, že pre statické importy používame statické importy org.hamcrest.CoreMatchers. * a org.junit.Assert. *:

@Test public void givenBookClient_shouldRunSuccessfully () vyvolá výnimku {List books = bookClient.findAll (). Stream () .map (BookResource :: getBook) .collect (Collectors.toList ()); assertTrue (books.size ()> 2); } @Test public void givenBookClient_shouldFindOneBook () vyvolá výnimku {Book book = bookClient.findByIsbn ("0151072558"). GetBook (); assertThat (book.getAuthor (), containsString ("Orwell")); } @Test public void givenBookClient_shouldPostBook () vyvolá výnimku {String isbn = UUID.randomUUID (). ToString (); Kniha kniha = nová Kniha (isbn, „Ja“, „To som ja!“, Null, null); bookClient.create (kniha); book = bookClient.findByIsbn (isbn) .getBook (); assertThat (book.getAuthor (), je („Ja“)); } 

7. Ďalšie čítanie

Ak potrebujeme nejaké záložné riešenie v prípade nedostupnosti služby, mohli by sme do cesty triedy pridať HystrixFeign a postaviť nášho klienta pomocou HystrixFeign.builder ().

V tejto vyhradenej sérii návodov sa dozviete viac o aplikácii Hystrix.

Ak by sme navyše chceli integrovať Spring Cloud Netflix Hystrix s Feign, tu je vyhradený článok.

Okrem toho je tiež možné pridať k nášmu klientovi vyvažovanie záťaže na strane klienta a / alebo zisťovanie služieb.

Mohli by sme to dosiahnuť pridaním pásky na našu cestu k triede a používaním nástroja na tvorbu takto:

BookClient bookClient = Feign.builder () .client (RibbonClient.create ()) .target (BookClient.class, "// localhost: 8081 / api / books");

Pre objavovanie služieb musíme vybudovať našu službu s povoleným Spring Cloud Netflix Eureka. Potom sa jednoducho integrujte do Spring Cloud Netflix Feign. Vďaka tomu dostaneme službu Vyrovnávanie zaťaženia pásky zadarmo. Viac o tomto nájdete tu.

8. Záver

V tomto článku sme vysvetlili, ako zostaviť deklaratívneho klienta HTTP pomocou nástroja Feign na konzumáciu textových rozhraní API.

Ako obvykle sú všetky ukážky kódu zobrazené v tomto tutoriále dostupné na GitHub.


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