Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。它是一个基于HTTP和TCP的客户端负载均衡器。它可以通过在客户端中配置ribbonServerList来设置服务端列表去轮询访问以达到均衡负载的作用。
当Ribbon与Eureka联合使用时,ribbonServerList会被DiscoveryEnabledNIWSServerList重写,扩展成从Eureka注册中心中获取服务实例列表。同时它也会用NIWSDiscoveryPing来取代IPing,它将职责委托给Eureka来确定服务端是否已经启动。
而当Ribbon与Consul联合使用时,ribbonServerList会被ConsulServerList来扩展成从Consul获取服务实例列表。同时由ConsulPing来作为IPing接口的实现。
引入依赖(消费者上)
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
</dependencies>
开启负载
加入以下配置
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
选择负载方式
例:
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
@Bean
public RandomRule randomRule() {
return new RandomRule();
}
七种负载
为对应的ribbon client指定负载策略,还可以定制自己的负载配置
@Configuration
@RibbonClient(name = "community-org", configuration = RandomRule.class)
public class RestTemplateConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
使用属性自定义Ribbon配置
# 配置community-org服务的策略
community-org:
ribbon:
NFLoadBalancerRuleClassName:com.netflix.loadbalancer.RandomRule
# 所有Ribbon Client都使用
ribbon:
NFLoadBalancerRuleClassName:com.netflix.loadbalancer.RandomRule
注意点
Spring Cloud Ribbon 默认使用轮询策略
No Feign Client for loadBalancing defined.错误
SpringCloud 从 2020.0.1 版本之后,客户端负载均衡抛弃了 ribbon
采用 SpringCloud LoadBalancer 默认使用的是轮询负载均衡算法
引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
SpringCloud 的 LoadBalance 仅支持 2 种负载均衡策略:轮询(默认)和随机
轮询
只需要在 RestTemplate 的 Bean 对象上增加 @LoadBalanced 注解