Spring Cloud - Ribbon

Ribbon相关接口:

参考:org.springframework.cloud.netflix.ribbon.RibbonClientConfiguration

IClientConfig: Ribbon的客户端配置,默认采用DefaultClientConfigImpl实现。

IRule: Ribbon的负载均衡策略,默认采用ZoneAvoidanceRule实现,该策略能够在多区域环境下选出最佳的实例进行访问。

IPing:Ribbon的实例检查策略,默认采用DummyPing实现。该检查策略是一个特殊的实现。实际上它并不会检查实例是否可用,而是使用返回true,默认为所有服务实例都是可用的。

ServiceList:服务实例维护的清单机制,默认采用ConfigurationBasedServerList实现。

ServerListFilter:服务实例清单过滤机制,默认采用ZonePreferenceListFilter,该策略能够优先过滤出与请求放处于同一区域的服务实例。

ILoadBalancer:负载均衡器,默认采用ZoneAwareLoadBalancer实现,它具备了区域感知的能力。

 

 

 Ribbon负载均衡策略:

 

 

 1. RandomRule:随机选择一个Server。

2. RetryRule:对选定的负载均衡策略机上重试机制,在一个配置时间段内选择server不成功,则一直尝试使用subRule的方式选择一个可用的Server。

3. RoundRobinRule:轮询选择,轮询index,选择index对应位置的server。

4. AvaliabilityFilteringRule:过滤掉一直连接失败的被标记为circu tripped的后端server,并过滤掉那些高并发的后端server或者使用一个availabilityPredicate 来包含过滤server的逻辑,其实就是检查status里记录的各个server的运行状态。

5. BestAvailableRule:选择一个最小的并发请求server,逐个考察server,如果server被tripped了,则跳过。

6. WeightedResponseTimeRule:根据响应时间加权,响应时间越长,权重越小,被选中的可能性越低。

7. ZoneAvoidanceRule:默认的负载均衡策略,即复合判断Server所在区域的性能和Server的可用性选择Server,在没有区域的环境下,类似于轮询。

8. NacosRule:同集群优先调用。

如果不想全局配置负载均衡策略,只想针对特定服务使用特定的负载均衡策略,该怎么做?

 

 

 

 自定义负载均衡策略 

通过实现 IRule 接口可以自定义负载策略,主要的选择服务逻辑在 choose 方法中。 

1)实现基于Nacos权重的负载均衡策略 

@Slf4j
public class NacosRandomWithWeightRule extends AbstractLoadBalancerRule {

    @Autowired
    private NacosDiscoveryProperties nacosDiscoveryProperties;

    @Override
    public Server choose(Object key) {
        DynamicServerListLoadBalancer loadBalancer = (DynamicServerListLoadBalancer) getLoadBalancer();
        String serviceName = loadBalancer.getName();
        NamingService namingService = nacosDiscoveryProperties.namingServiceInstance();
        try {
            //nacos基于权重的算法
            Instance instance = namingService.selectOneHealthyInstance(serviceName);
            return new NacosServer(instance);
        } catch (NacosException e) {
            log.error("获取服务实例异常:{}", e.getMessage());
            e.printStackTrace();
        }
        return null;
    }
    @Override
    public void initWithNiwsConfig(IClientConfig clientConfig) {

    }
}

饥饿加载

在进行服务调用的时候,如果网络情况不好,第一次调用会超时。
开启饥饿加载,解决第一次调用慢的问题.
ribbon:
  eager-load:
    # 开启ribbon饥饿加载
    enabled: true
    # 配置mall-order使用ribbon饥饿加载,多个使用逗号分隔
    clients: mall-order

 

posted @ 2022-12-06 15:34  君莫笑我十年游  阅读(25)  评论(0编辑  收藏  举报