【微服务笔记05】微服务组件之Ribbon负载均衡器组件介绍及其使用

news2025/1/11 18:44:22

这篇文章,主要介绍微服务组件之Ribbon负载均衡器及其使用。

目录

一、Ribbon负载均衡器

1.1、负载均衡介绍

(1)负载均衡概念

(2)负载均衡分类

(3)Ribbon负载均衡思想

1.2、Ribbon的使用

(1)引入Ribbon依赖

(2)开启Ribbon负载均衡

(3)编写测试类

(4)启动工程测试

1.3、常见的负载均衡策略

(1)如何使用负载均衡策略

(2)自定义负载均衡策略


一、Ribbon负载均衡器

1.1、负载均衡介绍

(1)负载均衡概念

上一篇文章介绍了OpenFeign组件,这个组件主要是用于实现微服务之间的调用,既然微服务之间可以调用了,那么问题又来了,假设在某个时间里面,微服务A的访问请求非常多,导致微服务A无法处理过来,从而导致微服务A宕机,对于这种情况,我们应该专门避免呢???

对于上面这种情况,我们可以这样解决,既然一台微服务A无法处理那么多的请求,那如果是多台微服务A应用程序呢,这样子是不是就可以将请求平均分配到不同的微服务A机器上面,从而减少某一台微服务A的请求处理量,避免服务宕机情况的出现,这里介绍的思想就是:负载均衡。

负载均衡:将HTTP请求按照某个策略,将请求分发到不同的机器上面执行,从而实现服务的高可用,这个过程大致就是负载均衡的思想,如下图所示。

(2)负载均衡分类

负载均衡如果按照软件、硬件来划分,则可以分为下面两种:

  • 硬件负载均衡器:采用硬件来实现负载均衡,常见的设备有:F5、交换机。
  • 软件负载均衡器:采用软件应用程序来实现负载均衡,常见的软件有:nginx。

根据负载均衡分发请求的不同位置,又可以将负载均衡器分为服务端负载均衡、客户端负载均衡,如下:

  • 服务端负载均衡:客户端发送的请求,到达服务端之前,通过采用软件负载均衡器将请求分发到不同的服务器上,这种方式称作:服务端负载均衡。
    • 服务端负载均衡,常见的是:nginx。
  • 客户端负载均衡:在客户端发送请求之前,就已经通过客户端内置的程序,指定当前这次请求应该转发到那一台服务器上,这种方式称作:客户端负载均衡。
    • 客户端负载均衡,常见的是:Ribbon。

这篇文章要介绍Ribbon就是典型的客户端负载均衡器,下面介绍Ribbon实现客户端负载均衡的大致思想。

(3)Ribbon负载均衡思想

在微服务的环境下,服务之间的调用都是通过Eureka注册中心(或者其他的注册中心)来获取到需要调用的服务地址,既然可以获取到服务地址,那是不是就可以在调用微服务之前,通过编写一个算法,选择当前HTTP请求应该选择哪一个服务地址进行调用呢???Ribbon就是实现了这一个算法,这个算法将他称作是:【负载均衡策略】,一个【负载均衡策略】其实就相当于是一种选择调用地址的算法。

  • 1、根据需要调用的微服务名称,找出这个微服务所有可用的地址。
  • 2、默认采用轮询的方式,依次遍历调用所有可用微服务地址。
  • 3、选择可用地址,利用RestTemplate实现服务的调用。

在Ribbon组件中,默认采用的是【轮询】的负载均衡策略,也就是说,将可用服务地址按照顺序一次循环调用,Ribbon中提供了很多中负载均衡策略,后面会具体介绍各种负载均衡策略。

Ribbon负载均衡大致思想如下图所示:

1.2、Ribbon的使用

(1)引入Ribbon依赖

  • Ribbon是Spring Cloud Netflix项目下的子工程,它的依赖是【spring-cloud-starter-netflix-ribbon】。
  • 因为Ribbon需要从eureka注册中心获取可用服务列表,所以还需要引入【spring-cloud-starter-netflix-eureka-client】依赖。
<dependencies>
    <!-- 引入 Web 工程 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- 引入 eureka 服务端依赖 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    <!-- 引入 Ribbon 依赖 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
    </dependency>
</dependencies>

(2)开启Ribbon负载均衡

  • Ribbon负载均衡会作用在所有采用【RestTemplate】方式进行调用的请求上,当我们在注入RestTemplate对象时候,使用了【@LoadBalanced】注解,那么这个时候,对于所有采用RestTemplate调用的请求,都将具有Ribbon负载均衡效果。
package com.gitcode.ribbon.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;

