Todos os produtos
Search
Central de documentação

Enterprise Distributed Application Service:Implementar balanceamento de carga

Última atualização: Jun 26, 2026

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

NacosServerList

Eureka

DomainExtractingServerList

Consul

ConsulServerList

ZooKeeper

ZookeeperServerList

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 @LoadBalanced no método @Bean registra um LoadBalancerInterceptor que encaminha requisições via RibbonLoadBalancerClient.

  • 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.

  1. Etapa 1: Ative o Feign

    Adicione @EnableFeignClients à classe da sua aplicação Spring Boot:

    @SpringBootApplication
    @EnableFeignClients
    public class MyApplication {
        ...
    }
  2. Etapa 2: Defina uma interface de cliente Feign

    Crie uma interface anotada com @FeignClient. Defina o parâmetro name com 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);
    }
  3. 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-test várias vezes e verifique se as requisições são encaminhadas para diferentes instâncias.

  • Feign

    Acesse /echo-feign/feign-test várias vezes e confirme se as requisições são distribuídas entre diferentes instâncias.