02、SpringCloud 系列:Ribbon - 负载均衡

SpringCloud 系列列表:

文章名文章地址
01、Eureka - 集群、服务发现https://blog.csdn.net/qq_46023503/article/details/128319023
02、Ribbon - 负载均衡https://blog.csdn.net/qq_46023503/article/details/128332288
03、OpenFeign - 远程调用https://blog.csdn.net/qq_46023503/article/details/128387961
04、Hystrix - 断路器https://blog.csdn.net/qq_46023503/article/details/128408601
05、Sleuth - 链路追踪https://blog.csdn.net/qq_46023503/article/details/128409339
06、Gateway - 网关https://blog.csdn.net/qq_46023503/article/details/128430842
07、Alibaba - 介绍https://blog.csdn.net/qq_46023503/article/details/128434080
08、Nacos - 安装、启动https://blog.csdn.net/qq_46023503/article/details/128460411
09、Nacos - 配置文件中心https://blog.csdn.net/qq_46023503/article/details/128460649
10、Nacos - 注册中心https://blog.csdn.net/qq_46023503/article/details/128460494

1 概述

Spring Cloud Ribbon 是一个基于 HTTP 和 TCP 的客户端负载均衡工具,它基于 Netflix Ribbon 实现。通过 Spring Cloud 的封装,可以让我们轻松地将面向服务的 REST 模版请求 自动转换成客户端负载均衡的服务调用。 轮询 hash 权重 …
简单的说 Ribbon 就是 netfix 公司的一个开源项目,主要功能是提供客户端负载均衡算法和服务调用。Ribbon 客户端组件提供了一套完善的配置项,比如连接超时,重试等。 在 Spring Cloud 构建的微服务系统中, Ribbon 作为服务消费者的负载均衡器,有两种使 用方式,一种是和 RestTemplate 相结合,另一种是和 OpenFeign 相结合

2 负载均衡

英文名称为 Load Balance(LB)http://,lb://(负载均衡协议) ,其含义是指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行,例如 Web 服务器、 企业核心应用服务器和其它主要任务服务器等,从而协同完成工作任务。 负载均衡构建在原有网络结构之上,它提供了一种透明且廉价有效的方法扩展服务器和网络设备的带宽、加强网络数据处理能力、增加吞吐量、提高网络的可用性和灵活性

3 Ribbon 快速入门

3.1 调用设计图

在这里插入图片描述

3.2 项目搭建

  • 注意:consumer 和 provider-1 和 provider-2 都是 eureka-client
  • 注意:provider-1 和 provider-2 的 spring.application.name=provider(名字相同即可)

1、搭建一个 eureka-server
不会的话,先看 eureka 篇:地址在此

2、搭建 provider-1 和 provider-2

  • SpringBoot 的依赖为 Spring Web 和 Eureka Discover Client
  • 启动类添加上 @EnableEurekaClient
#application.yml文件
server:
  port: 8011 #两个端口不能一样
spring:
  application:
    name: provider #两个名字必须要一样
eureka:
  client:
    service-url:
      defaultZone: http://peer1:8761/eureka #注册到 eureka 服务上去
#两个 provider 的控制层方法,为负载均衡所访问的方法
@RestController
public class PrivaderController {
    @GetMapping("provider")
    public String provider(){
        System.out.println("provider1 里面的方法");
        return "provider1";
    }
}

**3、搭建 consumer **

< !--SpringBoot 的依赖为 Spring Web 和 Eureka Discover Client,还有ribbon-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
    <version>2.2.9.RELEASE</version>
</dependency>
#application.yml文件
server:
  port: 8013 #不能和其他的一样
spring:
  application:
    name: consumer #名字任意
eureka:
  client:
    service-url:
      defaultZone: http://peer1:8761/eureka #注册到 eureka 服务上

启动类上添加 RestTemplate Bean,并添加 @EnableEurekaClient

@SpringBootApplication
@EnableEurekaClient
public class RibbonconsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(RibbonconsumerApplication.class, args);
    }
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}
//控制层
@RestController
public class TestController {
    @Autowired
    private RestTemplate restTemplate;
    /**
     * 测试 ribbon 的负载均衡
     */
    @RequestMapping("/testRibbonBalance")
    public String testRibbonBalance(String serviceId) {
        //直接用服务名称替换 ip:port
        String url = "http://" + serviceId + "/provider";
        String forObject = restTemplate.getForObject(url,String.class);
        System.out.println(forObject);
        return forObject;
    }
}

**4、访问 consumer **

  • 访问 http://localhost:8013/testRibbonBalance?serviceId=provider
  • 出现结果:轮询显示 provider1 和 provider2

4 Ribbon 要做什么事情

通过 “http://” + serviceId + “/provider” 负载均衡请求执行成功,需以下几步 :

  1. 拦截该请求
  2. 获取该请求的 URL 地址:http://provider/provider
  3. 截取 URL 地址中的 provider
  4. 从服务列表中找到 key 为 provider 的服务实例的集合(服务发现)
  5. 根据负载均衡算法选出一个符合的实例
  6. 拿到该实例的 host 和 port,重构原来 URL 中的 provider
  7. 真正的发送 restTemplate.getForObject(“http://ip:port/provider”,String.class)

5 Ribbon 负载均衡的算法

5.1 算法

  • RoundRobinRule–轮询 请求次数 % 机器数量
  • RandomRule–随机
  • 权重
  • iphash
  • AvailabilityFilteringRule --会先过滤掉由于多次访问故障处于断路器跳闸状态的服 务,还有并发的连接数量超过阈值的服务,然后对于剩余的服务列表按照轮询的策略进行访问
  • WeightedResponseTimeRule–根据平均响应时间计算所有服务的权重,响应时间越快服 务权重越大被选中的概率越大。刚启动时如果同统计信息不足,则使用轮询的策略,等统计信 息足够会切换到自身规则
  • RetryRule-- 先按照轮询的策略获取服务,如果获取服务失败则在指定的时间内会进行重 试,获取可用的服务
  • BestAvailableRule --会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后 选择一个并发量小的服务
  • ZoneAvoidanceRule – 默认规则,复合判断 Server 所在区域的性能和 Server 的可用 行选择服务器

5.2 修改默认的负载均衡算法

#yml文件修改
provider: #提供者的服务名称,那么访问该服务的时候就会按照自定义的负载均衡算法
 ribbon:
  NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
   #几种算法的全限定类名

6 Robbon 其他属性配置

ribbon: #全局的设置
  eager-load:
    enabled: false # ribbon 一启动不会主动去拉取服务列表,当实际使用时才去拉取 是否立即加载
  http:
    client:
      enabled: false # 在 ribbon 最后要发起 Http 的调用调用,我们认为是 RestTemplate 完成的,其实最后是 HttpURLConnection 来完成的,这里面设置为 true ,可以把 HttpUrlConnection->HttpClient
  okhttp:
    enabled: false #HttpUrlConnection 来完成的,这里面设置为 true ,可以把 HttpUrlConnection->OkHttpClient(也是发 http 请求的,它在移动端的开发用的多)
provider: #提供者的服务名称,那么访问该服务的时候就会按照自定义的负载均衡算法
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
  #修改默认负载均衡算法,几种算法的全限定类名
  # NFLoadBalancerClassName: #loadBalance 策略
  # NFLoadBalancerPingClassName: #ping 机制策略
  # NIWSServerListClassName: #服务列表策略
  # NIWSServerListFilterClassName: #服务列表过滤策略
  #ZonePreferenceServerListFilter 默认是优先过滤非一个区的服务列表
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玄天灵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值