首页 > 其他分享 >Spring Cloud - Ribbon

Spring Cloud - Ribbon

时间:2022-12-06 15:46:14浏览次数:36  
标签:负载 策略 Spring server 实例 Ribbon Server Cloud

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

 

标签:负载,策略,Spring,server,实例,Ribbon,Server,Cloud
From: https://www.cnblogs.com/zhf123/p/16955461.html

相关文章

  • SpringBoot中@Async异步的使用及异步与同步的区别
    简介在开发过程中,异步是提升系统并发能力的一个重要利器。而spring中的@Async异步注解,使我们能够非常方便地实现方法地异步调用。接下来主要结合以下几个问题来讲述j......
  • spring控制事务回滚:TransactionAspectSupport.currentTransactionStatus().setRollbac
    spring事务控制手动回滚:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();1、说明事务是我们开发过程中经常会使用到的,为了在业务执行过程中出......
  • Spring IOC
    SpringIOC介绍介绍引用于https://baijiahao.baidu.com/s?id=1712887849553755889&wfr=spider&for=pcIOC全称是InversionofControl,控制反转。它是一种设计思想,由......
  • Spring 概述-入门案列
    Spring概述-入门案列介绍Spring是轻量级的开源的JavaEE框架Spring可以解决企业应用开发的复杂性Spring有两个核心部分:IOC和AOP(1)IOC:控制反转,把创建对象......
  • Springboot优雅进行字段检验
    Springboot优雅进行字段检验1、ControllerVSService推荐与业务无关的放在controller层中进行校验,而与业务相关的放在service层中校验。2、常用校验工具类使用Hiberna......
  • springboot2 搭建日志收集系统存入mongodb + redis+mq+线程池+xxljobs
    我们看到了高效批量插入mongodb速度还不错,那么我们的系统日志收集怎么做呢。当然当前文件日志收集效果也不错,比如前面博文写的elkf搭建日志收集系统。但我们系统中总是有......
  • springboot2 mongodb 高效批量入库--环境搭建
    当今使用微服务越来越多,每个服务都需要记录日志,那么记录到mysql中已完全不合适了。那么就记录到mongo中吧。想要速度快,那么一定要使用批量保存,做过尝试入库10万数据,逐条插......
  • Spring用XML方式使用事务
    项目开始前需要新建数据库(数据库使用mysql8.0以上的版本)#创建数据库CREATEdatabaseuserdb;#创建数据表CREATETABLEuserdb.t_account(idintNOTNULL,usernamev......
  • SpringBoot整合Netty+WebSocket
    SpringBoot整合Netty+WebSocket构建环境pom.xml<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w......
  • SpringBoot 接口并发限制(Semaphore)
    可以使用JMeter辅助测试https://blog.csdn.net/weixin_45014379/article/details/124190381@RestController@RequestMapping({"/Test"})publicclasstest{L......