使用LoadBalancer替换Ribbon负载均衡器
SpringCloud LoadBalancer是SpringCloud官方自己提供的客户端负载均衡器,用来替代Ribbon的。因为netfilx停更了,所以SpringCloud官方就自己开发了一块客户端负载均衡器这边用来替代Ribbon。但是目前是没有办法去替代Ribbon的。因为它目前的负载均衡算法还很少。
SpringCloud在早期是把Ribbon当做它的负载均衡器,在SpringCloud2021版的时候就移除了Ribbon,改用Loadbalancer为默认的负载均衡器
RestTemplate整合LoadBalancer
- 剔除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(); } }