Perkenalan
Kami terus membangun kode dari blog sebelumnya dan menambahkan komponen pita untuk memberikan penyeimbangan beban klien. Load Balancing adalah bagian penting dari mencapai konkurensi tinggi, kinerja tinggi, layanan yang dapat diskalakan. Ini dapat mendistribusikan permintaan ke server yang berbeda dalam sebuah cluster untuk meringankan beban pada setiap server. Balancing beban klien dijalankan dalam program klien, seperti proyek web kami, dan kemudian secara acak memilih server untuk mengirim permintaan dengan mendapatkan daftar alamat IP cluster. Dibandingkan dengan penyeimbangan beban server, itu tidak memerlukan sumber daya server yang mengkonsumsi.
Lingkungan dasar
Git: Kode Sumber Proyek
Perbarui konfigurasi
Kali ini kita perlu memulai dua program layanan produk secara lokal untuk memverifikasi keseimbangan beban, jadi kita perlu menyediakan port yang berbeda untuk program kedua. Konfigurasi Pusat Layanan Konfigurasi Cloud Spring akan mengganti variabel lingkungan sistem lokal secara default. Kita perlu mengatur port layanan produk melalui variabel lingkungan sistem, jadi kita perlu memodifikasi file konfigurasi layanan produk di repositori GIT pusat konfigurasi.
Server: Port: 8081spring: cloud: config: allow-override: true override-system-properties: false
Nilai default dari override adalah benar. Saya menuliskannya untuk menjelaskannya. Ini berarti bahwa item konfigurasi dari pusat konfigurasi jarak jauh diizinkan untuk menimpa konfigurasi lokal, bukan karena konfigurasi lokal diizinkan untuk menimpa konfigurasi jarak jauh. Tentu saja kita dapat mengaturnya menjadi salah, tetapi untuk memberikan aturan cakupan yang lebih tepat, nilai default dipertahankan di sini.
Kami telah menambahkan override-system-properties = false, yaitu, meskipun file konfigurasi dari pusat konfigurasi jarak jauh dapat menimpa konfigurasi lokal, tidak menimpa variabel sistem lokal. Setelah modifikasi selesai, kirimkan ke repositori Git.
Selain itu, tambahkan beberapa log ke ProductController dari ProductService Project untuk memverifikasi apakah penyeimbangan beban efektif:
Paket cn.zxuqian.controllers; impor org.slf4j.logger; impor org.slf4j.loggerFactory; impor org.springframework.web.bind.annotation.RequestMapping; Impor org.spramework.web.bind.annotation.notation {private static logger log = loggerFactory.getLogger (productController.class); @RequestMapping (" /Products") Public String ProductList () {log.info ("Access to /Product Endpoint"); kembali "mantel, jaket, sweter, t-shirt"; }}Konfigurasikan Pita untuk Web
Pertama tambahkan dependensi pita di pom.xml:
<dependency> <GroupId> org.springframework.cloud </groupid> <ArTifactId> Spring-cloud-starter-netflix-ribbon </t Artifactid> </dependency>
Kemudian ubah kelas aplikasi dan tambahkan kode berikut:
@EnableCircuTbreaker@enableDiscoveryclient@ribbonClient (name = "produk-layanan")@springbootApplicationPublic Class Application {public static void main (string [] args) {springApplication.run (application.class, args); } @Bean @LoadBalanced Public RestTemplate REST (restTemplateBuilder builder) {return builder.build (); }} Di sini kami menggunakan anotasi @RibbonClient (name = "Product-Service") untuk menandai proyek ini sebagai klien penyeimbang beban pita. Perlu memilih salah satu kelompok layanan produk untuk mengakses layanan yang diperlukan. Atribut nama di sini sesuai dengan atribut spring.application.name yang dikonfigurasi dalam ProductService Project.
Anotasi @LoadBalanced menunjukkan bahwa RestTemplate akan dikonfigurasi untuk secara otomatis menggunakan LoadBalancerClient Ribbon untuk memilih URI layanan dan mengirim permintaan.
Kami menambahkan kode berikut ke kelas ProductService:
@ServicePublic Class ProductService {Private Final RestTemplate RestTemplate; @Autowired Private Discoveryclient Discoveryclient; Public ProductService (restTemplate restTemplate) {this.resttemplate = restTemplate; } @HyStrixCommand (fallbackMethod = "backupproductList") public string ProductList () {list <serviceInstance> instances = this.discoveryclient.getInstances ("layanan produk"); if (instances! = null && instances.size ()> 0) {return this.resttemplate.getForObject (instances.get (0) .geturi () + "/produk", string.class); } kembali ""; } public string backupproductList () {return "jack, sweater"; } public String ProductListLoadAnd () {return this.resttemplate.getForObject ("http: // produk-layanan/produk", string.class); }}Metode ProductListLoloadBalanced baru telah ditambahkan di sini, yang diakses layanan yang sama dengan metode daftar produk sebelumnya, tetapi merupakan penyeimbangan beban dengan klien pita. Di sini, host URI telah menjadi nama layanan yang akan diakses, yang konsisten dengan atribut nama yang dikonfigurasi dalam @RibbonClient. Akhirnya, tambahkan kode berikut di ProductController kami:
@RestControllerPublic Class ProductController {@Autowired private ProductService ProductService; @RequestMapping ("/Products") Public String ProductList () {return ProductService.productList (); } @RequestMapping ("/ProductLB") Public String ProductListLoquLAnding () {return ProductService.ProductListLoadBalAding (); }}Untuk membuat metode yang secara khusus menangani permintaan /produk, dan memanggil ProductServie untuk memberikan penyeimbangan beban.
Pada titik ini kode kami selesai. Kode tampaknya sederhana, tetapi pada kenyataannya semua konfigurasi menggunakan nilai default. Pita menyediakan metode pemrograman dan konfigurasi untuk mengonfigurasi klien pita. Izinkan saya memberi Anda pengantar singkat. Saat Anda masuk lebih dalam ke pita, mari kita lihat cara memodifikasi konfigurasinya. Pita menyediakan konfigurasi berikut (antarmuka ada di sebelah kiri dan implementasi default ada di sebelah kanan):
Karena proyek kami menggunakan Eureka, beberapa item konfigurasi berbeda dari implementasi default. Misalnya, Eureka menggunakan DiscoveryEnabledNiWsServerList alih -alih RibbonserverList untuk mendapatkan daftar layanan yang terdaftar di Eureka. Ada kelas konfigurasi sederhana di bawah ini, dari situs web resmi Spring:
kelas publik sayhelloconfiguration {@autowired iclientConfig RibbonClientConfig; @Bean public iPing Ribbonping (iclientConfig config) {return new PingUrl (); } @Bean public irule ribbonrule (config iclientConfig) {return new FirtaTersFilteringRule (); }}Pita tidak akan mengirim ping untuk memeriksa status kesehatan server secara default, dan standarnya normal. Kemudian Irune diimplementasikan sebagai ZoneVoidancerule secara default untuk menghindari zona dengan banyak masalah dengan AWS EC2. Ini tidak tersedia di lingkungan pengujian lokal. Itu kemudian diganti dengan ketersediaan filteringrule. Ini dapat memungkinkan fungsi pemutus sirkuit yang dilengkapi dengan pita untuk memfilter server yang tidak berfungsi dengan baik.
tes
Pertama, mulailah Layanan Pusat Konfigurasi Konfigurasi Konfigurasi kami, lalu mulai pendaftaran Registrasi Eureka dan Layanan Penemuan, dan kemudian mulai dua ProductServices. Yang pertama adalah menggunakan spring-boot: run plug-in untuk memulai, dan yang kedua adalah menyediakannya dengan port baru, yang dapat dimulai dengan perintah berikut:
$ Server_port = 8082 MVN Spring-Boot: Jalankan
Akhirnya, mulailah proyek klien web kami, kunjungi http: // localhost: 8080/productlb, dan kemudian menyegarkan beberapa kali. Anda akan melihat bahwa dua baris perintah Windows Running ProductService akan muncul secara acak:
Akses ke /Produk Titik Akhir
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.