“负载平衡”可以解释为维持任何工作负载。例如,如果您早上必须提供 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中文网其他相关文章!