Quando várias instâncias de um serviço executam sob um único nome, o consumidor precisa distribuir as requisições entre elas. As aplicações Spring Cloud no Enterprise Distributed Application Service (EDAS) usam o Ribbon para balanceamento de carga no lado do cliente. O Ribbon intercepta chamadas de serviço feitas via RestTemplate e Feign e distribui as requisições pelas instâncias registradas no Nacos.
Como funciona
O Nacos atua como registro de serviços. Quando um consumidor chama um provedor pelo nome (por exemplo, http://service-provider/query), o Ribbon resolve esse nome para uma lista de instâncias registradas e distribui as requisições entre elas.
O Nacos implementa a interface padrão com.netflix.loadbalancer.ServerList por meio da classe NacosServerList. Outras ferramentas de descoberta de serviços implementam a mesma interface:
|
Ferramenta de descoberta de serviços |
Implementação do ServerList |
|
Nacos |
|
|
Eureka |
|
|
Consul |
|
|
ZooKeeper |
|
Como todas as implementações compartilham essa interface, migrar do Eureka, Consul ou ZooKeeper para o Spring Cloud Alibaba não exige alterações no código RestTemplate, Feign ou no obsoleto AsyncRestTemplate.
Ao desenvolver aplicações localmente, use o plug-in Alibaba Cloud Toolkit para permitir chamadas mútuas entre aplicações locais e aplicações implantadas no EDAS (interconexão ponta-nuvem). Assim, você evita configurar VPN e aumenta a eficiência do desenvolvimento. Para mais informações, consulte Visão geral da interconexão ponta-nuvem.
Pré-requisitos
Antes de começar, verifique se você tem:
Uma aplicação Spring Cloud implantada no EDAS com o Nacos como registro de serviços
Pelo menos um provedor e um consumidor de serviço
(Opcional) A dependência do Hystrix adicionada ao consumidor para garantir compatibilidade entre EDAS e Hystrix. Ela oferece suporte ao atributo fallback. O Sentinel também pode implementar essa funcionalidade
Aplicações de exemplo
Baixe os projetos de demonstração para acompanhar:
Adicionar balanceamento de carga ao RestTemplate
O RestTemplate é um cliente HTTP do Spring para serviços RESTful. Adicione a anotação @LoadBalanced a um bean do RestTemplate para ativar o balanceamento de carga no lado do 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);
}
...
}
A anotação
@LoadBalancedno método@Beanregistra umLoadBalancerInterceptorque encaminha requisições viaRibbonLoadBalancerClient.Use o nome do serviço (por exemplo,
service-provider) como nome de host na URL. O Ribbon substitui esse valor pelo endereço IP e porta de uma instância disponível.
Adicionar balanceamento de carga ao Feign
O Feign é um cliente HTTP declarativo que simplifica chamadas de API RESTful. O balanceamento de carga funciona automaticamente quando um cliente Feign referencia um nome de serviço registrado no Nacos.
-
Etapa 1: Ative o Feign
Adicione
@EnableFeignClientsà classe da sua aplicação Spring Boot:@SpringBootApplication @EnableFeignClients public class MyApplication { ... } -
Etapa 2: Defina uma interface de cliente Feign
Crie uma interface anotada com
@FeignClient. Defina o parâmetronamecom o nome do serviço de destino:@FeignClient(name = "service-provider") public interface EchoService { @RequestMapping(value = "/echo/{str}", method = RequestMethod.GET) String echo(@PathVariable("str") String str); } -
Etapa 3: Injetar e chamar o cliente Feign
Injete a interface e chame seus métodos. Cada chamada aciona uma requisição HTTP para uma das instâncias 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"); } ... }
Verifique o balanceamento de carga
Após iniciar o serviço service-consumer e múltiplos serviços service-provider, acesse a URL fornecida pelo service-consumer para confirmar o funcionamento do balanceamento de carga.
-
RestTemplate
Acesse
/echo-rest/rest-testvárias vezes e verifique se as requisições são encaminhadas para diferentes instâncias. -
Feign
Acesse
/echo-feign/feign-testvárias vezes e confirme se as requisições são distribuídas entre diferentes instâncias.