Pengenalan ke Feign

1. Gambaran keseluruhan

Dalam tutorial ini, kami akan memperkenalkan Feign - klien HTTP deklaratif yang dikembangkan oleh Netflix.

Feign bertujuan mempermudah klien API HTTP. Ringkasnya, pembangun hanya perlu menyatakan dan memberi anotasi antara muka sementara pelaksanaan sebenarnya disediakan semasa waktu berjalan.

2. Contoh

Sepanjang tutorial ini, kami akan menggunakan contoh aplikasi kedai buku yang memaparkan titik akhir REST API.

Kami dapat mengklon projek dengan mudah dan menjalankannya secara tempatan:

mvn install spring-boot:run

3. Persediaan

Pertama, mari tambahkan kebergantungan yang diperlukan:

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

Selain kebergantungan teras-feign (yang juga ditarik masuk), kami akan menggunakan beberapa plugin, terutamanya: feign-okhttp untuk menggunakan klien OkHttp Square secara dalaman untuk membuat permintaan, feign-gson untuk menggunakan GSON Google sebagai pemproses JSON dan feign- slf4j untuk menggunakan Simple Logging Facade untuk log permintaan.

Untuk benar-benar mendapatkan output log, kami memerlukan pelaksanaan logger yang disokong SLF4J kegemaran kami di classpath.

Sebelum kita membuat antarmuka pelanggan, pertama kita akan menyediakan model Buku untuk menyimpan data:

public class Book { private String isbn; private String author; private String title; private String synopsis; private String language; // standard constructor, getters and setters }

CATATAN: Sekurang-kurangnya "tidak ada pembangun argumen" diperlukan oleh pemproses JSON.

Sebenarnya, penyedia REST kami adalah API yang didorong oleh hypermedia , jadi kami juga memerlukan kelas pembungkus sederhana:

public class BookResource { private Book book; // standard constructor, getters and setters }

Nota: Kami ' akan menyimpan BookResource mudah kerana sampel berbuat pura-pelanggan kami tidak mendapat manfaat daripada ciri-ciri hipermedia!

4. Bahagian Pelayan

Untuk memahami cara menentukan klien Feign, pertama-tama kita akan melihat beberapa kaedah dan respons yang disokong oleh penyedia REST kami.

Mari mencubanya dengan perintah kerang keriting sederhana untuk menyenaraikan semua buku. Kita perlu ingat untuk awalan semua panggilan dengan / api , yang merupakan konteks servlet aplikasi:

curl //localhost:8081/api/books

Hasilnya, kami akan mendapat repositori buku lengkap yang diwakili sebagai JSON:

[ { "book": { "isbn": "1447264533", "author": "Margaret Mitchell", "title": "Gone with the Wind", "synopsis": null, "language": null }, "links": [ { "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" } ] } ]

Kami juga dapat meminta sumber buku individu , dengan menambahkan ISBN ke permintaan get:

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

5. Pelanggan Feign

Akhirnya, mari kita tentukan pelanggan Feign kami.

Kami akan menggunakan anotasi @RequestLine untuk menentukan kata kerja HTTP dan bahagian jalan sebagai argumen. Parameter akan dimodelkan menggunakan anotasi @Param :

public interface BookClient { @RequestLine("GET /{isbn}") BookResource findByIsbn(@Param("isbn") String isbn); @RequestLine("GET") List findAll(); @RequestLine("POST") @Headers("Content-Type: application/json") void create(Book book); }

CATATAN: Pelanggan Feign dapat digunakan untuk menggunakan API HTTP berasaskan teks sahaja, yang bermaksud bahawa mereka tidak dapat menangani data binari, misalnya muat naik fail atau muat turun.

Itu sahaja! Sekarang kita akan menggunakan Feign.builder () untuk mengkonfigurasi klien berasaskan antara muka kami. Pelaksanaan sebenarnya akan disediakan pada waktu runtime:

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");

Feign menyokong pelbagai plugin seperti JSON / XML encoders dan decoder atau klien HTTP yang mendasari untuk membuat permintaan.

6. Ujian Unit

Mari buat tiga kes ujian untuk menguji pelanggan kami. Perhatikan, kami menggunakan import statik untuk org.hamcrest.CoreMatchers. * Dan org.junit.Assert. * :

@Test public void givenBookClient_shouldRunSuccessfully() throws Exception { List books = bookClient.findAll().stream() .map(BookResource::getBook) .collect(Collectors.toList()); assertTrue(books.size() > 2); } @Test public void givenBookClient_shouldFindOneBook() throws Exception { Book book = bookClient.findByIsbn("0151072558").getBook(); assertThat(book.getAuthor(), containsString("Orwell")); } @Test public void givenBookClient_shouldPostBook() throws Exception { String isbn = UUID.randomUUID().toString(); Book book = new Book(isbn, "Me", "It's me!", null, null); bookClient.create(book); book = bookClient.findByIsbn(isbn).getBook(); assertThat(book.getAuthor(), is("Me")); } 

7. Bacaan Lebih Lanjut

Sekiranya kita memerlukan semacam fallback sekiranya perkhidmatan tidak tersedia, kita boleh menambahkan HystrixFeign ke classpath dan membina klien kita dengan HystrixFeign.builder () .

Lihat siri tutorial khusus ini untuk mengetahui lebih lanjut mengenai Hystrix.

Selain itu, jika kami ingin menggabungkan Spring Cloud Netflix Hystrix dengan Feign, ada artikel khusus di sini.

Selain itu, penambahbaikan beban dan / atau penemuan perkhidmatan juga dapat dilakukan kepada pelanggan kami.

Kami dapat mencapainya dengan menambahkan Ribbon ke jalan kelas kami dan menggunakan pembina seperti itu:

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

Untuk penemuan perkhidmatan, kami harus membina perkhidmatan kami dengan Spring Cloud Netflix Eureka yang diaktifkan. Kemudian gabungkan dengan Spring Cloud Netflix Feign. Hasilnya, kami mendapat pengimbangan beban Riben secara percuma. Lebih banyak mengenai perkara ini boleh didapati di sini.

8. Kesimpulannya

Dalam artikel ini, kami telah menjelaskan cara membina klien HTTP deklaratif menggunakan Feign untuk menggunakan API berasaskan teks.

Seperti biasa, semua sampel kod yang ditunjukkan dalam tutorial ini terdapat di GitHub.