使用LoadBalancer替换Ribbon负载均衡器

SpringCloud LoadBalancer是SpringCloud官方自己提供的客户端负载均衡器,用来替代Ribbon的。因为netfilx停更了,所以SpringCloud官方就自己开发了一块客户端负载均衡器这边用来替代Ribbon。但是目前是没有办法去替代Ribbon的。因为它目前的负载均衡算法还很少。

SpringCloud在早期是把Ribbon当做它的负载均衡器,在SpringCloud2021版的时候就移除了Ribbon,改用Loadbalancer为默认的负载均衡器

RestTemplate整合LoadBalancer

  1. 剔除ribbon依赖,引入LoadBalancer的依赖

    <dependencies>
        
        <dependency>
            <groupId>com.alibaba.cloudgroupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
            
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.cloudgroupId>
                    <artifactId>spring-cloud-starter-netflix-ribbonartifactId>
                exclusion>
            exclusions>
        dependency>
    
        
        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-loadbalancerartifactId>
        dependency>
    dependencies>
    

    在引入SpringCloud LoadBalancer的依赖之前,需要在父maven项目中引入SpringCloud的版本管理器,最好不要自己直接指定版本,不然可能会造成版本冲突。

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-dependenciesartifactId>
                <version>${spring.cloud.version}version>
                <type>pomtype>
                <scope>importscope>
            dependency>
        dependencies>
    dependencyManagement>
    

还需要把SpringCloud中的ribbon禁用掉,因为早期SpringCloud是没有负载均衡器的标准的,它把ribbon当做它的标准,所以之前版本的SpringCloud默认使用的负载均衡器ribbon,我们现在就需要禁用掉。 好像2021年版本的SpringCloud没有使用ribbon了

spring:
  cloud:
    loadbalancer:
      ribbon:
        enabled: false

spring.cloud.loadbalancer.ribbon.enable设置为false

最后还需要在RestTemplate的配置类中加@LoadBalanced注解,这个注解ribbon也一样需要加

@Configuration
public class RestConfig {

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(RestTemplateBuilder builder){
        RestTemplate restTemplate = builder.build();
        return restTemplate;
    }
}

现在就可以使用RestTemplate来进行测试调用服务了,LoadBalancer它默认的负载均衡器是RoundRobinLoadBalancer轮询。

使用LoadBalancer替换Ribbon负载均衡器_第1张图片

如果要替换LoadBalancer默认的负载均衡机制其实和修改Ribbon的方式差不多,只不过Ribbon是往容器中添加一个IRule的对象,而LoadBalancer是往容器中添加ReactorLoadBalancer接口类型的对象,如下官网中的案例

public class CustomLoadBalancerConfiguration {

    @Bean
    ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,
            LoadBalancerClientFactory loadBalancerClientFactory) {
        String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
        return new RandomLoadBalancer(loadBalancerClientFactory
                .getLazyProvider(name, ServiceInstanceListSupplier.class),
                name);
    }
}

然后在配置类或者主启动类中使用@LoadBalancerClient注释

@Configuration
@LoadBalancerClients({
  @LoadBalancerClient(value = "stores", configuration = StoresLoadBalancerClientConfiguration.class),    	      	@LoadBalancerClient(value = "aaa", configuration = CustomersLoadBalancerClientConfiguration.class)
})
public class MyConfiguration {

    @Bean
    @LoadBalanced
    public WebClient.Builder loadBalancedWebClientBuilder() {
        return WebClient.builder();
    }
}

你可能感兴趣的:(springcloud,ribbon,负载均衡,java)