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