Spring Cloud 负载均衡-Ribbon
博客专区 > jurson86 的博客 > 博客详情
Spring Cloud 负载均衡-Ribbon
jurson86 发表于4个月前
Spring Cloud 负载均衡-Ribbon
  • 发表于 4个月前
  • 阅读 50
  • 收藏 2
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

一、 什么是负载均衡 

负载均衡就是分发请求流量到不同的服务器。 
 
负载均衡一般分为两种: 
1、 服务器端负载均衡(nginx) 

 

2、 客户端负载均衡(Ribbon) 

 

 通过Ribbon 进行负载均衡调用 

1、 在 RestTemplate 中添加注解 @LoadBalanced 
2、 修改调用的 URL=http://{spring-cloud-provider}/api/user/{id} 
注意:控制台的应用名字为大写,我们统一为小写,更不能大小写都存在。 

使用RestTemplate进行调用,所以要先定义这个Bean 

@LoadBalanced 
@Bean 
  protected RestTemplate restTemplate() { 
    return new RestTemplate(); 
  } 

 

1、 Ribbon 通过@LoadBalanced 进行负载均衡。 
2、 默认的负载策略是轮询算法。 

 

Ribbon 的负载均衡策略 

一、  内置负载均衡策略的介绍 

IRule的实现类 

 
1、  BestAvailableRule:选择一个最小的并发请求的 server,逐个考察 Server,如果Server 被
tripped 了,则忽略。 
2、  AvailabilityFilteringRule:过滤掉那些因为一直连接失败的被标记为 circuit tripped 的后端
server,并过滤掉那些高并发的的后端 server。 
3、  ZoneAvoidanceRule:复合判断 server 所在区域的性能和 server 的可用性选择 server。(使用
ZoneAvoidancePredicate 和AvailabilityPredicate 来判断是否选择某个 server,前一个判断判定
一个 zone 的运行性能是否可用,剔除不可用的 zone 的所有 server,AvailabilityPredicate 用于过
滤掉连接数过多的 Server。) 
4、  RandomRule:随机策略,在index 上随机,选择 index 对应位置的 server。 
5、  RetryRule :对选定的负载均衡策略机上重试机制,在一个配置时间段内当选择 server 不成功,则
一直尝试使用 subRule 的方式选择一个可用的 server。 
6、  RoundRobinRule:轮询策略,轮询 index,选择 index 对应位置的 server(默认策略) 
7、  WeightedResponseTimeRule:权重策略(基于轮询策略,根据响应时间分配一个 weight(权重),响
应时间越长,weight 越小,被选中的可能性越低) 
8、  ResponseTimeWeightedRule:作用同 WeightedResponseTimeRule,二者作用是一样的,
ResponseTimeWeightedRule 后来改名为 WeightedResponseTimeRule 

 

 
二、  负载均衡的自定义 

1、 通过代码实现 

import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import com.netflix.loadbalancer.IRule; 
import com.netflix.loadbalancer.RandomRule; 
/** 
 * 随机算法 
 */ 
//@Configuration  //加上@Configuration 注解会导致所有的策略都被覆盖。
public class RandomRuleConfig { 
  @Bean   
  public IRule randomRule() { 
    return new RandomRule(); 
  } 
} 
 
import org.springframework.context.annotation.Bean; 
import com.netflix.loadbalancer.IRule; 
import com.netflix.loadbalancer.RoundRobinRule; 


/** 
 * 轮询算法 
 */ 
// @Configuration //加上@Configuration 注解会导致所有的策略都被覆盖。
public class RoundRobinRuleConfig { 
  @Bean 
  public IRule roundRobinRule() { 
    return new RoundRobinRule(); 
  } 
} 

 

配置类: 随机算法 

 
import org.springframework.cloud.netflix.ribbon.RibbonClient; 
import org.springframework.context.annotation.Configuration; 
 
@Configuration 
@RibbonClient(name = "spring-cloud-provider", configuration = RandomRuleConfig.class) 
public class ProviderConfiguration { 
 
} 

说明:只需要简单的 2 个配置,就可以指定轮询的算法。 
注意:在 RandomRuleConfig 的类里面,加上@Configuration 注解会导致所有的策略都被覆盖。 
原因:如果 RandomRuleConfig 被 SpringContext 扫描,否则会被@RibbonClients 共用,会覆盖。 

2、 通过配置文件实现 

配置文件添加: 
说明:格式为:应用名.ribbon.NFLoadBalancerRuleClassName=xxx 

#设置策略 
#随机算法
spring-cloud-provider.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule 
#轮训算法
spring-cloud-provider2.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RoundRobinRule

 

三、Ribbon负载均衡策略进行扩展 

 

当内置的负载均衡策略不满足业务需求的时候,我们就需要自定义 Ribbon 的负载策略。 

 
一、  继承 AbstractLoadBalancerRule 类

import java.util.List; 
 
import com.netflix.client.config.IClientConfig; 
import com.netflix.loadbalancer.AbstractLoadBalancerRule; 
import com.netflix.loadbalancer.ILoadBalancer; 
import com.netflix.loadbalancer.Server; 
 
/** 
 * 自定义 Ribbon 的负载均衡策略 
 *  
 */ 
public class GusCustomRule extends AbstractLoadBalancerRule { 
   private Server choose(ILoadBalancer lb, Object key) { 
    if (lb == null) { 
      return null; 
    } 
    Server server = null; 
    while (server == null) { 
      if (Thread.interrupted()) { 
        return null; 
      } 
 
      List<Server> upList = lb.getReachableServers(); // 可用的服务实例 
 
      // 只获取端口为:7779 的服务实例 
      for (Server s : upList) { 
        if (s.getPort() == 7779) { 
          server = s; 
        } 
      } 
      if (server == null) { 
        Thread.yield(); 
        continue; 
      } 
 
      System.out.println("实例IP:" + server.getHost() + " 端口:" + server.getPort()); 
 
      if (server.isAlive()) { 
        return (server); 
      } 
      server = null; 
      Thread.yield(); 
    } 
 
    return server; 
  } 
 
  @Override 
  public Server choose(Object key) { 
    return choose(getLoadBalancer(), key); 
 
  } 
  @Override 
  public void initWithNiwsConfig(IClientConfig clientConfig) { 
    // TODO Auto-generated method stub 
  } 
 
} 
 

 

二、  配置策略 

# 通过配置文件 
spring-cloud-provider.ribbon.NFLoadBalancerRuleClassName=com.hlian.education.configuration.GusCustomRule 

 

 

 

 

 

 

 

 

标签: Spring Cloud
共有 人打赏支持
粉丝 0
博文 13
码字总数 120215
评论 (0)
×
jurson86
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: