前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Ribbon负载均衡

Ribbon负载均衡

作者头像
别团等shy哥发育
发布2023-02-25 15:46:10
3470
发布2023-02-25 15:46:10
举报
文章被收录于专栏:全栈开发那些事

文章目录

1、Ribbon基础知识

  Ribbon是Netflix客户端的负载均衡器,可对HTTP和TCP客户端的行为进行控制。为Ribbon配置服务器提供者地址后,Ribbon就可以基于某种负载均衡算法自动帮助服务消费者去请求。Ribbon默认为我们提供了很多负载均衡算法,例如轮询、随机等。当然,也可以为Ribbon实现自定义的负载均衡算法。关于详细的负载均衡算法,请看这篇文章: https://blog.csdn.net/qq_43753724/article/details/119836860?spm=1001.2014.3001.5501   要将Ribbon包含在项目中,请添加如下依赖:

代码语言:javascript
复制
<!--引入ribbon依赖-->
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>

  在Ribbon中有以下几个重要概念:

  • Rule:该组件主要决定从候选服务器中返回哪个服务器地址进行远程调用的操作。
  • Ping:在后台运行的组件,用来确认那些服务器是存货可用的。
  • ServerList:当前可以用作LB的服务器列表,该列表可以是静态的,也可是动态的。如果是动态列表(例如从Eureka服务器获取),就会有一个后台线程按照时间间隔刷新列表。

  Ribbon提供了以下几种Rule:

  • RoundRobinRule:最简单的规则,会在ServerList中依次轮询调用。
  • RandomRule:随机。
  • AvailabilityFilteringRule:在这种规则下Ribbon集成了Hystrix的功能,默认情况下调用某个远程方法失败3次后断路器的开关会被打开,而之后的请求中Ribbon会跳过这个服务器地址,直到30秒之后断路器关闭后才会重新加如调用列表。
  • WeightedResponseTimeRule:将响应时间作为权重的负载规则,某个服务器的响应时间越长,它的权重就越低。具体选择服务器时,结合权重进行随机选择。
  • RetryRule:按照RoundRobinRule(轮询)策略获取服务,如果获取服务失败,就在指定时间内重试,获取可用的服务。
  • BestAvailableRule:先过滤掉由于多次访问故障而处于段力气跳闸状态的服务,然后选择一个并发量最小的服务。
  • ZoneAvoidanceRule:复合判断Server所在区域的性能和Server的可用性选择服务器。

2、Ribbon服务调用

2.1 项目中引入依赖

代码语言:javascript
复制
<!--引入ribbon依赖-->
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>

说明: 1.如果使用的是eureka client 和 consul client,无须引入依赖,因为在eureka,consul中默认集成了ribbon组件 2.如果使用的client中没有ribbon依赖需要显式引入上述依赖

2.2 查看consul client中依赖的ribbon

在这里插入图片描述
在这里插入图片描述

2.3 启动consul服务注册中心

在这里插入图片描述
在这里插入图片描述

2.4 将订单服务进行注册

订单服务配置文件:

在这里插入图片描述
在这里插入图片描述

  这里注册两个订单服务(模仿订单服务集群),一个9990端口,一个9999端口   使用**@Value**注解将端口号注入到port变量里面,就可以在别的服务调用的时候在页面上打印出提供服务的服务器节点的端口,方便观察负载均衡的结果。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

访问8500端口即可查看服务注册中心中所注册的订单服务ORDERS

在这里插入图片描述
在这里插入图片描述

2.5 将RestTemplate交给Spring工厂去管理

这样我们就可以在需要使用的地方直接注入了。 BeansConfig.java

代码语言:javascript
复制
package com.baizhi.config;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration  //代表这是一个SpringBoot配置类  spring.xml  工厂  创建对象 bean id class=""
public class BeansConfig {

