「負載平衡」可以解釋為維持任何工作負載。例如,如果您早上必須提供 1000 份早餐,您可以將工作分配給 2-3 個或更多的餐飲服務商,以縮短交貨/準備時間。
在電腦世界中,同樣的邏輯也適用,如果你想快速交付,你可以分工,例如一個網站我們可以有5-10個網絡伺服器,這樣網站會交付得更快(尤其是在高流量的情況下) ),這是伺服器端。
我想談談客戶端負載平衡及其工作原理,例如您正在查詢每個請求的後端,並且您有多個伺服器執行後端工作,為此我將使用 WHOIS 服務
whois1.service.com whois2.service.com
我們可以對這兩台伺服器中的每個請求進行負載平衡,最常用的演算法和預設循環意味著每個請求都會依次發送到一個而不是另一個,例如who1、who2 who1 等,這可以在客戶端透過「 Spring Cloud 負載平衡器」。我們需要配置3個類別
現在,我們已經完成了後端的全部設定
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(); } }
現在可以在任何 @Component 或 @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(); } }
參考資料:
以上是什麼是負載平衡以及如何在客戶端進行負載平衡的詳細內容。更多資訊請關注PHP中文網其他相關文章!