Zuul ve Eureka ile Load Balancing
Bu yazıda, yük dengelemenin yani Load Balancing’in Zuul ve Eureka ile nasıl çalıştığını inceleyeceğiz.
Spring Cloud Eureka tarafından yayınlanan bir REST servisine Zuul Proxy aracılığıyla yönlendirme yapacağız.
Kurulum
Spring Cloud Netflix-Eureka yazısında anlatıldığı gibi Eureka Server ve Client’ı kurmamız gerekiyor.
Zuul Yapılandırması
Zuul, server tarafında yük dengelemesi yapar ve Eureka servisleri üzerinden isteği işler.
Maven Yapılandırması
Öncelikle, pom.xml dosyamıza Zuul Server ve Eureka bağımlılığını ekleyeceğiz:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
Eureka ile Haberleşme
Bağımlılıkları ekledikten sonra Zuul’un application.properties dosyasına gerekli yapılandırmaları ekleyeceğiz:
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:http://localhost:8761/eureka}
Burada Zuul’un Eureka’da bir servis olmasını ve 8762 portundan ayağa kalkmasını belirtiyoruz.
Daha sonra, main sınıfında @EnableZuulProxy ve @EnableDiscoveryClient anotasyonlarını kullanacağız. @EnableZuulProxy, Zuul Server olarak gösterir. @EnableDiscoveryClient ise Eureka Client olarak belirtmemizi sağlar.
@SpringBootApplication
@EnableZuulProxy
@EnableDiscoveryClient
public class ZuulConfig {
public static void main(String[] args) {
SpringApplication.run(ZuulConfig.class, args);
}
}
Tarayıcıda http://localhost:8762/routes adresini çağırıyoruz. Bu istek ile Eureka üzerinde Zuul için erişilebilen tüm yolları görüyor olacağız:
{"/spring-cloud-eureka-client/**":"spring-cloud-eureka-client"}
Artık, Eureka Client ile, Zuul Proxy kullanarak iletişim kuracağız. Spring Cloud Netflix-Eureka yazısında anlatılan Client ta uygulama adı “spring-cloud-eureka-client” olarak vermiştik. Bu uygulama üzerinde “/greeting” restini kullanıyorduk. Bu restin içerisine uygulamanın yayınlandığı port bilgisini de ekliyoruz. Bunu Zuul üzerinden çağırmak için isteğimizi düzenlememiz gerekiyor. Tarayıcıda http://localhost:8762/spring-cloud-eureka-client/greeting olarak isteği göndereceğiz ve aşağıdaki cevabı görüyor olmamız gerekiyor.
Hello from ‘SPRING-CLOUD-EUREKA-CLIENT with Port Number 8081’!
Zuul ile Load Balancing
Zuul bir istek aldığında, mevcut fiziksel konumlardan birini seçer ve talepleri servis instance larına iletir.
Servis instance larının yerini önbelleğe alma ve isteği gerçek konuma iletme işleminin tamamı hiçbir ek yapılandırma gerektirmez.
Zuul kendi içirisinde Netflix Ribbon’u kullanmaktadır. Şimdi birden fazla instance olduğunda nasıl davrandığına bakalım.
Birden Fazla Instance Kaydetme
8081 ve 8082 portlarından iki instance çalıştırarak başlayacağız.
Tüm instance lar ayağa kalktıktan sonra, loglarda instanceların fiziksel konumlarının DynamicServerListLoadBalancer’a register olduğunu ve Zuul Controller’a maplendiğini görebiliriz:
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; ……],
Loglar okunabilir olması için biçimlendirilmiştir.
Load Balancing Örneği
Tarayıcıda http://localhost:8762/spring-cloud-eureka-client/greeting adresini birkaç kez çağıralım.
Her seferinde aşağıdaki gibi farklı sonuçlar görmemiz gerekiyor:
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’!
Zuul tarafından alınan her talep, sırayla farklı bir instance a iletilir. Başka bir instance başlar ve Eureka’ya kaydedersek, Zuul otomatik olarak istekleri ona da iletmeye başlar:
Hello from ‘SPRING-CLOUD-EUREKA-CLIENT with Port Number 8083’!
Zuul’un yük dengeleme stratejisini başka bir Netflix Ribbon stratejisiyle de değiştirebiliriz. Bu stratejiyle ilgili detayları Ribbon’u detaylı inceleyerek bulabilirsiniz.
Sonuç olarak, Zuul, Rest Service’in tüm intance ları için tek bir URL sağlar ve istekleri sırayla instance lara göndererek load balancing yapar.