    //工厂中创建RestTemplate
    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

2.6 使用RestTemplate+ribbon进行服务调用

2.6.1 使用discovery client形式调用

代码语言:javascript
复制
 @Autowired      //服务注册与发现的客户端对象
    private DiscoveryClient discoveryClient;

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("user")
    public String invokeDemo(){
         log.info("user demo...");

        //2、使用Ribbon+RestTemplate实现负载均衡调用 1.DiscoveryClient 2.LoadBalanceClient 3.@LoadBalance
        List<ServiceInstance> serviceInstances = discoveryClient.getInstances("ORDERS");
        serviceInstances.forEach(serviceInstance -> {
            log.info("服务主机:{} 服务端口:{} 服务地址:{}",serviceInstance.getHost(),serviceInstance.getPort(),serviceInstance.getUri());
       });
       String result = new RestTemplate().getForObject(serviceInstances.get(0).getUri() + "/order", String.class);
        return "OK"+result;
    }

在用户服务中调用订单服务:http://localhost:8888/user

在这里插入图片描述
在这里插入图片描述

由于我们使用了(serviceInstances.get(0).getUri(),所以一致使用的是订单服务列表中的第一台节点,即9990端口的节点。可以看到,这里并没有自动帮我们做负载均衡,需要我们自己去做负载均衡的算法。

2.6.2 使用LoadBalancerClient形式调用

代码语言:javascript
复制
@RestController
@Slf4j
public class UserController {

    @Autowired      //服务注册与发现的客户端对象
    private DiscoveryClient discoveryClient;

    @Autowired  //负载均衡客户端对象
    private LoadBalancerClient loadBalancerClient;

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("user")
    public String invokeDemo(){
         log.info("user demo...");
        //3、使用LoadBalancerClient进行服务调用
        ServiceInstance serviceInstance = loadBalancerClient.choose("ORDERS");  //默认轮询
        log.info("服务地址:{} 服务主机:{} 服务端口:{}",serviceInstance.getUri(),serviceInstance.getHost(),serviceInstance.getPort());
        String result = restTemplate.getForObject(serviceInstance.getUri() + "/order", String.class);


        return "OK"+result;
    }
}

这种方式的负载均衡算法默认使用的是轮询方式。即第一次调用9990端口的节点,第二次就调用9999端口的节点,以此类推。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.6.3 使用 @LoadBalanced注解

代码语言:javascript
复制
//工厂中创建RestTemplate
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
代码语言:javascript
复制
@RestController
@Slf4j
public class UserController {

    @Autowired      //服务注册与发现的客户端对象
    private DiscoveryClient discoveryClient;

    @Autowired  //负载均衡客户端对象
    private LoadBalancerClient loadBalancerClient;

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("user")
    public String invokeDemo(){
         log.info("user demo...");
        //4、使用@LoadBalance注解  作用:可以让对象具有ribbon负载均衡特性
     String result = restTemplate.getForObject("http://ORDERS/order", String.class);
        return "OK"+result;
    }
}

默认还是轮询的负载均衡算法,但是由于我们在配置文件中添加了

代码语言:javascript
复制
#修改用户服务调用订单服务默认负载均衡策略不再使用轮询 使用随机策略
ORDERS.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule

所以,现在使用的负载均衡算法是随机法

2.7 修改服务的默认负载均衡策略

格式:

代码语言:javascript
复制
id.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule

下图中的ORDERS为服务的唯一标识。

在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-08-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 1、Ribbon基础知识
  • 2、Ribbon服务调用
    • 2.1 项目中引入依赖
      • 2.2 查看consul client中依赖的ribbon
        • 2.3 启动consul服务注册中心
          • 2.4 将订单服务进行注册
            • 2.5 将RestTemplate交给Spring工厂去管理
              • 2.6 使用RestTemplate+ribbon进行服务调用
                • 2.6.1 使用discovery client形式调用
                  • 2.6.2 使用LoadBalancerClient形式调用
                  • 2.6.3 使用 @LoadBalanced注解
                  • 2.7 修改服务的默认负载均衡策略
              相关产品与服务
              负载均衡
              负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档