Разница между @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
- вам нужно настроить параметры ленты для конкретного клиента ленты
- вы не используете какой-либо сервис 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
}
}