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
?
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);
où 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
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
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
}
}