Di tumpukan Spring Cloud Netflix, setiap Microservice memperlihatkan layanannya sendiri dalam bentuk antarmuka HTTP, sehingga klien HTTP harus digunakan saat memanggil layanan jarak jauh. Kita dapat menggunakan JDK Native UrlConnection, klien HTTP Apache, klien HTTP asinkron Netty, dan Resttemplate Spring. Namun, hal yang paling nyaman dan elegan untuk digunakan adalah berpura -pura.
Pengantar untuk berpura -pura
Petana adalah klien HTTP yang deklaratif dan templated. Menggunakan Petana di Spring Cloud, kami dapat mencapai pengalaman pengkodean yang sama seperti memanggil metode lokal saat meminta layanan jarak jauh menggunakan HTTP. Pengembang tidak dapat sepenuhnya menyadari bahwa ini adalah metode jarak jauh, juga tidak dapat dilihat bahwa ini adalah permintaan HTTP. Misalnya:
@AutowiredPrivate AdvertGropRemoteService Service; // Layanan Remote Public AdvertGroupvo foo (Integer GroupID) {return service.findbyGroupId (groupID); // hubungi layanan jarak jauh melalui http} Pengembang dapat menyelesaikan proses pengiriman permintaan HTTP, mendekodekan pengembalian HTTP dan merangkumnya ke dalam objek melalui service.findByGroupId() .
Definisi berpura -pura
Agar Petchign untuk mengetahui alamat mana yang akan mengirim permintaan saat memanggil metode dan parameter mana yang harus diambil untuk permintaan tersebut, kita perlu menentukan antarmuka:
@FeignClient (name = "ea") // [a] Antarmuka Publik AdvertgroUpremoteService {@RequestMapping (value = "/group/{groupId}", Method = requestMethod.get) // [b] advertGroupvo findBroupId (@pathvariable ("groupid") ("groupid") ("groupid") ("groupid") ("groupid") ("groupid") integer @pathvariable ("groupid") @pathvariable ("groupid") ("groupid") @pathvariable ("groupid") @pathvariable ("groupid") integer @pathvariable ("groupid") integer ("groupid")) "/grup/{groupId}", Method = requestMethod.put) void update (@pathvariable ("groupId") integer groupId, @RequestParam ("groupName") groupName)A: @FeignClient digunakan untuk memberi tahu komponen Petchign untuk proksi antarmuka (tidak perlu menulis implementasi antarmuka), dan pengguna dapat secara langsung menyuntikkannya melalui @Autowired.
B: @RequestMapping berarti bahwa ketika memanggil metode ini, Anda perlu mengirim permintaan GET ke /group/{groupId} .
C: @PathVariable memiliki arti yang sama dengan anotasi yang sesuai di SpringMVC.
Ketika aplikasi Spring Cloud dimulai, Petana akan memindai antarmuka yang ditandai dengan anotasi @FeignClient, menghasilkan proxy, dan mendaftarkannya ke dalam wadah pegas. Saat menghasilkan proxy, Petchign akan membuat objek Requettemplate untuk setiap metode antarmuka. Objek ini merangkum semua informasi yang diperlukan untuk permintaan HTTP. Nama parameter permintaan, metode permintaan dan informasi lainnya ditentukan dalam proses ini. Templateisasi peti mati tercermin di sini.
Dalam contoh ini, kami menggunakan Petchign dalam kombinasi dengan Eureka dan Ribbon ,@FeignClient(name = "ea") berarti memberi tahu Petera untuk meminta Eureka untuk layanan bernama EA saat memanggil metode antarmuka ini, untuk mendapatkan URL layanan.
Encoder, decoder, dan errordecoder Petana
Proses Pisau membuat serial objek parameter metode dalam tanda tangan metode ke parameter permintaan dan memasukkannya ke dalam permintaan HTTP diselesaikan oleh encoder (encoder). Demikian pula, deserializing data respons HTTP ke objek Java dilakukan oleh dekoder (decoder).
Secara default, Petugas akan mengonversi parameter yang ditandai dengan anotasi @RequestParam menjadi string dan menambahkannya ke URL, dan mengonversi parameter tanpa anotasi menjadi JSON melalui Jackson untuk memasukkannya ke dalam badan permintaan. Perhatikan bahwa jika metode di @RequetMapping menentukan metode permintaan sebagai posting, maka semua parameter yang tidak diabaikan akan diabaikan, misalnya:
@RequestMapping (value = "/group/{groupId}", Method = requestMethod.get) void update (@PathVariable ("groupId") integer groupId, @RequestParam ("groupName") groupName, DataObject OBJ);Pada saat ini, karena permintaan GET tidak memiliki badan permintaan, parameter OBJ akan diabaikan.
Di lingkungan Cloud Musim Semi, Encoder Peteran* hanya akan digunakan untuk menyandikan parameter yang belum ditambahkan ke anotasi. Jika Anda menyesuaikan encoder, encoder Anda hanya akan dipanggil saat menyandikan parameter OBJ. Untuk Decoder, delegasi default ke kelas MappingJackson2httpMessageConverter di SpringMVC untuk decoding. Errordecoder hanya akan dipanggil ketika kode status tidak antara 200 dan 300. Fungsi Errordecoder adalah untuk mengembalikan pengecualian berdasarkan informasi respons HTTP, yang dapat ditangkap di mana antarmuka peti mati dipanggil. Kami saat ini menggunakan ERRORDECODER untuk menyebabkan antarmuka Petana melemparkan pengecualian bisnis untuk ditangani penelepon.
Klien HTTP Petana
Secara default, Petchign menggunakan JDK Native UrlConnection untuk mengirim permintaan HTTP. Tidak ada kumpulan koneksi, tetapi koneksi panjang akan dipertahankan untuk setiap alamat, yaitu, koneksi kegigihan HTTP digunakan. Kami dapat mengganti klien HTTP asli Pisita dengan klien HTTP Apache, sehingga mendapatkan kemampuan kontrol yang terkait erat dengan kinerja seperti kumpulan koneksi, batas waktu, dll. Cloud Spring mendukung penggantian ini karena versi brixtion.sr5, pertama-tama mendeklarasikan klien HTTP Apache dan ketergantungan feign-httpclient dalam proyek:: Proyek:: Proyek: Project: dalam proyek: dalam proyek:: Project: dalam proyek:: Project:: Project: dalam proyek:: dalam proyek:: Project: dalam proyek: dalam proyek:: dalam proyek:: Proyek:
<!-Ganti Riah HttpClient asli dengan Apache httpClient-> <dependency> <GroupId> org.apache.httpComponents </groupid> <ArtifactId> httpclient </arttifactid> </dependency> <groupid> <groupid> com.netflix.feign </groupid> <grouping> <groupid> <groupid> <ArTifactId> fegn-httpclient </stifactid> <version> $ {fegn-httpclient} </version> </gandendency>Kemudian tambahkan application.properties:
FEIGN.httpClient.enabled = true
Meringkaskan
Melalui kepura -pura, kami dapat melakukan panggilan jarak jauh HTTP sepenuhnya transparan untuk pengembang dan mendapatkan pengalaman pengkodean yang konsisten dengan memanggil metode lokal. Ini mirip dengan cara layanan jarak jauh diekspos di Alibaba Dubbo. Perbedaannya adalah bahwa Dubbo didasarkan pada protokol biner pribadi, sedangkan petugas pada dasarnya adalah klien HTTP. Jika Anda menggunakan Spring Cloud Netflix untuk membangun layanan microser, maka peti tidak diragukan lagi merupakan pilihan terbaik.
Di atas adalah metode (disarankan) untuk menggunakan Spring Cloud Ries sebagai klien HTTP untuk memanggil layanan HTTP jarak jauh (disarankan). Saya harap ini akan membantu semua orang. Jika Anda memiliki pertanyaan, silakan tinggalkan saya pesan dan editor akan membalas semua orang tepat waktu. Terima kasih banyak atas dukungan Anda ke situs web Wulin.com!