/**
 * @version 1.0.0
 * @Date: 2023/1/11 21:16
 * @Copyright (C) ZhuYouBin
 * @Description:
 */
@Configuration
public class RibbonConfig {
    
    @Bean
    @LoadBalanced // 开启 Ribbon 实现负载均衡
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
    
}

(3)编写测试类

  • 这里我们可以编写三个provider服务提供者,一个consumer服务消费者,然后在服务消费者中使用Ribbon测试负载均衡功能。

  • 服务消费者的调用逻辑如下所示。
package com.gitcode.ribbon.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.Map;

/**
 * @version 1.0.0
 * @Date: 2023/1/11 21:19
 * @Copyright (C) ZhuYouBin
 * @Description:
 */
@RestController
@RequestMapping("/api/ribbon")
public class DemoController {

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/getUserInfo")
    public Map<String, String> getUserInfoByRestTemplate(String username) {
        // 获取微服务的虚拟地址
        String url = "http://service-provider/api/service/provider/getUserInfo";
        // 通过 RestTemplate 调用接口
        return restTemplate.postForObject(url, null, Map.class, username);
    }

}

(4)启动工程测试

  • 依次启动【eureka注册中心】、三个【provider服务提供者】,一个【consumer服务消费者】服务。
  • 打开浏览器,访问【http://localhost:8761/】注册中心,查看服务是否正常注册成功。

  • 上图中说明服务都是注册成功啦,下面浏览器访问【http://localhost:6250/api/ribbon/getUserInfo?username=root】,查看IDEA控制台打印日志。
  • 浏览器一共访问里【六次】接口,控制台打印日志如下。

以上日志说明,Ribbon负载均衡默认采用的【轮询】方式,也就是从第一台服务开始一次处理请求,到第三台服务处理结束了,又会回到第一台服务继续这个循环。

1.3、常见的负载均衡策略

Ribbon提供了多种负载均衡的策略,Ribbon将策略抽象为一个【IRule】接口,这个【IRule】接口的实现类就定义了各种负载均衡器的算法策略,常见的策略有如下这些:

  • 随机策略(Random):采用随机的方式选择服务调用地址。
  • 轮询策略(RoundRobin):按照从头到尾循环选择的方式调用服务地址,默认策略。
  • 加权轮询策略(WeightedResponseTime):一开始某一个服务地址都没有权重,所以默认采用轮询方式调用,当调用每一个服务地址时候,都会记录服务响应时间,Ribbon会根据响应时间给这个服务地址设置一个权重,下一次调用时候会根据权重来选择需要调用哪个地址,响应时间越短,说明这个服务机器性能越好,处理的效率越高,下一次被选中的概率就越大。
  • 重试轮询策略(Retry):默认采用轮询策略,如果选择的服务地址可以则直接调用,服务地址不可用,则循环重试选择可以服务地址。
  • 最小并发策略(BestAvailable):首先将所有不可用的服务去掉,然后从可用服务列表里面获取并发数量最小的地址进行调用,由于一开始还每月并发数量,所以默认先采用轮询策略,一段时间之后,改用最小并发策略。
  • 过滤不可用策略(AvailabilityFiltering):首先将不可用的服务、并发连接数超过阈值的服务全部过滤掉,然后采用轮询的策略选择调用地址。

(1)如何使用负载均衡策略

要使用Ribbon提供的其他负载均衡策略,我们只需要手动注入一个【IRule】对象即可。代码如下所示:

/**
 * 使用Ribbon提供的其他负载均衡策略
 */
@Bean
public IRule ribbonRule() {
    return new RandomRule(); // 这里采用随机策略
}

上面代码会对所有的微服务都采用【随机策略】,如果你想根据不同的微服务来选择不同的负载均衡策略,那么可以在【application.yml】配置文件中单独设置某个微服务的负载均衡策略。

  • 注意:通过【@Bean】注入的方式定义负载均衡策略的优先级更高,所以不要和配置文件的方式一起使用,否则配置文件的策略不生效。
# ribbon 配置
RIBBON-PROVIDER: # 这里就是单独给 RIBBON-PROVIDER 微服务设置 Ribbon 相关配置属性
  ribbon:
    # 指定 Ribbon 的负载均衡策略
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule # 这里采用轮询策略

(2)自定义负载均衡策略

如果Ribbon提供的那几种负载均衡策略都不满足你的需求,那么我们可以自定义负载均衡策略,只需要实现【IRule】接口,重写其中的方法完成负载均衡算法即可。

