Contoh Load Balancing dengan Zuul dan Eureka

1. Ikhtisar

Dalam artikel ini, kita akan melihat cara kerja load balancing dengan Zuul dan Eureka.

Kami akan mengarahkan permintaan ke Layanan REST yang ditemukan oleh Spring Cloud Eureka melalui Zuul Proxy .

2. Pengaturan Awal

Kami perlu menyiapkan server / klien Eureka seperti yang ditunjukkan di artikel Spring Cloud Netflix-Eureka.

3. Konfigurasi Zuul

Zuul, di antara banyak hal lainnya, mengambil dari lokasi layanan Eureka dan melakukan load balancing sisi server.

3.1. Konfigurasi Maven

Pertama, kami akan menambahkan Zuul Server dan dependensi Eureka ke pom.xml kami :

 org.springframework.cloud spring-cloud-starter-netflix-zuul   org.springframework.cloud spring-cloud-starter-netflix-eureka-client 

3.2. Komunikasi Dengan Eureka

Kedua, kami akan menambahkan properti yang diperlukan di file application.properties Zuul :

server.port=8762 spring.application.name=zuul-server eureka.instance.preferIpAddress=true eureka.client.registerWithEureka=true eureka.client.fetchRegistry=true eureka.client.serviceUrl.defaultZone=${EUREKA_URI://localhost:8761/eureka} 

Di sini kami memberi tahu Zuul untuk mendaftarkan dirinya sebagai layanan di Eureka dan berjalan di port 8762.

Selanjutnya, kami akan mengimplementasikan kelas utama dengan @EnableZuulProxy dan @EnableDiscoveryClient. @EnableZuulProxy menunjukkan ini sebagai Zuul Server dan @EnableDiscoveryClient menunjukkan ini sebagai Klien Eureka:

@SpringBootApplication @EnableZuulProxy @EnableDiscoveryClient public class ZuulConfig { public static void main(String[] args) { SpringApplication.run(ZuulConfig.class, args); } }

Kami akan mengarahkan browser kami ke // localhost: 8762 / routes . Ini harus menunjukkan semua rute yang tersedia untuk Zuul yang ditemukan oleh Eureka:

{"/spring-cloud-eureka-client/**":"spring-cloud-eureka-client"}

Sekarang, kami akan berkomunikasi dengan klien Eureka menggunakan rute Proxy Zuul yang diperoleh. Mengarahkan browser kita ke // localhost: 8762 / spring-cloud-eureka-client / salam akan menghasilkan respons seperti:

Hello from 'SPRING-CLOUD-EUREKA-CLIENT with Port Number 8081'!

4. Load Balancing dengan Zuul

Ketika Zuul menerima permintaan, Zuul mengambil salah satu lokasi fisik yang tersedia dan meneruskan permintaan ke contoh layanan yang sebenarnya. Seluruh proses caching lokasi contoh layanan dan meneruskan permintaan ke lokasi sebenarnya disediakan di luar kotak tanpa konfigurasi tambahan yang diperlukan.

Di sini, kita dapat melihat bagaimana Zuul merangkum tiga contoh berbeda dari layanan yang sama:

Secara internal, Zuul menggunakan Pita Netflix untuk mencari semua contoh layanan dari penemuan layanan (Server Eureka).

Mari kita amati perilaku ini ketika beberapa contoh diajukan.

4.1. Mendaftarkan Banyak Contoh

Kami akan mulai dengan menjalankan dua contoh (port 8081 dan 8082).

Setelah semua instance aktif, kita dapat mengamati di log bahwa lokasi fisik dari instance terdaftar di DynamicServerListLoadBalancer dan rute dipetakan ke Zuul Controller yang menangani permintaan penerusan ke instance sebenarnya:

Mapped URL path [/spring-cloud-eureka-client/**] onto handler of type [class org.springframework.cloud.netflix.zuul.web.ZuulController] Client:spring-cloud-eureka-client instantiated a LoadBalancer: DynamicServerListLoadBalancer:{NFLoadBalancer:name=spring-cloud-eureka-client, current list of Servers=[],Load balancer stats=Zone stats: {},Server stats: []}ServerList:null Using serverListUpdater PollingServerListUpdater DynamicServerListLoadBalancer for client spring-cloud-eureka-client initialized: DynamicServerListLoadBalancer:{NFLoadBalancer:name=spring-cloud-eureka-client, current list of Servers=[0.0.0.0:8081, 0.0.0.0:8082], Load balancer stats=Zone stats: {defaultzone=[Zone:defaultzone; Instance count:2; Active connections count: 0; Circuit breaker tripped count: 0; Active connections per server: 0.0;]}, Server stats: [[Server:0.0.0.0:8080; Zone:defaultZone;......], [Server:0.0.0.0:8081; Zone:defaultZone; ......],

Catatan: log diformat agar lebih mudah dibaca.

4.2. Contoh Load-Balancing

Mari arahkan browser kita ke // localhost: 8762 / spring-cloud-eureka-client / salam beberapa kali.

Setiap kali, kita akan melihat hasil yang sedikit berbeda:

Hello from 'SPRING-CLOUD-EUREKA-CLIENT with Port Number 8081'!
Hello from 'SPRING-CLOUD-EUREKA-CLIENT with Port Number 8082'!
Hello from 'SPRING-CLOUD-EUREKA-CLIENT with Port Number 8081'!

Setiap permintaan yang diterima oleh Zuul diteruskan ke instance yang berbeda dengan cara round robin.

Jika kami memulai instance lain dan mendaftarkannya di Eureka, Zuul akan mendaftarkannya secara otomatis dan mulai meneruskan permintaan ke sana:

Hello from 'SPRING-CLOUD-EUREKA-CLIENT with Port Number 8083'!

Kami juga dapat mengubah strategi penyeimbangan muatan Zuul menjadi strategi Pita Netflix lainnya - selengkapnya tentang ini dapat ditemukan di artikel Pita kami.

5. Kesimpulan

Seperti yang telah kita lihat, Zuul menyediakan satu URL untuk semua instance dari Rest Service dan melakukan load balancing untuk meneruskan permintaan ke salah satu instance dengan cara round robin.

Seperti biasa, kode lengkap untuk artikel ini dapat ditemukan di GitHub.