Разница между @RibbonClient и @LoadBalanced

Я понимаю @LoadBalanced указывает, что шаблон Rest должен основываться на балансировке нагрузки на стороне клиента с помощью ленты и проверяет сервер Eureka для разрешения имени службы на хост/порт.

зачем @RibbonClient. Поддерживает ли он собственный ленточный клиент LB без Eureka, а также поддерживает Eureka Discover при настройке с DiscoveryEnabledNIWSServerList?

2 ответов


TL; DR: @LoadBalanced является аннотацией маркера & @RibbonClient используется для целей конфигурации.


@LoadBalanced

используется в качестве аннотации маркера, указывающей, что аннотированный RestTemplate должны использовать RibbonLoadBalancerClient для взаимодействия с вашими услугами.

в свою очередь, это позволяет использовать "логические идентификаторы" для URL-адресов, которые вы передаете в RestTemplate. Эти логические идентификаторы обычно являются именем службы. Для пример:

restTemplate.getForObject("http://some-service-name/user/{id}", String.class, 1);

здесь some-service-name является логическим идентификатором.

@RibbonClient

используется для настройки клиента(ов) ленты.

требуется ли @RibbonClient?

нет! Если вы используете Service Discovery и у вас все в порядке со всеми настройками ленты по умолчанию, вам даже не нужно использовать @RibbonClient Примечание.

когда я должен использовать @RibbonClient?

есть в как минимум два случая, когда вам нужно использовать @RibbonClient

  1. вам нужно настроить параметры ленты для конкретного клиента ленты
  2. вы не используете какой-либо сервис discovery

настройка параметров ленты:

определение @RibbonClient

@RibbonClient(name = "some-service", configuration = SomeServiceConfig.class)
  • name - установите его на то же имя службы, которую вы вызываете с лентой, но нужны дополнительные настройки для как Ribbon взаимодействует с этим сервисом.
  • configuration - установить его в @Configuration класса С все настройки определены как @Beans. Убедитесь, что этот класс не подобрал @ComponentScan в противном случае он будет переопределить значения по умолчанию для всех клиентов ленты.

см. раздел " настройка RibbonClient` в документации Spring Cloud Netflix (ссылка)

использование ленты без обслуживания Открытие!--65-->

если вы не используете Service Discovery, то


RestTemplate поддерживает балансировку нагрузки, используя @LoadBalanced сообщает Spring Cloud, что мы хотим воспользоваться его поддержкой балансировки нагрузки(Если вы используете ленту, то эффект использования @LoadBalanced будет заключаться в том, что RestTemplate будет использовать RibbionClient для получения адреса сервера).
Вы также можете проверить, как работает LoadBalancerAutoConfiguration здесь

используя @RibbonClients вы можете предоставить декларативную конфигурацию для ленты клиент.

Э. Г.

@SpringBootApplication
@RestController
@RibbonClient(name = "app", configuration = RibbonConfig.class)
public class App {

  @LoadBalanced
  @Bean
  RestTemplate restTemplate(){
    return new RestTemplate();
  }
  //...
}

создать RibbonConfig.class для переопределения любого связанного с лентой компонента.

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;

import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.IPing;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.PingUrl;
import com.netflix.loadbalancer.AvailabilityFilteringRule;

public class RibbonConfig {

  @Autowired
  IClientConfig ribbonClientConfig;

  @Bean
  public IPing ribbonPing (IClientConfig config) {
    return new PingUrl();//we override default Iping which is a NoOpPing
  }

  @Bean
  public IRule ribbonRule(IClientConfig config) {
    return new AvailabilityFilteringRule(); // we override the default ZoneAvoidanceRule
  }

}