风止雨歇

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

 

posted on 2020-11-25 19:13  风止雨歇  阅读(1167)  评论(0编辑  收藏  举报

导航