Rumah > Java > javaTutorial > Apakah pengimbangan beban dan cara melakukannya di sisi pelanggan

Apakah pengimbangan beban dan cara melakukannya di sisi pelanggan

Barbara Streisand
Lepaskan: 2025-01-10 22:08:41
asal
126 orang telah melayarinya

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

“Pengimbangan beban” boleh dijelaskan sebagai mengekalkan sebarang beban kerja. Contohnya jika anda perlu menghidangkan 1000 sarapan pagi anda boleh membahagikan kerja antara 2-3 atau lebih katerer untuk mengurangkan masa penghantaran/penyediaan.

Dalam dunia komputer, logik yang sama berlaku, jika anda ingin menghantar cepat, anda boleh membahagikan kerja, contohnya untuk laman web kita boleh mempunyai 5-10 pelayan web, dengan cara ini laman web akan dihantar dengan lebih cepat (terutama semasa trafik tinggi ), ini bahagian pelayan.

Saya ingin bercakap tentang pengimbangan beban sisi pelanggan dan cara ini berfungsi, contohnya anda menanyakan bahagian belakang untuk setiap permintaan, dan anda mempunyai beberapa pelayan yang melakukan kerja bahagian belakang, untuk ini saya akan menggunakan perkhidmatan WHOIS

whois1.service.com whois2.service.com

Kami boleh memuatkan baki setiap permintaan dalam dua pelayan ini, algoritma yang paling banyak digunakan dan round robin lalai yang bermaksud setiap permintaan akan pergi ke satu daripada yang lain, seperti who1, who2 who1 dan seterusnya, ini boleh dilakukan di sisi pelanggan dengan “ Spring Cloud LoadBalancer”. kita perlu mengkonfigurasi 3 kelas

  1. ServiceInstanceListSupplier untuk menentukan alamat dan port belakang
  2. Bean ServiceInstanceListSupplier untuk membekalkan senarai titik akhir
  3. @LoadBalancerClient iaitu klien web akan digunakan untuk panggilan belakang

Kini, kami mempunyai keseluruhan persediaan untuk bahagian belakang

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

}

Salin selepas log masuk

Ini kini boleh digunakan dalam mana-mana @Component atau @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();
    }
}

Salin selepas log masuk

Rujukan:

  • Soalan saya dalam SO untuk menyelesaikan cara melaksanakan pengimbangan beban sisi klien dengan spring
  • Spring Cloud LoadBalancer

Atas ialah kandungan terperinci Apakah pengimbangan beban dan cara melakukannya di sisi pelanggan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan