服务调用Ribbon

服务调用Ribbon

一、概念

  • Spring Cloud Ribbon 是 客户端的软件负载均衡算法和服务调用。 Ribbon 客户端就是在配置 文件中 列出 LoadBalancer(简称 LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如 简单轮询、随机连接等)去连接这些机器。

二、负载均衡策略

  • 轮询(默认):***.***flix.loadbalancer.RoundRobinRule
  • 随机:***.***flix.loadbalancer.RandomRule
  • 轮询基础上添加重试: ***.***flix.loadbalancer.RetryRule
  • 轮询基础上权重越大越容易被选择:***.***flix.loadbalancer.WeightedResponseTimeRule
  • 选择并发较小的实例:***.***flix.loadbalancer.BestAvailableRule
  • 过滤掉宕机服务后选择并发较小的:***.***flix.loadbalancer.AvailabilityFilteringRule
  • 过滤掉不在同一时区并且宕机的服务后选择并发较小的:***.***flix.loadbalancer.ZoneAwareLoadBalancer

三、基础代码

  • 赋予RestTemplate负载均衡能力
@Bean
@LoadBalanced //赋予RestTemplate 具有Ribbon负载均衡
public RestTemplate restTemplate() {
    return new RestTemplate();
}
  • 服务发现
@Resource private DiscoveryClient discoveryClient;

@PostConstruct
public void initDiscovery() {
	discoveryClient.getInstances("order"); //根据服务注册名称获取服务信息
}
  • 自定义负载算法
@Bean
public IRule myRule(){ return new RandomRule();}
  • 基本调用
  • ip调用:restTemplate.getForObject(“http://192.168.1.12:8066/api/user/get” + id, User.class)
  • 服务名调用:restTemplate.getForObject(“http://zzx-user/api/user/get” + id, User.class)

四、配置文件

ribbon:
  eager-load:
    enabled: true # 饥饿加载(eager-load)模式
  MaxAutoRetries: 1 # 对当前实例的重试次数
  MaxAutoRetriesNextServer: 2 # 切换实例的重试次数
  ConnectTimeout: 10000 # 连接超时时间
  ReadTimeout: 20000 # 读取数据超时
  #也可以为每个Ribbon客户端设置不同的超时时间, 通过服务名称(order)进行指定:
  order.ribbon.ConnectTimeout=2000
  order.ribbon.ReadTimeout=5000
  ribbon.MaxTotalConnections=500 # 最大连接数
  ribbon.MaxConnectionsPerHost=500# 每个host最大连接数
  # 使用ribbon自带重试,对某一个服务重试
  # order.ribbon.NFLoadBalancerRuleClassName=***.***flix.loadbalancer.RetryRule
  • 使用spring Retry 重试
    • 引入依赖
    <dependency>
        <groupId>org.springframework.retry</groupId>
        <artifactId>spring-retry</artifactId>
    </dependency>
    
    • 配置yaml
ribbon:
  OkToRetryOnAllOperations: true #对超时请求启用重试机制
  MaxAutoRetriesNextServer: 1 #切换重试实例的最大个数
  MaxAutoRetries: 1 # 切换实例后重试最大次数
  NFLoadBalancerRuleClassName: ***.***flix.loadbalancer.RoundRobinRule  #可以自定义轮询方法

五、原理解析

  • @LoadBalanced原理
    • 容器初始化的时候,如果检测到被@LoadBalanced注解,Spring会为其设置LoadBalancerInterceptor的拦截器。
    • LoadBalancerInterceptor是ClientHttpRequestInterceptor的实现类。
    • RestTemplate发送的请求会被ClientHttpRequestInterceptor拦截。
    • 调用intercept方法最终交给loadBalancer执行
  • 获取服务实例列表:调度的时候,会通过ServerList接口获取可用服务(配置文件或者注册中心)
    • {service-name}.ribbon.NIWSServerListClassName对某一个服务进行设置,默认注册中心
      • ***.***flix.loadbalancer.ConfigurationBasedServerList //配置文件
      • ***.***flix.loadbalancer.DiscoveryEnabledNIWSServerList //注册中心
  • 动态更新服务实例列表:{service-name}.ribbon.ServerListUpdaterClassName
    • 定时拉取:***.***flix.loadbalancer.PollingServerListUpdater(定时时间,频率配置略)
    • 事件通知:***.***flix.niws.loadbalancer.EurekaNotificationServerListUpdater
  • 对服务进行心跳检测:Ribbon默认采用了串行的方式进行检测,Pinger会定时通过PingerStrategy获取更新的服务实例,并调用监听者
  • 负载均衡调度器:ILoadBalancer需要使用某个策略从集合中选择一个服务实例, 而策略的抽象接口为IRule
    • 轮询原理:rest接口请求次数%服务器集群数 = 实际调用服务的位置坐标,重启服务,默认请求从服务器1的位置开始
    • 轮询源码刨析
    ***.***flix.loadbalancer.RoundRobinRule(choose方法)
    List<Server> reachableServers = lb.getReachableServers();//获取当前所有可用的服务
    List<Server> allServers = lb.getAllServers(); //获取所有服务
    int nextServerIndex = incrementAndGetModulo(serverCount); //获取下一个服务的位置坐标
    server = allServers.get(nextServerIndex);//获取服务
    如果服务可用,则返回服务 
    
转载请说明出处内容投诉
CSS教程网 » 服务调用Ribbon

发表评论

欢迎 访客 发表评论

一个令你着迷的主题!

查看演示 官网购买