Bir hizmet adı altında birden fazla örnek çalıştığında, istekleri bu örneklere dağıtmak için bir mekanizma gerekir. Enterprise Distributed Application Service (EDAS) üzerindeki Spring Cloud uygulamaları, istemci taraflı yük dengeleme için Ribbon kullanır. Ribbon, RestTemplate ve Feign üzerinden yapılan hizmet çağrılarını keserek istekleri Nacos'a kayıtlı örneklere dağıtır.
Çalışma mantığı
Nacos, hizmet kayıt defteri olarak görev yapar. Bir hizmet tüketicisi bir sağlayıcıyı adına göre çağırdığında (örneğin, http://service-provider/query), Ribbon bu adı kayıtlı örnek listesine çözümler ve istekleri bunlar arasında dağıtır.
Nacos, standart com.netflix.loadbalancer.ServerList arayüzünü NacosServerList aracılığıyla uygular. Diğer hizmet keşif araçları da aynı arayüzü kullanır:
| Hizmet keşif aracı | ServerList uygulaması |
|---|---|
| Nacos | NacosServerList |
| Eureka | DomainExtractingServerList |
| Consul | ConsulServerList |
| ZooKeeper | ZookeeperServerList |
Tüm uygulamalar bu ortak arayüzü paylaştığından, Eureka, Consul veya ZooKeeper'dan Spring Cloud Alibaba'ya geçiş yaparken RestTemplate, Feign veya kullanım dışı bırakılmış AsyncRestTemplate kodunuzda herhangi bir değişiklik yapmanız gerekmez.
Ön koşullar
Başlamadan önce şunlara sahip olduğunuzdan emin olun:
Nacos'u hizmet kayıt defteri olarak kullanan ve EDAS üzerinde dağıtılmış bir Spring Cloud uygulaması
En az bir hizmet sağlayıcı ve bir hizmet tüketicisi
(İsteğe bağlı) EDAS ile Hystrix arasındaki uyumluluğu sağlamak için tüketiciye eklenmiş Hystrix bağımlılığı. Geri dönüş niteliğini destekler. Sentinel ile de uygulanabilir.
Örnek uygulamalar
Adımları takip etmek için demo projelerini indirin:
RestTemplate'e yük dengeleme ekleme
RestTemplate, RESTful hizmetler için kullanılan bir Spring HTTP istemcisidir. İstemci taraflı yük dengelemeyi etkinleştirmek için bir RestTemplate bean'ine @LoadBalanced ek açıklamasını ekleyin.
public class MyApp {
// The @LoadBalanced annotation adds LoadBalancerInterceptor to this RestTemplate.
// LoadBalancerInterceptor uses RibbonLoadBalancerClient to distribute requests
// across service instances registered in Nacos.
@Autowired
private RestTemplate restTemplate;
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
// Use the service name ("service-provider") instead of a hostname.
// Ribbon resolves it to an available instance.
public void doSomething() {
Foo foo = restTemplate.getForObject("http://service-provider/query", Foo.class);
doWithFoo(foo);
}
...
}
@LoadBalancedek açıklamasının@Beanyöntemine uygulanması, istekleriRibbonLoadBalancerClientüzerinden yönlendiren birLoadBalancerInterceptorkaydeder.URL'de ana bilgisayar adı olarak hizmet adını (örneğin,
service-provider) kullanın. Ribbon bu adı kullanılabilir bir örneğin IP adresi ve bağlantı noktasıyla değiştirir.
Feign'e yük dengeleme ekleme
Feign, RESTful API çağrılarını basitleştiren bildirim temelli bir HTTP istemcisidir. Bir Feign istemcisi Nacos'ta kayıtlı bir hizmet adına başvurduğunda yük dengeleme otomatik olarak çalışır.
-
1. Adım: Feign'i etkinleştirin
Spring Boot uygulama sınıfınıza
@EnableFeignClientsek açıklamasını ekleyin:@SpringBootApplication @EnableFeignClients public class MyApplication { ... } -
2. Adım: Bir Feign istemci arayüzü tanımlayın
@FeignClientile açıklamalı bir arayüz oluşturun.nameparametresini hedef hizmet adına ayarlayın:@FeignClient(name = "service-provider") public interface EchoService { @RequestMapping(value = "/echo/{str}", method = RequestMethod.GET) String echo(@PathVariable("str") String str); } -
3. Adım: Feign istemcisini enjekte edin ve çağırın
Arayüzü enjekte edin ve yöntemlerini çağırın. Her çağrı,
service-providerörneklerinden birine bir HTTP isteği tetikler:public class MyService { @Autowired private EchoService echoService; public void doSomething() { // Equivalent to GET http://service-provider/echo/test // Ribbon selects an instance from Nacos and routes the request. echoService.echo("test"); } ... }
Yük dengelemeyi doğrulama
service-consumer hizmeti ve birden fazla service-provider hizmeti başlatıldıktan sonra, yük dengelemenin uygulanıp uygulanmadığını kontrol etmek için service-consumer tarafından sağlanan URL'ye erişin.
-
RestTemplate
/echo-rest/rest-testadresine birkaç kez erişin ve isteklerin farklı örneklere iletilip iletilmediğini kontrol edin. -
Feign
/echo-feign/feign-testadresine birkaç kez erişin ve isteklerin farklı örneklere iletilip iletilmediğini kontrol edin.