Pengantar Klien Spring Cloud Rest dengan Pita Netflix

1. Perkenalan

Pita Netflix adalah pustaka cloud Inter Process Communication (IPC). Ribbon terutama menyediakan algoritma load balancing sisi klien.

Terlepas dari algoritma load balancing sisi klien, Ribbon juga menyediakan fitur lain:

  • Integrasi Penemuan Layanan - Penyeimbang beban pita menyediakan penemuan layanan dalam lingkungan dinamis seperti awan. Integrasi dengan Eureka dan komponen penemuan layanan Netflix disertakan dalam perpustakaan pita
  • Fault Tolerance - Ribbon API dapat secara dinamis menentukan apakah server aktif dan berjalan di lingkungan hidup dan dapat mendeteksi server yang sedang down
  • Aturan load-balancing yang dapat dikonfigurasi - Ribbon mendukung RoundRobinRule , AvailabilityFilteringRule , WeightedResponseTimeRule di luar kotak dan juga mendukung penentuan aturan kustom

Ribbon API bekerja berdasarkan konsep yang disebut "Klien Bernama". Saat mengonfigurasi Ribbon di file konfigurasi aplikasi kami, kami memberikan nama untuk daftar server yang disertakan untuk load balancing.

Mari kita coba.

2. Manajemen Ketergantungan

Netflix Ribbon API dapat ditambahkan ke proyek kami dengan menambahkan ketergantungan di bawah ini ke pom.xml kami :

 org.springframework.cloud spring-cloud-starter-netflix-ribbon 

Perpustakaan terbaru dapat ditemukan di sini.

3. Contoh Penerapan

Untuk melihat cara kerja Ribbon API, kami membuat contoh aplikasi layanan mikro dengan Spring RestTemplate dan kami menyempurnakannya dengan Netflix Ribbon API bersama dengan Spring Cloud Netflix API.

Kami akan menggunakan salah satu strategi load-balancing Ribbon, WeightedResponseTimeRule , untuk mengaktifkan load balancing sisi klien antara 2 server, yang ditentukan di bawah klien bernama di file konfigurasi, di aplikasi kami.

4. Konfigurasi Pita

Ribbon API memungkinkan kami mengonfigurasi komponen load balancer berikut:

  • Aturan - Komponen logika yang menentukan aturan load balancing yang kita gunakan dalam aplikasi kita
  • Ping - Komponen yang menentukan mekanisme yang kami gunakan untuk menentukan ketersediaan server secara real-time
  • ServerList - bisa dinamis atau statis. Dalam kasus kami, kami menggunakan daftar server statis dan karenanya kami mendefinisikannya dalam file konfigurasi aplikasi secara langsung

Mari menulis konfigurasi sederhana untuk perpustakaan:

public class RibbonConfiguration { @Autowired IClientConfig ribbonClientConfig; @Bean public IPing ribbonPing(IClientConfig config) { return new PingUrl(); } @Bean public IRule ribbonRule(IClientConfig config) { return new WeightedResponseTimeRule(); } }

Perhatikan bagaimana kami menggunakan aturan WeightedResponseTimeRule untuk menentukan server dan mekanisme PingUrl untuk menentukan ketersediaan server secara real-time.

Menurut aturan ini, setiap server diberi bobot sesuai dengan waktu respons rata-rata, lebih sedikit waktu respons memberikan bobot yang lebih rendah. Aturan ini secara acak memilih server yang kemungkinannya ditentukan oleh bobot server.

Dan PingUrl akan melakukan ping ke setiap URL untuk menentukan ketersediaan server.

5. application.yml

Di bawah ini adalah file konfigurasi application.yml yang kami buat untuk aplikasi contoh ini:

spring: application: name: spring-cloud-ribbon server: port: 8888 ping-server: ribbon: eureka: enabled: false listOfServers: localhost:9092,localhost:9999 ServerListRefreshInterval: 15000

Di file di atas, kami menentukan:

  • Nama aplikasi
  • Nomor port aplikasi
  • Klien bernama untuk daftar server: "ping-server"
  • Komponen penemuan layanan Eureka dinonaktifkan, dengan menyetel eureka: diaktifkan ke salah
  • Menentukan daftar server yang tersedia untuk load balancing, dalam hal ini, 2 server
  • Mengkonfigurasi kecepatan penyegaran server dengan ServerListRefreshInterval

6. RibbonClient

Sekarang mari kita siapkan cuplikan komponen aplikasi utama - di mana kita menggunakan RibbonClient untuk mengaktifkan load balancing alih-alih RestTemplate biasa :

@SpringBootApplication @RestController @RibbonClient( name = "ping-a-server", configuration = RibbonConfiguration.class) public class ServerLocationApp { @LoadBalanced @Bean RestTemplate getRestTemplate() { return new RestTemplate(); } @Autowired RestTemplate restTemplate; @RequestMapping("/server-location") public String serverLocation() { return this.restTemplate.getForObject( "//ping-server/locaus", String.class); } public static void main(String[] args) { SpringApplication.run(ServerLocationApp.class, args); } }

Kita mendefinisikan kelas kontroler dengan anotasi @RestController ; kami juga memberi anotasi kelas dengan @RibbonClient dengan nama dan kelas konfigurasi.

Kelas konfigurasi yang kami definisikan di sini adalah kelas yang sama yang kami definisikan sebelumnya di mana kami menyediakan konfigurasi API Pita yang diinginkan untuk aplikasi ini.

Perhatikan kami juga memberi anotasi pada RestTemplate dengan @LoadBalanced yang menunjukkan bahwa kami ingin ini dimuat seimbang dan dalam hal ini dengan Ribbon.

7. Kegagalan Ketahanan di Pita

Seperti yang telah kita bahas sebelumnya di artikel ini, Ribbon API tidak hanya menyediakan algoritme load balancing sisi klien tetapi juga memiliki ketahanan terhadap kegagalan.

Seperti yang dinyatakan sebelumnya, Ribbon API dapat menentukan ketersediaan server melalui ping server yang konstan secara berkala dan memiliki kemampuan untuk melewati server yang tidak aktif.

Selain itu, ini juga menerapkan pola Pemutus Sirkuit untuk menyaring server berdasarkan kriteria yang ditentukan.

Pola Circuit Breaker meminimalkan dampak dari kegagalan server pada kinerja dengan segera menolak permintaan ke server yang gagal tanpa menunggu waktu habis. Kita dapat menonaktifkan fitur Pemutus Sirkuit ini dengan menyetel properti niws.loadbalancer.availabilityFilteringRule.filterCircuitTripped ke false .

Ketika semua server mati, sehingga tidak ada server yang tersedia untuk melayani permintaan, pingUrl () akan gagal dan kami menerima pengecualian java.lang.IllegalStateException dengan pesan "Tidak ada instance yang tersedia untuk melayani permintaan" .

8. Kesimpulan

Pada artikel ini, kami membahas Netflix Ribbon API dan implementasinya dalam aplikasi sampel sederhana.

Kode sumber lengkap untuk contoh yang dijelaskan di atas dapat ditemukan di repositori GitHub.