Heim >Java >javaLernprogramm >Was ist Lastausgleich und wie wird er auf der Clientseite durchgeführt?

Was ist Lastausgleich und wie wird er auf der Clientseite durchgeführt?

Barbara Streisand
Barbara StreisandOriginal
2025-01-10 22:08:41122Durchsuche

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

„Lastausgleich“ kann als Aufrechterhaltung einer beliebigen Arbeitslast erklärt werden. Wenn Sie beispielsweise morgens 1000 Frühstücke servieren müssen, können Sie die Arbeit auf 2–3 oder mehr Caterer aufteilen, um die Liefer-/Zubereitungszeit zu verkürzen.

In der Computerwelt gilt die gleiche Logik: Wenn Sie schnell liefern möchten, können Sie die Arbeit aufteilen. Für eine Website können wir beispielsweise 5 bis 10 Webserver haben. Auf diese Weise wird die Website schneller bereitgestellt (insbesondere bei hohem Datenverkehr). ), das ist serverseitig.

Ich möchte über den clientseitigen Lastausgleich sprechen und darüber, wie das funktioniert. Sie fragen zum Beispiel das Backend für jede Anfrage ab und Sie haben mehrere Server, die die Backend-Arbeit erledigen, dafür werde ich den WHOIS-Dienst verwenden

whois1.service.com whois2.service.com

Wir können jede Anfrage auf diesen beiden Servern, dem am häufigsten verwendeten Algorithmus und dem Standard-Round-Robin-Verfahren ausgleichen, was bedeutet, dass jede Anfrage an einen Server oder an einen anderen geht, z. B. who1, who2, who1 usw. Dies kann auf der Clientseite mit „ Spring Cloud LoadBalancer“. Wir müssen 3 Klassen konfigurieren

  1. ServiceInstanceListSupplier zum Definieren der Backend-Adressen und Ports
  2. Bean ServiceInstanceListSupplier zur Bereitstellung der Liste der Endpunkte
  3. @LoadBalancerClient, der Webclient, wird für Backend-Aufrufe verwendet

Jetzt haben wir das gesamte Setup für das 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();
    }

}

Dies kann jetzt in jeder @Component oder @Service verwendet werden.

@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();
    }
}

Referenzen:

  • Meine Frage in SO zur Lösung, wie man einen clientseitigen Lastausgleich mit Feder implementiert
  • Spring Cloud LoadBalancer

Das obige ist der detaillierte Inhalt vonWas ist Lastausgleich und wie wird er auf der Clientseite durchgeführt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn