Pengenalan kepada Spring Cloud Rest Client dengan Netflix Ribbon

1. Pengenalan

Ribbon Netflix adalah pustaka awan Inter Process Communication (IPC). Ribbon terutamanya menyediakan algoritma pengimbangan beban pelanggan.

Selain daripada algoritma load balancing sisi pelanggan, Ribbon juga menyediakan ciri-ciri lain:

  • Service Discovery Integration - Penyeimbang beban pita memberikan penemuan perkhidmatan dalam persekitaran dinamik seperti awan. Integrasi dengan komponen penemuan perkhidmatan Eureka dan Netflix termasuk dalam pita pita
  • Toleransi Kesalahan - Ribbon API dapat menentukan secara dinamik sama ada pelayan aktif dan berjalan dalam persekitaran langsung dan dapat mengesan pelayan yang tidak berfungsi
  • Peraturan pengimbangan beban yang boleh dikonfigurasi - Ribbon menyokong RoundRobinRule , AvailabilityFilteringRule , WeightedResponseTimeRule di luar kotak dan juga menyokong menentukan peraturan tersuai

Ribbon API berfungsi berdasarkan konsep yang disebut "Named Client". Semasa mengkonfigurasi Ribbon dalam fail konfigurasi aplikasi kami, kami memberikan nama untuk senarai pelayan yang disertakan untuk pengimbangan beban.

Mari ambil untuk berputar.

2. Pengurusan Ketergantungan

API Ribbon Netflix dapat ditambahkan ke projek kami dengan menambahkan kebergantungan di bawah ke pom.xml kami :

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

Perpustakaan terkini boleh didapati di sini.

3. Contoh Permohonan

Untuk melihat cara kerja Ribbon API, kami membuat aplikasi aplikasi microservice dengan Spring RestTemplate dan kami memperbaikinya dengan Netflix Ribbon API bersama dengan Spring Cloud Netflix API.

Kami akan menggunakan salah satu strategi pengimbangan beban Ribbon, WeightedResponseTimeRule , untuk membolehkan pengimbangan beban sisi klien antara 2 pelayan, yang ditentukan di bawah klien bernama dalam fail konfigurasi, dalam aplikasi kami.

4. Konfigurasi Pita

Ribbon API membolehkan kami mengkonfigurasi komponen pengimbang beban berikut:

  • Peraturan - Komponen logik yang menentukan peraturan pengimbangan beban yang kita gunakan dalam aplikasi kita
  • Ping - Komponen yang menentukan mekanisme yang kita gunakan untuk menentukan ketersediaan pelayan dalam masa nyata
  • ServerList - boleh dinamik atau statik. Dalam kes kami, kami menggunakan senarai pelayan statik dan oleh itu kami menentukannya secara langsung dalam fail konfigurasi aplikasi

Mari tulis konfigurasi ringkas 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 kita menggunakan peraturan WeightedResponseTimeRule untuk menentukan pelayan dan mekanisme PingUrl untuk menentukan ketersediaan pelayan dalam masa nyata.

Mengikut peraturan ini, setiap pelayan diberi bobot sesuai dengan masa tindak balas rata-rata, semakin sedikit masa respons memberikan bobot yang lebih sedikit. Peraturan ini memilih pelayan secara rawak di mana kemungkinan ditentukan oleh berat pelayan.

Dan PingUrl akan melakukan ping setiap URL untuk menentukan ketersediaan pelayan.

5. aplikasi.yml

Berikut adalah fail konfigurasi application.yml yang kami buat untuk contoh aplikasi ini:

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

Dalam fail di atas, kami menyatakan:

  • Nama aplikasi
  • Nombor port aplikasi
  • Pelanggan yang dinamakan untuk senarai pelayan: "ping-server"
  • Komponen penemuan perkhidmatan Eureka yang dilumpuhkan, dengan menetapkan eureka: diaktifkan ke false
  • Mendefinisikan senarai pelayan yang tersedia untuk pengimbangan beban, dalam kes ini, 2 pelayan
  • Mengkonfigurasi kadar penyegaran pelayan dengan ServerListRefreshInterval

6. Pelanggan Ribbon

Mari kita sediakan coretan komponen aplikasi utama - di mana kita menggunakan RibbonClient untuk mengaktifkan load balancing dan bukannya 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); } }

Kami menentukan kelas pengawal dengan penjelasan @RestController ; kami juga memberi penjelasan pada kelas dengan @RibbonClient dengan nama dan kelas konfigurasi.

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

Perhatikan bahawa kami juga memberi penjelasan pada RestTemplate dengan @LoadBalanced yang menunjukkan bahawa kami mahu ini seimbang dengan beban dan dalam hal ini dengan Ribbon.

7. Ketahanan Kegagalan dalam Pita

Seperti yang telah kita bahas sebelumnya dalam artikel ini, Ribbon API tidak hanya menyediakan algoritma pengimbangan beban sisi pelanggan tetapi juga memiliki ketahanan kegagalan.

Seperti yang dinyatakan sebelumnya, Ribbon API dapat menentukan ketersediaan pelayan melalui ping pelayan tetap secara berkala dan mempunyai kemampuan untuk melangkau pelayan yang tidak disiarkan secara langsung.

Selain itu, ia juga menerapkan corak Circuit Breaker untuk menyaring pelayan berdasarkan kriteria yang ditentukan.

Corak Pemutus Litar meminimumkan kesan kegagalan pelayan terhadap prestasi dengan cepat menolak permintaan ke pelayan yang gagal tanpa menunggu waktu habis. Kita boleh mematikan fitur Circuit Breaker ini dengan menetapkan properti niws.loadbalancer.availabilityFilteringRule.filterCircuitTripped to false .

Apabila semua pelayan mati, maka tidak ada pelayan yang tersedia untuk melayani permintaan, pingUrl () akan gagal dan kami menerima pengecualian java.lang.IllegalStateException dengan pesan "Tidak ada contoh yang tersedia untuk melayani permintaan" .

8. Kesimpulannya

Dalam artikel ini, kami membincangkan Netflix Ribbon API dan pelaksanaannya dalam contoh aplikasi sederhana.

Kod sumber lengkap untuk contoh yang dijelaskan di atas boleh didapati di repositori GitHub.