Bevezetés a Feign-be

1. Áttekintés

Ebben az oktatóanyagban bemutatjuk a Feign nevű deklaratív HTTP klienst, amelyet a Netflix fejlesztett ki.

A Feign célja a HTTP API-kliensek egyszerűsítése. Egyszerűen fogalmazva: a fejlesztőnek csak deklarálnia és kommentálnia kell egy interfészt, miközben a tényleges megvalósítás futás közben van kiépítve.

2. Példa

A bemutató során egy olyan könyvesbolt-alkalmazást fogunk használni, amely kiteszi a REST API végpontot.

Könnyen klónozhatjuk és helyben futtathatjuk a projektet:

mvn install spring-boot: run

3. Beállítás

Először adjuk hozzá a szükséges függőségeket:

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

A színmagos függőség mellett (amelyet szintén behúznak) néhány bővítményt fogunk használni, különösen: feign-okhttp a Square OkHttp kliensének belső használatára kérések benyújtására, feign-gson a Google GSON-jának JSON-processzorként történő használatára és feign- slf4j a Egyszerű naplózási homlokzat kérelmek naplózására.

Ahhoz, hogy valóban elérhessünk egy kis napló kimenetet, szükségünk lesz kedvenc, SLF4J által támogatott naplózó megvalósításra az osztályúton.

Mielőtt folytatnánk az ügyfélfelület létrehozását, először be kell állítanunk a Könyv modell az adatok tárolására:

nyilvános osztály Könyv {private String isbn; magánhúr-szerző; privát húr cím; privát húr szinopszis; privát String nyelv; // szabványos kivitelező, mérőeszközök és beállítók}

JEGYZET: A JSON processzornak legalább egy „argumentum nélküli konstruktorra” van szüksége.

Valójában a REST szolgáltatónk egy hipermédia által vezérelt API, ezért szükségünk lesz egy egyszerű burkoló osztályra is:

public class BookResource {magánkönyv book; // szabványos kivitelező, mérőeszközök és beállítók}

Jegyzet: Mimegtartom a BookResource egyszerű, mert a minta Feign kliensünk nem profitál a hipermédia funkcióiból!

4. Szerver oldal

A Feign kliens definiálásának megértéséhez először megvizsgáljuk a REST szolgáltatónk által támogatott módszereket és válaszokat.

Próbáljuk ki egy egyszerű curl shell paranccsal az összes könyv felsorolásához. Emlékeznünk kell arra, hogy az összes hívást előtagozzuk / api, amely az alkalmazás szervlet-kontextusa:

curl // localhost: 8081 / api / books

Ennek eredményeként kapunk egy teljes könyvtárat, amelyet JSON néven képviselünk:

[{"könyv": {"isbn": "1447264533", "author": "Margaret Mitchell", "title": "Elfújta a szél", "synopsis": null, "language": null}, "linkek" ": [{" 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 "}]}]

Kérdezhetünk egyénileg is Könyv erőforrás, az ISBN hozzáadásával a lekérési kérelemhez:

curl // localhost: 8081 / api / books / 1447264533

5. Feign Client

Végül definiáljuk a Feign kliensünket.

Használjuk a @RequestLine annotáció a HTTP ige és egy elérési út argumentumként történő megadásához. A paramétereket a @Param kommentár:

nyilvános felület BookClient {@RequestLine ("GET / {isbn}") BookResource findByIsbn (@Param ("isbn") karakterlánc isbn); @RequestLine ("GET") Lista findAll (); @RequestLine ("POST") @Headers ("Content-Type: application / json") érvénytelen létrehozás (Book book); }

JEGYZET: A Feign kliensek csak szöveges HTTP API-k fogyasztására használhatók, ami azt jelenti, hogy nem tudnak bináris adatokat kezelni, pl. fájlok feltöltése vagy letöltése.

Ez minden! Most használjuk a Feign.builder () az interfész-alapú kliensünk konfigurálásához. A tényleges megvalósítás futás közben kerül kiépítésre:

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

A Feign különféle bővítményeket támogat, például JSON / XML kódolókat és dekódereket, vagy egy mögöttes HTTP klienst a kérések megadásához.

6. Egység teszt

Készítsünk három tesztesetet ügyfelünk tesztelésére. Megjegyzés: statikus importálást használunk org.hamcrest.CoreMatchers. * és org.junit.Assert. *:

A @Test public void adottBookClient_shouldRunSuccessfully () dobja a {List books = bookClient.findAll (). Stream () .map (BookResource :: getBook) .collect (Collectors.toList ()) kivételeket; assertTrue (könyvek.méret ()> 2); } @Test public void adottBookClient_shouldFindOneBook () dobja a Kivételt {Book book = bookClient.findByIsbn ("0151072558"). GetBook (); assertThat (book.getAuthor (), tartalmazzaString ("Orwell")); } @Test public void adottBookClient_shouldPostBook () dobja a {Kivétel {String isbn = UUID.randomUUID (). ToString (); Könyvkönyv = új Könyv (isbn, "Me", "Ez vagyok én!", Null, null); bookClient.create (könyv); könyv = bookClient.findByIsbn (isbn) .getBook (); assertThat (book.getAuthor (), az ("Én")); } 

7. További olvasmány

Ha valamilyen tartalékra van szükségünk a szolgáltatás elérhetetlensége esetén, felvehetjük a HystrixFeign-ot az osztályútvonalra, és HystrixFeign.builder ().

Nézze meg ezt a dedikált oktatósorozatot, hogy többet tudjon meg a Hystrixről.

Ezen felül, ha szeretnénk integrálni a Spring Cloud Netflix Hystrix-et a Feign-nel, itt egy külön cikk található.

Ezenkívül az ügyféloldali terheléselosztás és / vagy szolgáltatás felfedezése is hozzáadható ügyfelünkhöz.

Ezt úgy érhetjük el, hogy a szalagot hozzáadjuk az osztályunkhoz, és így használhatjuk az építőt:

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

A szolgáltatás felfedezéséhez ki kell építenünk szolgáltatásunkat a Spring Cloud Netflix Eureka engedélyezésével. Ezután egyszerűen integrálódjon a Spring Cloud Netflix Feign programba. Ennek eredményeként ingyen kapjuk meg a Ribbon terheléselosztást. Erről többet itt talál.

8. Következtetés

Ebben a cikkben elmagyaráztuk, hogyan lehet deklaratív HTTP klienst készíteni a Feign használatával a szöveges API-k fogyasztására.

Szokás szerint az ebben az oktatóanyagban bemutatott összes kódminta elérhető a GitHubon.