Cuando varias instancias de un servicio se ejecutan detrás de un único nombre de servicio, el consumidor necesita un mecanismo para distribuir las solicitudes entre ellas. Las aplicaciones Spring Cloud en Enterprise Distributed Application Service (EDAS) utilizan Ribbon para realizar el balanceo de carga del lado del cliente. Ribbon intercepta las llamadas al servicio realizadas mediante RestTemplate y Feign, y luego distribuye las solicitudes entre las instancias registradas en Nacos.
Funcionamiento
Nacos funciona como registro de servicios. Cuando un consumidor de servicios llama a un proveedor por su nombre (por ejemplo, http://service-provider/query), Ribbon resuelve el nombre a una lista de instancias registradas y distribuye las solicitudes entre ellas.
Nacos implementa la interfaz estándar com.netflix.loadbalancer.ServerList a través de NacosServerList. Otras herramientas de descubrimiento de servicios implementan la misma interfaz:
|
Herramienta de descubrimiento de servicios |
Implementación de ServerList |
|
Nacos |
|
|
Eureka |
|
|
Consul |
|
|
ZooKeeper |
|
Dado que todas las implementaciones comparten esta interfaz, cambiar de Eureka, Consul o ZooKeeper a Spring Cloud Alibaba no requiere modificaciones en su código de RestTemplate, Feign o AsyncRestTemplate (en desuso).
Al desarrollar aplicaciones localmente, puede utilizar el complemento Alibaba Cloud Toolkit para habilitar llamadas mutuas entre aplicaciones locales y aplicaciones desplegadas en EDAS; esto se conoce como interconexión de extremo a nube. De este modo, no es necesario configurar una VPN y se mejora la eficiencia del desarrollo. Para obtener más información, consulte Overview of end-to-cloud interconnection.
Requisitos previos
Antes de empezar, asegúrese de contar con lo siguiente:
Una aplicación Spring Cloud desplegada en EDAS con Nacos como registro de servicios
Como mínimo, un proveedor de servicios y un consumidor de servicios
(Opcional) La dependencia Hystrix agregada a su consumidor para garantizar la compatibilidad entre EDAS y Hystrix. Esta admite el atributo fallback, lo cual también puede implementarse mediante Sentinel
Aplicaciones de ejemplo
Descargue los proyectos de demostración para seguir los pasos:
Adición de balanceo de carga a RestTemplate
RestTemplate es un cliente HTTP de Spring para servicios RESTful. Agregue la anotación @LoadBalanced a un bean de RestTemplate para habilitar el balanceo de carga del lado del cliente.
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);
}
...
}
La anotación
@LoadBalanceden el método@Beanregistra unLoadBalancerInterceptorque enruta las solicitudes a través deRibbonLoadBalancerClient.Utilice el nombre del servicio (por ejemplo,
service-provider) como nombre de host en la URL. Ribbon lo reemplaza por la dirección IP y el puerto de una instancia disponible.
Adición de balanceo de carga a Feign
Feign es un cliente HTTP declarativo que simplifica las llamadas a API RESTful. El balanceo de carga funciona automáticamente cuando un cliente Feign hace referencia a un nombre de servicio registrado en Nacos.
-
Paso 1: Habilitar Feign
Agregue
@EnableFeignClientsa la clase de su aplicación Spring Boot:@SpringBootApplication @EnableFeignClients public class MyApplication { ... } -
Paso 2: Definir una interfaz de cliente Feign
Cree una interfaz anotada con
@FeignClient. Establezca el parámetronamecon el nombre del servicio destino:@FeignClient(name = "service-provider") public interface EchoService { @RequestMapping(value = "/echo/{str}", method = RequestMethod.GET) String echo(@PathVariable("str") String str); } -
Paso 3: Inyectar y llamar al cliente Feign
Inyecte la interfaz y llame a sus métodos. Cada llamada desencadena una solicitud HTTP hacia una de las instancias de
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"); } ... }
Comprobación del balanceo de carga
Una vez iniciados el servicio service-consumer y varios servicios service-provider, acceda a la URL proporcionada por service-consumer para comprobar si el balanceo de carga está implementado correctamente.
-
RestTemplate
Acceda a
/echo-rest/rest-testvarias veces y compruebe si las solicitudes se reenvían a distintas instancias. -
Feign
Acceda a
/echo-feign/feign-testvarias veces y compruebe si las solicitudes se reenvían a distintas instancias.