Maison >Java >javaDidacticiel >Qu'est-ce que l'équilibrage de charge et comment le faire côté client

Qu'est-ce que l'équilibrage de charge et comment le faire côté client

Barbara Streisand
Barbara Streisandoriginal
2025-01-10 22:08:41122parcourir

What is load balancing and how to do it on client side

« L'équilibrage de charge » peut être expliqué comme le maintien de n'importe quelle charge de travail. Par exemple, si vous devez servir 1000 petits-déjeuners le matin, vous pouvez diviser le travail entre 2-3 traiteurs ou plus pour réduire le délai de livraison/préparation.

Dans le monde informatique, la même logique s'applique, si vous souhaitez livrer rapidement, vous pouvez diviser le travail, par exemple pour un site Web, nous pouvons avoir 5 à 10 serveurs Web, de cette façon le site Web sera livré plus rapidement (surtout en cas de trafic élevé ), c'est côté serveur.

Je veux parler de l'équilibrage de charge côté client et de la façon dont cela fonctionne, par exemple, vous interrogez le backend pour chaque requête et vous avez plusieurs serveurs qui effectuent le travail backend, pour cela, j'utiliserai le service WHOIS

whois1.service.com whois2.service.com

Nous pouvons équilibrer la charge de chaque requête sur ces deux serveurs, l'algorithme le plus utilisé et le round robin par défaut, ce qui signifie que chaque requête ira à l'une plutôt qu'à l'autre, comme who1, who2 who1 et ainsi de suite, cela peut être fait côté client avec " Spring Cloud LoadBalancer ». nous devons configurer 3 classes

  1. ServiceInstanceListSupplier pour définir les adresses et les ports backend
  2. Bean ServiceInstanceListSupplier pour fournir la liste des points finaux
  3. @LoadBalancerClient qui est le client Web sera utilisé pour les appels backend

Maintenant, nous avons toute la configuration pour le backend

public class RestCaller implements ServiceInstanceListSupplier {

    private final String serviceId;

    public RestCaller(String serviceId) {
        this.serviceId = serviceId;
    }

    @Override
    public String getServiceId() {
        return serviceId;
    }

    @Override
    public Flux<List<ServiceInstance>> get() {
        return Flux.just(Arrays.asList(
                new DefaultServiceInstance(serviceId, serviceId, "abc.cyclic.app", 443, true),
                new DefaultServiceInstance(serviceId, serviceId, "someting.koyeb.app", 443, true),
                new DefaultServiceInstance(serviceId, serviceId, "127.0.0.1", 8080, false)
        ));
    }
}


@Configuration
public class RestCallerConfiguration {

    @Autowired
    @Qualifier("webClientBuilder")
    WebClient.Builder webClientBuilder;

    @Bean
    @Primary
    ServiceInstanceListSupplier serviceInstanceListSupplier(ConfigurableApplicationContext ctx) {
        return ServiceInstanceListSupplier
                .builder()
                .withRetryAwareness()
                .withHealthChecks(webClientBuilder.build())
                .withBase(new RestCaller("whoisService"))
                .build(ctx);
    }
}


@Configuration
@LoadBalancerClient(name = "whoisService", configuration = RestCallerConfiguration.class)
public class WebClientConfig {

    @LoadBalanced
    @Bean
    @Qualifier("loadBalancedWebClientBuilder")
    WebClient.Builder loadBalancedWebClientBuilder() {
        return WebClient.builder();
    }

    @Bean
    @Qualifier("webClientBuilder")
    WebClient.Builder webClientBuilder() {
        return WebClient.builder();
    }

}

Ceci peut désormais être utilisé dans n'importe quel @Component ou @Service.

@Component
public class WhoisCaller {

    @Autowired
    @Qualifier("loadBalancedWebClientBuilder")
    WebClient.Builder webClientBuilder;

    public String getWhois(String ip, String source) {
        String url = "http://whoisService/whois?ip=" + ip + "&source=" + source;

        return webClientBuilder.build()
                .get()
                .uri(url)
                .retrieve()
                .bodyToMono(String.class)
                .timeout(Duration.ofMinutes(1))
                .doOnError(e -> {
                    WebClientResponseException e1 = (WebClientResponseException) e;
                    log.error(e1.getRequest().getURI().getHost());
                })
                .block();
    }
}

Références :

  • Ma question dans SO pour résoudre comment implémenter l'équilibrage de charge côté client avec Spring
  • Spring Cloud LoadBalancer

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn