1: Apa itu Pita?
Ribbon adalah proyek open source yang dirilis oleh Netflix. Fungsi utamanya adalah menyediakan algoritma penyeimbang beban perangkat lunak sisi klien untuk menghubungkan layanan tingkat menengah Netflix bersama-sama. Komponen klien pita menyediakan serangkaian item konfigurasi lengkap seperti batas waktu koneksi, coba lagi, dll. Sederhananya, itu adalah mendaftar semua mesin di belakang load balancer (singkatnya LB) dalam file konfigurasi. Pita akan secara otomatis membantu Anda menghubungkan mesin -mesin ini berdasarkan aturan tertentu (seperti polling sederhana, koneksi instan, dll.). Kami juga memiliki cara yang sangat mudah untuk menerapkan algoritma penyeimbangan beban khusus menggunakan pita.
Dua: Klasifikasi Skema LB
Saat ini, skema LB utama dapat dibagi menjadi dua kategori: satu adalah LB terpusat, yaitu, menggunakan fasilitas LB independen (dapat berupa perangkat keras, seperti F5, atau perangkat lunak, seperti Nginx) antara konsumen layanan dan penyedia, dan fasilitas bertanggung jawab untuk meneruskan permintaan akses ke penyedia layanan melalui kebijakan tertentu; Yang lainnya adalah dalam proses LB, yang mengintegrasikan logika LB ke dalam konsumen, dan konsumen tahu dari pusat pendaftaran layanan yang alamat yang tersedia, dan kemudian memilih server yang sesuai dari alamat ini sendiri. Pita milik yang terakhir. Ini hanya perpustakaan kelas yang terintegrasi ke dalam proses konsumen. Melalui itu, konsumen mendapatkan alamat penyedia layanan.
Tiga: Komponen dan alur kerja utama Pita
Komponen inti pita (yang semuanya adalah tipe antarmuka) memiliki berikut:
Daftar server
Digunakan untuk mendapatkan daftar alamat. Ini dapat berupa statis (memberikan satu set alamat tetap) atau dinamis (kueri berulang untuk daftar alamat dari registri).
ServerListFilter
Hanya digunakan saat menggunakan Dynamic ServerList, digunakan untuk menggunakan kebijakan tertentu dalam daftar layanan asli untuk mempertimbangkan beberapa alamat.
Irule
Pilih alamat layanan akhir sebagai hasil LB. Pilih kebijakan termasuk pemungutan suara, pembobotan berdasarkan waktu respons, pemutus sirkuit (saat hystrix tersedia), dll.
Saat pita berfungsi, lebih disukai menggunakan Daftar Server untuk mendapatkan semua daftar layanan yang tersedia, kemudian menggunakan ServerListFilter untuk mempertimbangkan beberapa alamat, dan akhirnya memilih server di alamat yang tersisa melalui Irule sebagai hasil akhir.
Empat: Pengantar strategi penyeimbangan beban utama yang disediakan oleh Ribbon
1: Balancing beban pemungutan suara sederhana (Roundrobin)
Permintaan dijadwalkan pada gilirannya dengan cara yang disurvei, yaitu, setiap jadwal dieksekusi i = (i + 1) mod n, dan server ke-i dipilih.
2: Balancing beban acak (acak)
Pilih server secara acak dengan status UP
3: WeightedResponsetime Load Balancing (WeightedResponsetime)
Berat dialokasikan sesuai dengan waktu yang sesuai. Semakin lama waktu yang sesuai, semakin kecil bobot, dan semakin rendah kemungkinan dipilih.
4: ZoneAvoidancerule
Secara komprehensif menentukan kinerja area server dan server pemilihan ketersediaan server
Perbandingan strategi penyeimbangan beban Ribbon sendiri
| Nama Strategi | Pernyataan Kebijakan | Deskripsi kebijakan | Instruksi Implementasi |
| BestAvailablerule | Kelas Publik BestAvailablerule memperluas ClientConfigenableDroundrobinrule | Pilih server dengan permintaan bersamaan terkecil | Periksa server satu per satu. Jika server tersandung, abaikan saja. Pilih server dengan ActiveRequestScount terkecil |
| Ketersediaan filteringrule | Ketersediaan kelas publik FilteringRule memperluas predicateBasedRule | Saring server backend yang ditandai sebagai sirkuit yang tersandung karena kegagalan koneksi, dan menyaring server backend dengan konkurensi tinggi (koneksi aktif melebihi ambang batas yang dikonfigurasi) | Menggunakan FREDIBILITYPREDICE untuk memasukkan logika server penyaringan sebenarnya untuk memeriksa status berjalan dari setiap server yang direkam dalam status |
| WeightedResponsetimerule | kelas publik WeightedResetimerule meluas roundrobinrule | Berat dialokasikan sesuai dengan waktu yang sesuai. Semakin lama waktu yang sesuai, semakin kecil bobot, dan semakin rendah kemungkinan dipilih. | Utas latar belakang secara teratur membaca waktu respons evaluasi dari status dan menghitung bobot untuk setiap server. Perhitungan berat juga relatif sederhana. ResponseTime dikurangi waktu respons rata -rata dari setiap server adalah berat server. Ketika status baru saja dimulai dan tidak ada statistik yang dibentuk, gunakan kebijakan Roubine untuk memilih server. |
| Retryrule | Retryrule kelas publik memperluas AbstractLoadBalancerrule | Coba lagi mekanisme mesin untuk kebijakan penyeimbangan beban yang dipilih. | Selama periode konfigurasi, saat pemilihan server tidak berhasil, Anda terus mencoba memilih server yang tersedia menggunakan subrule |
| Roundrobinrule | Roundrobinrule kelas publik memperluas abstrakloadbalancerrule | Polling Metode Roundrobin Untuk Memilih Server | Indeks jajak pendapat dan pilih server yang sesuai dengan indeks |
| RandomRule | Kelas publik RandomRule memperluas AbstractLoadBalaCerrule | Pilih server secara acak | Secara acak pada indeks, pilih server yang sesuai dengan posisi indeks |
| ZoneAvoidancerule | ZoneAvoidancerule kelas publik memperluas predicatedrule | Secara komprehensif menentukan kinerja area server dan server pemilihan ketersediaan server | Gunakan ZoneAvoidancePredicate dan AvailabilityPredicate untuk menentukan apakah server dipilih. Yang sebelumnya menentukan apakah kinerja operasi suatu zona tersedia. Kecualikan zona yang tidak tersedia (semua server). FREDIBILITYPREDICATE digunakan untuk menyaring server dengan terlalu banyak koneksi. |
5: Pita saja
Buat nama proyek Maven Ribbon_Client
konten pom
<Dependencies> <dependency> <GroupId> com.netflix.ribbon </groupid> <ArtiFacTid> Ribbon-core </arttifactid> <version> 2.2.0 </version> </dependency> <ArtiFActD> <RUPRIMID> com.netflix.ribbon </groupid> <ArtiFactid> RIBBON> RIBBON> RIBBON> <TERBBON> </ARTIFID> <ArTtifacTID> RIBBON> RIBBON> RIBBON> <TROPERICED> <TROGERID> <ArTtifacTID> <ArTIFACTP> <ArTICTPACTP.0 </dependency> </dependensi>
File konfigurasi sampel-client.properties
# MAX Jumlah Retries Sampel-client.Ribbon.MaxAutoretries = 1# Max Jumlah server berikutnya untuk coba lagi (tidak termasuk server pertama) sampel-client.ribbon.maxautoretriesNextServer = 1# apakah semua operasi dapat digambar ulang untuk klien ini sampel-client.ribbon.oktoretry-coretretryonalloperations = true interval = interval interval = interval interval = soru-client-client.ribbon.oktoretretryononeSalloperations = true interval = interval interval = interval interval# interval = soru list-client.ribbon. sampel-client.ribbon.serverListrefreshesserval = 2000# Connect Timeout Digunakan oleh Apache HttpClient Sampel-client.ribbon.connectTimeout = 3000# Baca waktu yang digunakan oleh Apache httpclient sampel-client.ribbon.readtimeout = 3000 Daftar Awal Server, dapat diubah melalui archai. sampel client.ribbon.listofserver = www.sohu.com: 80, www.163.com: 80, www.sina.com.cn: 80sample-client.ribbon.enablePrimeConnections = true
Kode Pita
Impor java.net.uri; import com.netflix.client.clientfactory; import com.netflix.client.http.httprquest; com.netflix.loadbalancer.zoneAwareLoadBalancer; impor com.netflix.niws.client.http.restclient; Public Class RibbonMain {public static void main (string [] args) lemparan pengecualian {configurationManager.LoadProPertiesFromRomRomRomResources ("Contoh Contoh (" CAMPLOCE ("CAMPLEK (" COMPLOGOPERMANAGER. System.out.println (ConfigurationManager.getConfigInstance (). GetProperty ("Sampel-client.ribbon.listofserver")); Klien restclient = (restclient) clientFactory.getNamedClient ("sampel-client"); HttpRequest request = httpRequest.newBuilder (). Uri (Uri baru ("/")). Build (); untuk (int i = 0; i <4; i ++) {httpresponse response = client.executeWithLoadBaLancer (request); System.out.println ("Status untuk URI:" + response.getRequesteduri () + "adalah:" + response.getStatus ()); } ZoneAwareLoadBalancer lb = (zoneagareloadbalancer) client.getloadbalancer (); System.out.println (lb.getloadBalanCerstats ()); ConfigurationManager.getConfigInstance (). SetProperty ("Sampel-client.ribbon.listofserver", "ccblog.cn:80,www.linkedin.com:80"); System.out.println ("Mengubah server ..."); Thread.sleep (3000); untuk (int i = 0; i <3; i ++) {httpresponse response = client.executeWithLoadBalancer (request); System.out.println ("Status untuk URI:" + response.getRequesteduri () + "adalah:" + response.getStatus ()); } System.out.println (lb.getLoadBalanCerstats ()); }}Parsing kode
Gunakan Archaius ConfigurationManager untuk memuat properti;
Gunakan ClientFactory untuk membuat klien dan memuat penyeimbang;
Gunakan pembangun untuk membangun permintaan HTTP. Perhatikan bahwa kami hanya mendukung jalur "/" bagian dari URI. Setelah server dipilih oleh penyeimbang beban, klien akan menghitung URI lengkap;
Calling API Client.ExuteWithLoadBalancer () bukan exeucte () API;
Secara dinamis memperbaiki kumpulan server dalam konfigurasi;
Tunggu daftar server untuk menyegarkan (interval refresh yang ditentukan dalam file konfigurasi adalah 3 detik);
Cetak statistik server yang direkam oleh penyeimbang beban.
Enam: Pita dikombinasikan dengan Eureka
Pertama, mulailah proyek eureka_register_service (pusat pendaftaran) dan proyek Biz-Service-0 (produsen layanan)
Buat proyek Maven eureka_ribbon_client proyek ini dimulai dan konfigurasi terkait tergantung pada eureka_register_service dan biz-service-0
POM Bergabung
<partent> <groupid> org.springframework.boot </groupid> <ArTifactId> Spring-boot-starter-parent </arttifactid> <version> 1.4.3.release </version> <relativePath/> <!-Pencarian Parent dari Repositori-> </Parents> <dependency> <dependency> <grouper> <grouppid. <ArtifactId> Spring-cloud-starter-ribbon </stifactid> </dependency> <dependency> <groupid> org.springframework.cloud </proupid> <RaintifactId> <cloud-cloud-starter-eureka </artifactid> </dependency> <dependency> <groupid> org.springfr. <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency></dependencies><dependencyManagement> <dependencies> <dependency> <groupid> org.springframework.cloud </groupid> <ArtiFacTid> Spring-cloud-Dependencies </artifactid> <version> brixton.release </version> <yype> pom </type> <scope> impor </scope> </dependency> </dependency> </dependencyman manajemen>
Di kelas utama aplikasi, tambahkan kemampuan layanan Discovery melalui anotasi @EnableDiscoveryclient. Buat instance RestTemplate dan aktifkan kapasitas beban penyeimbangan melalui anotasi @Load -seimbang.
@SpringbootApplication @enableDiscoVeryClientPublic RibbonApplication kelas {@bean @LoadBalAding restTemplate restTemplate () {return new restTemplate (); } public static void main (string [] args) {springApplication.run (ribbonApplication.class, args); }}Buat ConsumController untuk mengkonsumsi layanan GetUser dari Biz-Service-0. Menelepon layanan dengan langsung restTemplate
@RestControllerPublic ClassController {@Autowired restTemplate restTemplate; @RequestMapping (value = "/getUserInfo", method = requestMethod.get) public string add () {return resttemplate.getForEntity ("http: // biz-service-0/getUser", string.class) .getbody (); }} Konfigurasikan Pusat Pendaftaran Layanan Eureka di Application.Properties
Spring.Application.Name = Ribbon-Consumerserver.port = 8003eureka.client.ServiceUrl.DefaultZone = http: // localhost: 8000/eureka/
Setelah selesai, Anda dapat membuka http: // localhost: 8003/getUserInfo untuk melihat hasilnya
Ringkasan: Pita sebenarnya adalah komponen klien penyeimbangan beban lunak. Ini dapat digunakan dalam kombinasi dengan permintaan lain yang diperlukan. Menggabungkannya dengan Eureka hanyalah contohnya.
Alamat kode: https://github.com/zhp8341/springclouddemo
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.