什么是Ribbon?
Ribbon 是 Netflix 开源的一个基于 HTTP 和 TCP 的客户端负载均衡器,被广泛用于微服务架构中的服务调用。它通过在客户端内部实现负载均衡算法,将请求按照一定的策略分发给多个服务提供者,以实现请求的高可用和均衡分配。
Ribbon 的主要特点和功能包括:
-
负载均衡:Ribbon 可以根据一定的负载均衡策略,将请求分发给多个服务提供者。它支持的负载均衡算法包括随机、轮询、权重等,可以根据应用场景和需求进行配置。
-
服务发现:Ribbon 可以与注册中心(如 Eureka、Consul 等)集成,从注册中心获取可用的服务实例列表,以便进行负载均衡。
-
容错处理:Ribbon 具备容错处理的能力,当某个服务提供者不可用时,它会自动切换到其他可用的服务提供者。同时,Ribbon 还支持超时设置与重试,以提升系统的可靠性和容错能力。
-
自定义配置:Ribbon 提供了丰富的配置项,可以进行负载均衡和容错策略的配置,包括超时设置、重试次数、连接池大小等。
一、负载均衡策略
1.轮询策略
轮询策略:RoundRobinRule,按照一定的顺序依次调用服务实例。比如一共有 3 个服务,第一次调用服务 1,第二次调用服务 2,第三次调用服务3,依次类推。此策略的配置设置如下:
2.权重策略
权重策略:WeightedResponseTimeRule,根据每个服务提供者的响应时间分配一个权重,响应时间越长,权重越小,被选中的可能性也就越低。它的实现原理是,刚开始使用轮询策略并开启一个计时器,每一段时间收集一次所有服务提供者的平均响应时间,然后再给每个服务提供者附上一个权重,权重越高被选中的概率也越大。此策略的配置设置如下:
3.随机策略
随机策略:RandomRule,从服务提供者的列表中随机选择一个服务实例。此策略的配置设置如下:
4.最小连接数策略
最小连接数策略:BestAvailableRule,也叫最小并发数策略,它是遍历服务提供者列表,选取连接数最小的⼀个服务实例。如果有相同的最小连接数,那么会调用轮询策略进行选取。此策略的配置设置如下:
5.重试策略
重试策略:RetryRule,按照轮询策略来获取服务,如果获取的服务实例为 null 或已经失效,则在指定的时间之内不断地进行重试来获取服务,如果超过指定时间依然没获取到服务实例则返回 null。此策略的配置设置如下:
6.可用性敏感策略
可用敏感性策略:AvailabilityFilteringRule,先过滤掉非健康的服务实例,然后再选择连接数较小的服务实例。此策略的配置设置如下:
7.区域敏感策略
区域敏感策略:ZoneAvoidanceRule,根据服务所在区域(zone)的性能和服务的可用性来选择服务实例,在没有区域的环境下,该策略和轮询策略类似。此策略的配置设置如下:
二、配置方式
-
Bean配置
@Configuration public class Ribbonconfig { @Bean public IRule iRule (){ //对应上面的负载均衡策略 return new RandomRule(); } }
@SpringBootApplication @RibbonClients(defaultConfiguration = Ribbonconfig.class) public class ApplicationLoader { public static void main(String[] args) { SpringApplication application = new SpringApplication(ApplicationLoader.class); application.run(args); } @LoadBalanced @Bean public RestTemplate restTemplate() { return new RestTemplate(); } }
-
配置文件配置
server: port: 9002 spring: application: name: stock-nacos cloud: nacos: discovery: server-addr: 127.0.0.1:9100 config: import: - nacos:nacos-config-example.properties?refresh=true order-nacos: //被调用服务 ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule //负载均衡类
三、自定义Ribbon
import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.Server;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;
public class CustomRule extends AbstractLoadBalancerRule {
@Override
public void initWithNiwsConfig(IClientConfig iClientConfig) {
}
@Override
public Server choose(Object o) {
//获取当前的负载均衡器
ILoadBalancer loadBalancer = this.getLoadBalancer();
//获取所有可达的服务器列表
List<Server> reachableServers = loadBalancer.getReachableServers();
//随机生成一个在可达服务器列表大小范围内的整数
int i = ThreadLocalRandom.current().nextInt(reachableServers.size());
//根据随机生成的整数,从可达服务器列表中选择一个服务器。
Server server = reachableServers.get(i);
//返回选中的服务器
return server;
}
}
四、配置懒加载
ribbon:
eager-load:
enabled: true //开启懒加载
clients: order-nacos //被调用服务
懒加载解决了什么问题?
Ribbon 懒加载是一种优化技术,用于解决在应用程序启动时,同时初始化所有 Ribbon 客户端可能导致的性能问题。
当应用程序中配置了多个 Ribbon 客户端时,每个客户端在初始化时都会创建一组实例,这些实例会预先连接到服务提供者。如果所有的客户端都同时初始化,可能会导致大量的线程和连接同时被创建,从而导致资源浪费和性能下降。
使用 Ribbon 的懒加载机制后,Ribbon 客户端在首次请求时才会被初始化。这样可以避免在应用程序启动时一次性创建所有的实例,而是根据请求的实际情况动态地初始化和连接服务提供者。这样能够更好地利用资源,提高应用程序的性能和可伸缩性。
另外,懒加载还可以解决服务注册中心不可用或服务提供者不可用时,无法初始化 Ribbon 客户端的问题。因为当服务注册中心或者服务提供者不可用时,Ribbon 会等待它们可用后再进行初始化,从而避免了在启动时因为依赖不可用而导致应用程序启动失败的情况。