zoukankan      html  css  js  c++  java
  • Ribbon的使用

    参考:https://blog.csdn.net/yuanyuan_gugu/article/details/107336264

    一、Ribbon

    客户端负载均衡组件Ribbon,它是基于 Netflix Ribbon 实现的一套客户端负载均衡的工具;

      Ribbon主要功能是提供客户端的软件负载均衡算法,将Netflix的中间服务连接在一起,Ribbon客户端组件提供一系列完善的配置项,如连接超时,重试等。就是在配置文件中列出Loade Balancer(简称LB)后面的所有机器,Ribbon会自动的帮助基于某种规则(轮询,随机等)去连接这些机器。也可以使用 Ribbon 实现自定义的负载均衡算法

    1、Ribbon组件来实现负载均衡

    (1)maven的坐标引入

    <!‐‐加入nocas‐client‐‐>
    <dependency>
    	<groupId>com.alibaba.cloud</groupId>
    	<artifactId>spring‐cloud‐alibaba‐nacos‐discovery</artifactId>
    </dependency>
    
    <!‐‐加入ribbon‐‐>
    <dependency>
    	<groupId>org.springframework.cloud</groupId>
    	<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
    </dependency>
    

    (2)在 RestTemplate 上加入 @LoadBalanced 注解

    @Configuration
    public class WebConfig {
    
            @LoadBalanced
    	@Bean
    	public RestTemplate restTemplate( ) {
    		return new RestTemplate();
    	}
    }

    2、Ribbon的负载均衡算法及配置

    (1)负载均衡算法

    ① RoundRobinRule:轮询选择,轮询下标,选择下标对应位置的Server;

    ② Random:随机选择Server;

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

    ④ AvailabilityFilteringRule:过滤掉一直连接失败的被标记为 circuit tripped (断路器状态)的后端Server,并过滤掉那些高并发的后端Server或者使用一个AvailabilityPredicate来包含过滤server的逻辑,其实就就是检查status里记录的各个Server的运行状态。对剩下的使用轮询策略去访问。

    ⑤ BestAvailableRule:会先过滤掉由于多次访问故障而处于断路器跳闸状态(tripped)的Server,然后选择一个并发量最小的Server

    ⑥ WeightedResponseTimeRule:根据响应时间加权,响应时间越长,权重越小,被选中的可能性越低;根据平均响应时间计算所有服务的权重,响应时间越快的服务权重越大被选中的概率越大。刚启动时如果统计信息不足,则使用RoundRobinRule(轮询)策略,等统计信息足够,会切换到WeightedResponseTimeRule。

    ⑦ ZoneAvoidanceRule默认):复合判断Server所在Zone的性能和Server的可用性选择Server,在没有Zone的情况下类是轮询。

     (2)负载均衡算法的选择

    方式一:注解方式

    @Configuration
    public class ServerConfig {
    
        @LoadBalanced
        @Bean
        public RestTemplate restTemplate(){
            return new RestTemplate();
        }
    
        @Bean
        public IRule rule() {
            return new RandomRule();
        }
    }

    方式二:配置文件的方式

    格式

    {server-name}:

      ribbon:

            NFLoadBalancerRuleClassName:  负载均衡算法对应的全类名

    例如:当前服务调用 product-center 服务:

    product-center:
      ribbon:
        NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
    

    (3)Ribbon 的细粒度配置

    例如:Order调用Product服务使用随机算法,Order调用 Pay服务使用轮询的算法,这就需要细粒度的配置。

    <1>. 使用注解的方式

    ProductRibbonCofig

    @Configuration
    public class ProductRibbonConfig {
    	@Bean
    	public IRule randomRule() {
    		return new RandomRule();
    	}
    }
    

    PayRibbonConfig

    @Configuration
    public class PayRibbonConfig {
    	@Bean
    	public IRule roundRobinRule() {
    		return new RoundRobinRule();
    	}
    }
    

    注意ProductRibbonCofig 和  PayRibbonConfig 类要放在包扫描不能扫到的位置,否则起不到细粒度配置的作用。

    @Configuration
    @RibbonClients(value = {
    	@RibbonClient(name = "product‐center", configuration = ProductRibbonConfig.class),
    	@RibbonClient(name = "pay‐center", configuration = PayRibbonConfig.class)
     })
    public class CustomRibbonConfig {
     
    }

    <2>. 使用配置文件的方式

    # 全局的负载均衡算法使用ZoneAvoidanceRule
    ribbon:
      NFLoadBalancerRuleClassName: com.netflix.loadbalancer.ZoneAvoidanceRule
    
    # 调用product-center服务使用RandomRule
    product-center:
      ribbon:
        NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
    
    # 调用pay-center服务使用RoundRobinRule
    pay-center:
      ribbon:
    	NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule
    

    说明: 调用product-center服务使用的 Random算法,调用pay-center服务使用 RoundRobinRule 算法,调用其他服务的负载均衡算法使用 ZoneAvoidanceRule。

    推荐使用配置文件的方式定义负载均衡算法。

    (4)解决Ribbon第一次调用耗时高的问题

    开启饥饿加载:

    ribbon:
      eager-load:
        clients: product-center,pay-center
        enabled: true

    Ribbon的常用参数

    # 每一台服务器重试的次数,不包含首次调用的那一次
    ribbon.MaxAutoRetries=1
    
    # 重试的服务器的个数,不包含首次调用的那一台实例
    ribbon.MaxAutoRetriesNextServer=2
    
    # 是否对所以的操作进行重试(True 的话 会对post put操作进行重试,存在服务幂等问题)
    ribbon.OkToRetryOnAllOperations=false
    
    # 建立连接超时
    ribbon.ConnectTimeout=3000
    
    # 读取数据超时
    ribbon.ReadTimeout=3000

    Ribbon的详细配置http://c.biancheng.net/view/5356.html

  • 相关阅读:
    LeetCode-Number of Islands
    LeetCode-Minimum Height Trees
    百度地图采集
    三层自动生成 完整源代码(for oracle)
    在Oracle中更新数据时,抛出:ORA-01008: not all variables bound
    MD5加密 及获得密码盐
    验证:非空、手机号、邮箱
    向Oracle数据库中插入数据出错:ORA-01036 无效的变量名或数据
    反射ORM
    委托事件
  • 原文地址:https://www.cnblogs.com/yufeng218/p/14013573.html
Copyright © 2011-2022 走看看