Service Discovery
Mikroservis-lərdə service-lər bir-biri ilə kommunikasiya etməli olurlar. Monolithic application-da service-lər language-level method və ya procedure call-lar vasitəsilə bir-birini çağırırlar. Traditional distributed system deployment-da service-lər fixed, well-known location-larda (host və port) işləyirlər. Lakin modern mikroservis-based application-lar adətən virtualized və ya containerized environment-larda işləyir ki, burada service instance-lərinin sayı və location-ları dinamik şəkildə dəyişir.
Problem
Service-in client-i - API gateway və ya başqa service - service instance-in location-unu necə discover edə bilər?
Context və Forces
- Hər service instance-i müəyyən location-da (host və port) remote API expose edir
- Service instance-lərinin sayı və location-ları dinamik dəyişir
- Virtual machine və container-lər adətən dynamic IP address-lər alırlar
- Service instance-lərinin sayı dinamik vary oluna bilər (məsələn, EC2 Autoscaling Group)
Service Discovery Mexanizmi
Tutaq ki, Service-A və Service-B-miz var və Load Balancer ayrı serverdə yerləşdirilir. İndi Discovery Service-i təqdim edək.
Service-A və Service-B bir-biri ilə kommunikasiya etmək istədikdə, mikroservis-lərimizi start edərkən onları Discovery Service-ə register edirik. Bu discovery service Service-A və Service-B-nin IP və port nömrələrini bilir.
Əgər Service-B-nin müxtəlif instance-ləri varsa, bütün bu instance-lər öz information-larını Discovery Service-ə register edirlər. Bu, host və port nömrəsi information-larını manage etdiyimiz mərkəzi location-dur.
Service Registry
Service Registry service identification-ın həlledici hissəsidir. Bu, service instance-lərinin network location-larını saxlayan database-dir. Service Registry yüksək availability və up-to-date olmalıdır.
Service Registry-də Service-B-nin 4 müxtəlif instance-i var və onlar müəyyən port nömrəsi və IP address-də işləyirlər. Eyni şəkildə, Service-A-nın bir instance-i var.
Service Discovery Prosesi
- Registration: Service-lər start olunduqda özlərini Discovery Service-ə register edirlər
- Query: Service-A Service-B-yə connect olmaq istəyir
- Discovery: Load Balancer Discovery Service-dən Service-B-nin instance-lərini soruşur
- Selection: Load Balancer available instance-lər arasından birini seçir
- Communication: Request seçilmiş instance-ə göndərilir
Service Discovery Növləri
1. Client-Side Service Discovery
Client birbaşa service registry-ə query edir və available instance-lər arasından birini seçir.
2. Server-Side Service Discovery
Client request-i router-ə (load balancer) göndərir, router service registry-ni query edir və request-i available instance-ə forward edir.
Server-Side Service Discovery
Server-Side Service Discovery-də client service registry ilə birbaşa əlaqə saxlamır. Bunun əvəzinə:
- Addım 1: Client Request - Client (Service-A) server-ə (Load Balancer) request göndərir.
- Addım 2: Registry Query - Server (Load Balancer) Discovery Service-ə query edir.
- Addım 3: Response - Discovery Service available Service-B instance-lərinin siyahısını qaytarır.
- Addım 4: Selection - Load Balancer instance-lərdan birini seçir və call edir.
- Addım 5: No Direct Communication - Service-A Discovery Service ilə birbaşa danışmır.
Advantages
- Simplified Client Code: Client-də discovery logic implement etmək lazım deyil
- Language Independence: Hər programming language üçün discovery logic yazmaq lazım deyil
- Lightweight Service Consumer: Client daha lightweight olur
- Built-in Load Balancing: Load Balancer load balancing işini görür
- Cloud Environment Support: Bəzi cloud environment-lər bu functionality-ni təmin edir
Disadvantages
- Additional Component: Load Balancer əlavə system component-idir
- Setup və Configuration: Load Balancer setup və configure edilməlidir
- High Availability: Load Balancer replication availability üçün lazımdır
- Protocol Support: Router müxtəlif communication protocol-lərı support etməlidir
- Network Hops: Client-Side Discovery-yə nisbətən daha çox network hop lazımdır
Real-World Example-lər
AWS Elastic Load Balancer (ELB)
- Client HTTP(s) request-lərini ELB-yə göndərir
- ELB traffic-i EC2 instance-lər arasında load balance edir
- EC2 instance-lər ELB-yə API call və ya auto-scaling group vasitəsilə register olurlar
NGINX
- Web server kimi də, reverse proxy, load balancer kimi də istifadə oluna bilər
- Free və open-source software-dir
- HTTP cache functionality-ni də dəstəkləyir
Kubernetes və Marathon
- Hər host-da proxy işlədir
- Service-ə access üçün client local proxy-yə connect olur
- Proxy request-i cluster-də işləyən service instance-ə forward edir
Implementation Considerations
Service Registry Design
- High Availability: Service Registry highly available olmalıdır
- Consistency: Service information consistent olmalıdır
- Performance: Fast query response lazımdır
- Scalability: Çoxlu service-i handle edə bilməlidir
Health Monitoring
- Service instance-lərinin health-ini monitor etmək
- Unhealthy instance-ləri registry-dən remove etmək
- Automatic failover mechanism-i təmin etmək
Configuration Management
- Service endpoint-lərinin configuration-u
- Load balancing algorithm-larının seçimi
- Timeout və retry policy-lərinin təyini
Best Practices
- Circuit Breaker Pattern: Service Discovery ilə birlikdə istifadə edin
- Health Check: Regular health check-lər implement edin
- Caching: Service location-larını cache edin
- Monitoring: Service discovery metrics-lərini monitor edin
- Security: Service communication-u secure edin