SpringCloud-02-LoadBalance服务调用的负载均衡

一、概述

一般情况下我们所说的负载均衡通常都是指服务端负载均衡,负载均衡器会维护一个可用的后端服务器清单,然后通过心跳机制来删除故障的服务端节点以保证清单中都是可以正常访问的服务端节点,此时当客户端的请求到达负载均衡服务器时,负载均衡器按照某种配置好的规则从可用服务端清单中选出一台服务器去处理客户端的请求。

客户端负载均衡和服务端负载均衡最大的区别在于服务清单所存储的位置。在客户端负载均衡中,所有的客户端节点都有一份自己要访问的服务端清单,这些清单统统都是从Eureka服务注册中心获取的。在Spring Cloud中我们如果想要使用客户端负载均衡,方法很简单,开启@LoadBalanced注解即可,这样客户端在发起请求的时候会先自行选择一个服务端,向该服务端发起请求,从而实现负载均衡。

SpringCloud原有的客户端负载均衡方案Ribbon已经被废弃,取而代之的是SpringCloud LoadBalancer。

相比较于Ribbon,Spring Cloud LoadBalancer不仅能够支持RestTemplate,还支持WebClient。WeClient是Spring Web Flux中提供的功能,可以实现响应式异步请求,因此学习Spring Cloud LoadBalancer之前,建议先了解下Spring Web Flux。

二、解析

LoadBalancer 在工作时分成两步:

  • 第一步,先选择ConsulServer从服务端查询并拉取服务列表,知道了它有多个服务(上图3个服务),这3个实现是完全一样的,默认轮询调用谁都可以正常执行。类似生活中求医挂号,某个科室今日出诊的全部医生,客户端你自己选一个。
  • 第二步,按照指定的负载均衡策略从server取到的服务注册列表中由客户端自己选择一个地址,所以LoadBalancer是一个客户端的负载均衡器。

三、默认算法

1、随机

2、轮询

四、负载均衡基础使用

@LoadBalanced

java 复制代码
@Configuration
public class RestTemplateConfig{
    @Bean
    @LoadBalanced //使用@LoadBalanced注解赋予RestTemplate负载均衡的能力
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

五、算法切换

由默认轮询切换为随机算法:

java 复制代码
@Configuration
@LoadBalancerClient(value = "cloud-payment-service",configuration = RestTemplateConfig.class)
public class RestTemplateConfig{
    @Bean
    @LoadBalanced //使用@LoadBalanced注解赋予RestTemplate负载均衡的能力
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

    @Bean
    ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,LoadBalancerClientFactory loadBalancerClientFactory) {
        String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);

        return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);
    }
}
相关推荐
布局呆星6 小时前
SpringBoot 基础入门
java·spring boot·spring
❀͜͡傀儡师10 小时前
Spring AI Alibaba vs. AgentScope:两个阿里AI框架,如何选择?
java·人工智能·spring
亦暖筑序12 小时前
手写 Spring AI Agent:让大模型自主规划任务,ReAct 模式全流程拆解
java·人工智能·spring
希望永不加班16 小时前
SpringBoot 配置绑定:@ConfigurationProperties
java·spring boot·后端·spring
white-persist17 小时前
【vulhub spring CVE-2018-1270】CVE-2018-1270 Spring Messaging 远程命令执行漏洞 完整复现详细分析解释
java·服务器·网络·数据库·后端·python·spring
如来神掌十八式17 小时前
nginx + spring gateway+spring 服务_nginx 转发到 gateway
nginx·spring·gateway
xiaoye370817 小时前
Spring Bean 生命周期四大阶段详细梳理
spring
星辰_mya18 小时前
Spring Cloud服务熔断与降级
后端·spring·spring cloud
海兰19 小时前
使用 Spring AI 打造企业级 RAG 知识库第一部分:核心基础
java·人工智能·spring