但是如果直接实现【IRule】接口,那就需要重写接口中的所有方法,这样太麻烦了,所以Ribbon给我们提供了一个抽象类【AbstractLoadBalancerRule 】,我们继承这个类,只需要重写【initWithNiwsConfig()】方法和【choose()】方法即可完成自定义负载均衡策略。

  • 自定义CustomRibbonRule负载均衡策略类。
package com.gitcode.ribbon.config;

import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.Server;

import java.util.List;
import java.util.Random;

/**
 * @version 1.0.0
 * @Date: 2023/1/11 22:36
 * @Copyright (C) ZhuYouBin
 * @Description:
 */
public class CustomRibbonRule extends AbstractLoadBalancerRule {
    @Override
    public void initWithNiwsConfig(IClientConfig iClientConfig) {
    }

    @Override
    public Server choose(Object o) {
        // 从父类中获取负载均衡器对象
        ILoadBalancer lb = getLoadBalancer();
        // 获取所有可以服务
        List<Server> reachableServers = lb.getReachableServers();
        // 随机选择一个服务地址
        Random random = new Random();
        int index = random.nextInt(reachableServers.size() - 1);
        // 返回这个选择服务地址
        return reachableServers.get(index);
    }
}
  • 注册自定义的负载均衡策略。
/**
 * 使用自定义的负载均衡策略
 */
@Bean
public IRule ribbonRule() {
    return new CustomRibbonRule(); // 自定义负载均衡策略
}

到此,微服务组件Ribbon介绍完啦。

综上,这篇文章结束了,主要介绍微服务组件之Ribbon负载均衡器及其使用【源代码】。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/156886.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mybatis一发入魂

文章目录Mybatis官方中文文档一、Mybatis简介二、简单入门使用2.1、在pom.xml中添加依赖2.2、使用xml配置文件2.3、创建接口2.4、创建映射文件2.6、获取sqlsession实例并执行方法三、Mybatis的Xml配置文件3.1、properties属性3.2、settings设置3.3、typeAliases类型别名3.4、en…

试题 基础练习 高精度加法(java)

试题 基础练习 高精度加法提交此题 评测记录 资源限制内存限制&#xff1a;512.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s问题描述输入两个整数a和b&#xff0c;输出这两个整数的和。a和b都不超过100位。算法描述由于a和b…

《架构300讲》学习笔记(151-200)

前言 内容来自B站IT老齐架构300讲内容。 151 Redis发布订阅机制是如何实现的&#xff1f; 152 阿里Seata分布式事务AT、TCC、SAGA、XA模式到底该怎么选&#xff1f; 153 超级实用&#xff01;十分钟掌握Prometheus与Grafana监控SpringBoot应用 154 如何利用Docker快速构建…

Java面试题每日10问(7)

Core Java - OOPs Concepts: final keyword Interview Questions 1. What is the final variable? the final variable is used to restrict the user from updating it.If we initialize the final variable, we can’t change its value.The final variable - which is not…

论文阅读笔记《Multilevel Graph Matching Networks for Deep Graph Similarity Learning》

核心思想 本文提出一种多级图匹配网络&#xff08;MGMN&#xff09;用于图相似性的度量。常见的图相似性网络都是利用图神经网络或其他图嵌入技术将整幅图转化为特征向量&#xff0c;然后计算两个特征向量之间的相似程度。这种做法的缺点在于只关注了图一级的信息交互&#xff…

【随风丶逆风】2022年终总结

前言 又到了一年一度的年终总结了&#xff0c;回顾一年可谓一波三折&#xff0c;感慨良多&#xff0c;最有感触的大概就是疫情带来各种影响吧&#xff0c;经济下行、市场不景气、互联网寒冬。 回顾去年年终规划《【随风丶逆风】2021年终总结》&#xff0c;整体低于预期&#x…

ArcGIS基础实验操作100例--实验83查找点集中最近最远点

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 高级编辑篇--实验83 查找点集中最近最远点 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff0…

1.Linux库详解

Hello&#xff0c;小伙伴们&#xff0c;大家好&#xff01;最近有小伙伴问我程序库相关的问题。程序库的存在很大程度上提高了程序的复用性、可维护性&#xff0c;但是程序库的应用往往对于初学者来说有些摸不清头脑&#xff0c;所以这一期本文从Linux的角度谈谈Linux下的程序库…

数字IC设计、验证、FPGA笔试必会 - Verilog经典习题 (二)异步复位的串联T触发器

数字IC设计、验证、FPGA笔试必会 - Verilog经典习题 &#xff08;二&#xff09;异步复位的串联T触发器 &#x1f508;声明&#xff1a; &#x1f603;博主主页&#xff1a;王_嘻嘻的CSDN博客 &#x1f9e8;未经作者允许&#xff0c;禁止转载 &#x1f511;系列专栏&#xff1a…

