Lorsque plusieurs instances d’un service s’exécutent derrière un même nom de service, le consommateur doit répartir les requêtes entre elles. Les applications Spring Cloud sur Enterprise Distributed Application Service (EDAS) utilisent Ribbon pour l’équilibrage de charge côté client. Ribbon intercepte les appels de service via RestTemplate et Feign, puis distribue les requêtes entre les instances enregistrées dans Nacos.
Fonctionnement
Nacos fait office de registre de services. Lorsqu’un consommateur appelle un fournisseur par son nom (par exemple, http://service-provider/query), Ribbon résout ce nom en une liste d’instances enregistrées et répartit les requêtes entre celles-ci.
Nacos implémente l’interface standard com.netflix.loadbalancer.ServerList via NacosServerList. D’autres outils de découverte de services implémentent la même interface :
| Outil de découverte de services | Implémentation de ServerList |
|---|---|
| Nacos | NacosServerList |
| Eureka | DomainExtractingServerList |
| Consul | ConsulServerList |
| ZooKeeper | ZookeeperServerList |
Comme toutes les implémentations partagent cette interface, le passage d’Eureka, Consul ou ZooKeeper à Spring Cloud Alibaba ne nécessite aucune modification du code RestTemplate, Feign ou AsyncRestTemplate (déprécié).
Lors du développement local d’applications, utilisez le plug-in Alibaba Cloud Toolkit pour activer les appels mutuels entre les applications locales et celles déployées dans EDAS (interconnexion end-to-cloud). Vous évitez ainsi la configuration d’un VPN et améliorez l’efficacité du développement. Pour plus d’informations, consultez Présentation de l’interconnexion end-to-cloud.
Prérequis
Avant de commencer, assurez-vous d’avoir :
Une application Spring Cloud déployée sur EDAS avec Nacos comme registre de services
Au moins un fournisseur de services et un consommateur de services
(Facultatif) La dépendance Hystrix ajoutée à votre consommateur pour garantir la compatibilité entre EDAS et Hystrix. Elle prend en charge l’attribut fallback. Sentinel permet également d’implémenter cette fonctionnalité.
Exemples d’applications
Téléchargez les projets de démonstration pour suivre les étapes :
Ajouter l’équilibrage de charge à RestTemplate
RestTemplate est un client HTTP Spring destiné aux services RESTful. Ajoutez l’annotation @LoadBalanced à un bean RestTemplate pour activer l’équilibrage de charge côté client.
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);
}
...
}
L’annotation
@LoadBalancedsur la méthode@Beanenregistre unLoadBalancerInterceptorqui achemine les requêtes viaRibbonLoadBalancerClient.Utilisez le nom du service (par exemple,
service-provider) comme nom d’hôte dans l’URL. Ribbon le remplace par l’adresse IP et le port d’une instance disponible.
Ajouter l’équilibrage de charge à Feign
Feign est un client HTTP déclaratif qui simplifie les appels d’API RESTful. L’équilibrage de charge fonctionne automatiquement lorsqu’un client Feign référence un nom de service enregistré dans Nacos.
-
Étape 1 : Activer Feign
Ajoutez
@EnableFeignClientsà la classe de votre application Spring Boot :@SpringBootApplication @EnableFeignClients public class MyApplication { ... } -
Étape 2 : Définir une interface de client Feign
Créez une interface annotée avec
@FeignClient. Définissez le paramètrenamesur le nom du service cible :@FeignClient(name = "service-provider") public interface EchoService { @RequestMapping(value = "/echo/{str}", method = RequestMethod.GET) String echo(@PathVariable("str") String str); } -
Étape 3 : Injecter et appeler le client Feign
Injectez l’interface et appelez ses méthodes. Chaque appel déclenche une requête HTTP vers l’une des instances
service-provider: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"); } ... }
Vérifier l’équilibrage de charge
Après le démarrage du service service-consumer et de plusieurs services service-provider, accédez à l’URL fournie par service-consumer pour vérifier si l’équilibrage de charge est correctement mis en œuvre.
-
RestTemplate
Accédez plusieurs fois à
/echo-rest/rest-testet vérifiez si les requêtes sont transmises à différentes instances. -
Feign
Accédez plusieurs fois à
/echo-feign/feign-testet vérifiez si les requêtes sont transmises à différentes instances.