使用LoadBalancer替换Ribbon负载均衡器

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

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

RestTemplate整合LoadBalancer

  1. 剔除ribbon依赖,引入LoadBalancer的依赖 <dependencies> <!--nacos的服务注册与发现依赖--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <!-- 剔除ribbon的依赖 --> <exclusions> <exclusion> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </exclusion> </exclusions> </dependency> <!-- 引入SpringCloud LoadBalancer的依赖,注意首先需要在父maven项目中引入SpringCloud的版本管理器 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-loadbalancer</artifactId> </dependency> </dependencies> 在引入SpringCloud LoadBalancer的依赖之前,需要在父maven项目中引入SpringCloud的版本管理器,最好不要自己直接指定版本,不然可能会造成版本冲突。 <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring.cloud.version}</version> <type>pom</type> <scope>import</scope> </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的方式差不多,只不过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();
    }
}
经验分享 程序员 微信小程序 职场和发展