Maison >Java >javaDidacticiel >Qu'est-ce que l'équilibrage de charge et comment le faire côté client
« 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
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 :
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!