Ribbon

一、概述

​ Ribbon是Netflix公司提供的一个基于HTTP和TCP的客户端负载均衡工具

​ Eureka中自带Ribbon了!

​ Ribbon主要有两个功能

  1. 简化远程调用

  2. 负载均衡

    客户端负载均衡:
    • 负载均衡算法在服务端
    • 由负载均衡器维护服务地址列表

在这里插入图片描述

服务端负载均衡:
  • 负载均衡算法在客户端
  • 客户端维护服务地址列表

在这里插入图片描述

二、入门案例:

简化远程调用:

步骤:

使用 Ribbon 简化restTemplate调用
1. 在声明restTemplate的Bean时候,添加一个注解:@LoadBalanced
2. 在使用restTemplate发起请求时,需要定义url时,host:port可以替换为 服务提供方的 应用名称
  1. 在config类中的@Bean上再加一个注解@LoadBalanced

  2. 在调用的时候直接使用服务名

    String url="http://EUREKA-PROVIDE/goods/findOne/"+id;
    Goods goods = restTemplate.getForObject(url, Goods.class);
    
  3. 重启,访问下就能看到效果了!

负载均衡:

在provider中加上几行代码,显示调用的端口号

@Autowired
private GoodsService goodsService;
@Value("${server.port}")
private Integer port;
@RequestMapping("/findOne/{id}")
public Goods findOne(@PathVariable Integer id){
    Goods goods = goodsService.findOne(id);
    goods.setTitle(goods.getTitle()+":"+port);//将端口号,设置到了 商品标题上
    return goods;
}

结果显示8001和8002交替显示,显然是轮询!

Ribbon负载均衡策略:

  • 随机 :RandomRule
  • 轮询 :RoundRobinRule(默认的负载均衡策略)
  • 最小并发:BestAvailableRule(服务A-1,服务A-2,服务A-3,这三个服务中谁最闲一般认为是性能高)
  • 过滤:AvailabilityFilteringRule(坏的服务过滤掉)
  • 响应时间:WeightedResponseTimeRule(发送一个数据包到三个服务中,看谁最先响应,谁快就调用谁)
    • 轮询重试:RetryRule(默认轮询10次,如果节点出现问题,会去找第二个,如果轮询到10次都挂了那就响应失败)
  • 性能可用性:ZoneAvoidanceRule(综合考虑性能和可用性,看谁分数高就用谁)

在这里插入图片描述

负载均衡配置:

Ribbon默认的负载均衡策略是轮询,如果机器性能差不多,用轮询比较合适。

设置负载均衡策略:两种方法:

  1. JAVA编码的方式
    • 创建一个配置类

      @Configuration
      public class MyRule {
          @Bean
          public IRule rule(){
              return new RandomRule();
          }
      }
      

      注意:这个new RandomRule()可以改成其他IRule接口的实现类

在这里插入图片描述

  • 在项目启动类上加上这个注解,指定服务名和规则配置类

    /*
        配置Ribbon的负载均衡策略 name
        * name:设置 服务提供方的 应用名称
        * configuration:设置负载均衡Bean
     */
    @RibbonClient(name = "EUREKA-PROVIDE",configuration = MyRule.class)
    
  1. 配置文件的方式

    在application.yml中指定服务的负载均衡策略:

    # 配置的方式设置Ribbon的负载均衡策略
    EUREKA-PROVIDER: # 设置的服务提供方的 应用名称
      ribbon:
        NFloadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 策略类(全路径名)
    

置的服务提供方的 应用名称

ribbon:
       NFloadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 策略类(全路径名)

在这里插入图片描述

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