web-dev-qa-db-fra.com

Différence entre @RibbonClient et @LoadBalanced

Je comprends @LoadBalanced indique que le modèle Rest doit être basé sur l'équilibrage de charge côté client à l'aide du ruban et vérifie que le serveur Eureka a résolu le nom du service en hôte/port.

À quoi sert @RibbonClient. Est-ce pour prendre en charge le client ruban natif LB sans Eureka et également pour prendre en charge Eureka Discover lorsqu'il est configuré avec DiscoveryEnabledNIWSServerList?

20
jack

TL; DR : @LoadBalanced est une annotation de marqueur & @RibbonClient est utilisé à des fins de configuration.


@LoadBalanced

Utilisé comme annotation de marqueur indiquant que le RestTemplate annoté doit utiliser un RibbonLoadBalancerClient pour interagir avec vos services.

À son tour, cela vous permet d'utiliser des "identificateurs logiques" pour les URL que vous passez à RestTemplate. Ces identifiants logiques sont généralement le nom d'un service. Par exemple:

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

some-service-name est l'identifiant logique.

@RibbonClient

Utilisé pour configurer vos clients Ribbon.

@RibbonClient est-il requis?

Non! Si vous utilisez Service Discovery et que vous êtes d'accord avec tous les paramètres par défaut du ruban, vous n'avez même pas besoin d'utiliser le @RibbonClient annotation.

Quand dois-je utiliser @RibbonClient?

Il y a au moins deux cas où vous devez utiliser @RibbonClient

  1. Vous devez personnaliser vos paramètres de ruban pour un client de ruban particulier
  2. Vous n'utilisez aucune découverte de service

Personnalisation des paramètres de votre ruban:

Définissez un @RibbonClient

@RibbonClient(name = "some-service", configuration = SomeServiceConfig.class)
  • name - définissez-le sur le même nom que le service que vous appelez avec le ruban, mais avez besoin de personnalisations supplémentaires pour la façon dont le ruban interagit avec ce service.
  • configuration - définissez-le sur un @Configuration classe avec toutes vos personnalisations définies comme @Beans. Assurez-vous que cette classe n'est pas reprise par @ComponentScan sinon, il remplacera les valeurs par défaut pour TOUS les clients du ruban.

Voir la section "Personnalisation du RibbonClient` dans la documentation Spring Cloud Netflix (lien)

Utilisation du ruban sans découverte de service

Si vous n'utilisez pas Service Discovery, le champ name du @RibbonClient l'annotation sera utilisée pour préfixer votre configuration dans le application.properties ainsi que "identifiant logique" dans l'URL que vous transmettez à RestTemplate.

Définissez un @RibbonClient

@RibbonClient(name = "myservice")

puis dans votre application.properties

myservice.ribbon.eureka.enabled=false
myservice.ribbon.listOfServers=http://localhost:5000, http://localhost:5001
41
dustin.schultz

RestTemplate prend en charge l'équilibrage de charge, à l'aide de @LoadBalanced indique à Spring Cloud que nous voulons tirer parti de sa prise en charge de l'équilibrage de charge (si vous utilisez Ribbon, l'effet de @LoadBalanced sera que RestTemplate utilisera RibbionClient pour obtenir l'adresse du serveur).
Vous pouvez également vérifier le fonctionnement de LoadBalancerAutoConfiguration ici

En utilisant @ RibbonClients vous pouvez fournir une configuration déclarative pour un client ruban.

Par exemple.

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

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

Ensuite, vous créez RibbonConfig.class pour remplacer tout bean lié au ruban.

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
  }

}
3
sol4me