Pendahuluan tentang Feign

1. Ikhtisar

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

Tipuan bertujuan untuk menyederhanakan klien HTTP API. Sederhananya, pengembang hanya perlu mendeklarasikan dan membuat anotasi antarmuka sementara implementasi sebenarnya disediakan pada waktu proses.

2. Contoh

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

Kami dapat dengan mudah mengkloning proyek dan menjalankannya secara lokal:

mvn install spring-boot:run

3. Penyiapan

Pertama, mari tambahkan dependensi yang dibutuhkan:

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

Selain ketergantungan feign-core (yang juga ditarik), kami akan menggunakan beberapa plugin, terutama: feign-okhttp untuk secara internal menggunakan klien OkHttp Square untuk membuat permintaan, feign-gson untuk menggunakan Google GSON sebagai prosesor JSON dan pura-pura- slf4j untuk menggunakan Simple Logging Facade untuk mencatat permintaan.

Untuk benar-benar mendapatkan beberapa output log, kita memerlukan implementasi logger favorit yang didukung SLF4J di classpath.

Sebelum kami melanjutkan untuk membuat antarmuka klien kami, pertama-tama kami akan menyiapkan 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: Setidaknya "konstruktor tanpa argumen" diperlukan oleh prosesor JSON.

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

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

Catatan: Kami ' akan menjaga BookResource sederhana karena sampel Feign klien kami tidak mendapatkan keuntungan dari fitur hypermedia!

4. Sisi Server

Untuk memahami cara mendefinisikan klien Feign, pertama-tama kita akan melihat beberapa metode dan respons yang didukung oleh penyedia REST kami.

Mari kita coba dengan perintah curl shell sederhana untuk mendaftar semua buku. Kita perlu ingat untuk mengawali semua panggilan dengan / api , yang merupakan konteks servlet aplikasi:

curl //localhost:8081/api/books

Hasilnya, kita akan mendapatkan repositori buku lengkap yang direpresentasikan 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" } ] } ]

Kita juga dapat menanyakan sumber Buku individu , dengan menambahkan ISBN ke permintaan get:

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

5. Berpura-pura Klien

Terakhir, mari kita definisikan klien Feign kita.

Kami akan menggunakan anotasi @RequestLine untuk menentukan kata kerja HTTP dan bagian jalur 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: Klien pura-pura dapat digunakan untuk menggunakan API HTTP berbasis teks saja, yang berarti bahwa mereka tidak dapat menangani data biner, misalnya unggahan atau unduhan file.

Itu saja! Sekarang kita akan menggunakan Feign.builder () untuk mengkonfigurasi klien berbasis antarmuka kita. Implementasi sebenarnya akan disediakan pada waktu proses:

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 mendukung berbagai plugin seperti encoder dan decoder JSON / XML atau klien HTTP yang mendasari untuk membuat permintaan.

6. Uji Unit

Mari buat tiga kasus uji untuk menguji klien kita. Catatan, kami menggunakan impor statis 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

Jika kami membutuhkan semacam penggantian jika layanan tidak tersedia, kami dapat menambahkan HystrixFeign ke jalur kelas dan membangun klien kami dengan HystrixFeign.builder () .

Lihat seri tutorial khusus ini untuk mempelajari lebih lanjut tentang Hystrix.

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

Selain itu, dimungkinkan juga untuk menambahkan load-balancing sisi klien dan / atau penemuan layanan ke klien kami.

Kita bisa mencapai ini dengan menambahkan Ribbon ke classpath kita dan menggunakan builder seperti ini:

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

Untuk penemuan layanan, kami harus meningkatkan layanan kami dengan mengaktifkan Spring Cloud Netflix Eureka. Kemudian cukup integrasikan dengan Spring Cloud Netflix Feign. Hasilnya, kami mendapatkan load-balancing Ribbon secara gratis. Lebih lanjut tentang ini dapat ditemukan di sini.

8. Kesimpulan

Di artikel ini, kami telah menjelaskan cara membuat klien HTTP deklaratif menggunakan Feign untuk menggunakan API berbasis teks.

Seperti biasa, semua contoh kode yang ditampilkan dalam tutorial ini tersedia di GitHub.