算法之拓扑关系

目录 前言&#xff1a; 算法解析 Kahn算法 DFS算法 总结&#xff1a; 参考资料 前言&#xff1a; 如何确定代码源文件的编译依赖关系&#xff1f; 我们知道&#xff0c;一个完整的项目往往会包含很多代码源文件。编译器在编译整个项目的时候&#xff0c;需要按照依赖关…

4-大规模城市场景建模与理解

方向&#xff1a;三维重建 题目&#xff1a;大规模城市场景建模与理解 作者&#xff1a;陈宝权 万国伟 山东大学 关键词&#xff1a;场景重建 场景理解 自动扫描 智能建模 来自&#xff1a;中国计算机学报通讯 12卷 8期 2016.08 期刊&#xff1a;https://github.com/Darr…

在智能家居音箱领域上的音频功放芯片IC

目前&#xff0c;音频功放芯片主要应用于手机、音响、车载、可穿戴设备、计算机设备、智能家居等领域。随着人机交互逐步落地&#xff0c;从应用广度上对音频功放芯片需求完全放开&#xff0c;截止2021年以“智能音箱”、“智能家居”为代表的音频智能终端也持续放量&#xff1…

Java开发学习(四十)----MyBatisPlus入门案例与简介

一、入门案例 MybatisPlus(简称MP)是基于MyBatis框架基础上开发的增强型工具&#xff0c;旨在简化开发、提供效率。 SpringBoot它能快速构建Spring开发环境用以整合其他技术&#xff0c;使用起来是非常简单&#xff0c;对于MybatisPlus&#xff0c;我们也基于SpringBoot来构建…

掌握流量密码五要素,抓住底层逻辑,让你更容易获得流量

分享一篇关于流量的文章&#xff1a;流量是一切赚钱项目中最重要的一个要素没有流量&#xff0c;赚钱就是空谈。流量多就赚的多&#xff0c;流量少就赚的少&#xff0c;没有流量就没得赚。因为流量非常重要&#xff0c;所以要打造私域用户池&#xff0c;让流量变成留量。私域用…

微信小游戏开发学习记录2

接上一篇&#xff1a;微信小游戏开发学习记录_寂静流年韶华舞的博客-CSDN博客_微信小游戏开发学习 目录 一、UI系统 1、基础渲染组件-精灵组件 &#xff08;1&#xff09;操作&#xff1a; &#xff08;2&#xff09;Sprite 属性 &#xff08;3&#xff09;渲染模式 2、L…

Qt基于CTK Plugin Framework搭建插件框架--事件监听

文章目录一、前言二、框架事件三、插件事件四、服务事件五、添加事件监听一、前言 CTK一共有三种事件可以监听&#xff1a; 框架事件插件事件服务事件 但是这些事件只有在变化时才能监听到&#xff0c;如果已经变化过后&#xff0c;进入一个稳定的状态&#xff0c;这时才去监…

Android Studio实现一个新闻APP系统源码,仿网易,搜狐等新闻客户端,本科毕业设计必备项目

DavidTGNewsProject ##【Android】最新主流新闻app功能实现。仿网易,搜狐等新闻客户端 完整代码下载地址&#xff1a;Android Studio实现一个新闻APP系统源码 先给大家看一下效果图&#xff1a; 这个项目总体来说虽然不是特别难&#xff0c;但是确实非常常用的功能。是业余时间…

wordcloud | 词云 in python

wordcloud | 词云&#x1f928;wordcloud | 词云&#x1fae1;词云是啥&#x1f636;‍&#x1f32b;️词云的历史&#x1f914;安装 wordcloud 包&#x1f60e;官方文档&#x1f923;一个最简单的例子&#x1f44d;运行结果&#x1f60a;感谢&#x1f928;wordcloud | 词云 赢…

Vue中v-for不要和v-if一起使用

在Vue2中v-for和v-if一起使用时会报错&#xff1a;The xxx variable inside v-for directive should be replaced with a computed property that returns filtered array instead. You should not mix v-for with v-if原因&#xff1a;Vue2中当 v-if 与 v-for 一起使用时&…

4张图搞懂Salesforce的认证体系(附新手考证攻略)

Salesforce认证计划概述最近这一两年&#xff0c;Salesforce的Trailhead和认证太热门了&#xff0c;小伙伴们前赴后继地刷Badge拿认证&#xff0c;可以考的认证也随着产品家族的增加而增加&#xff0c;从十几年前的几个认证&#xff0c;增长到现在的40多个认证。与其他应用平台…