SpringCloud详解03-负载均衡Ribbon和Feign
迪丽瓦拉
2025-05-30 01:49:24
0

系列文章目录

SpringCloud详解01
SpringCloud详解02


文章目录

  • 系列文章目录
  • 前言
  • 一、Ribbon简介
  • 二、使用Ribbon实现负载均衡
    • 1.在原有代码的基础上修改WebConfig.java
    • 2.修改消费方的controller方法
    • 3.将提供服务方开启多个tomcat模拟环境,测试
    • 4.负载均衡策略
    • 5.修改默认策略
  • 三、使用Feign实现负载均衡
    • 1.简介
    • 2、Feign和Ribbon 区别
    • 3、使用
  • 总结


前言

接上篇SpringCloud详解02,本篇记录Ribbon的使用


一、Ribbon简介

Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具
简单的说,Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法和服务调用。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,就是在配置文件中列出Load Balancer后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器。我们很容易使用Ribbon实现自定义的负载均衡算法。

简单的说就是将用户的请求平摊的分配到多个服务上,从而达到系统的高可用。

Ribbon本地负载均衡客户端 VS Nginx服务端负载均衡区别

Nginx是服务器负载均衡,客户端所有请求都会交给nginx,然后由nginx实现转发请求,即负载均衡是由服务端实现的。
Ribbon本地负载均衡,在调用微服务接口时候,会在注册中心上获取注册信息服务列表之后缓存到JVM本地,从而在本地实现RPC远程服务调用技术。

二、使用Ribbon实现负载均衡

Ribbon只是一个客户端的负载均衡器工具,实现起来非常的简单,我们只需要在注入RestTemplate的bean上加上@LoadBalanced就可以了

1.在原有代码的基础上修改WebConfig.java

在这里插入图片描述

2.修改消费方的controller方法

//消费方应该调用生产方的服务@RequestMapping("getUsers")public JsonResult getUsers(){//由于使用了@LoadBalanced,这里需要通过服务的名称来发送网络请求,在nacos管理界面查看服务名String url = "http://provider/user-provider/findAll";JsonResult jsonResult = restTemplate.getForObject(url, JsonResult.class);System.out.println(jsonResult);return jsonResult;}

3.将提供服务方开启多个tomcat模拟环境,测试

首先把Springboot的启动改为允许多个启动
在这里插入图片描述
在这里插入图片描述
然后端口号7070启动,为了方便观察,我们在服务提供方的controller中加了一句控制台输出语句,输出当前端口,然后分别将7071,7072启动,
在这里插入图片描述
在这里插入图片描述
7070
在这里插入图片描述

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

接着启动消费方8081
在这里插入图片描述
查看控制台,此时开启了4个启动类
在这里插入图片描述

最后,我们将三个服务提供方控制台清空,去浏览器访问消费方的controller方法,连续访问6次,查看控制台

结果如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Ribbon默认使用的是轮询,前端发来6次请求,那么服务提供方,每个服务端都分别接到两次。

4.负载均衡策略

Ribbon提供了一个很重要的接口叫做IRule,其中定义了很多的负载均衡策略,默认的是轮询的方式,以下是Ribbon的负载均衡策略

在这里插入图片描述

5.修改默认策略

我们需要在消费方的WebConfig中添加以下代码:

 //创建对象实现改变Ribbon的负载均衡策略,随机规则@Beanpublic IRule getRule() {return new RandomRule();}

然后重启消费方,再次访问6次

7070:
在这里插入图片描述
7071:
在这里插入图片描述
7072:
在这里插入图片描述

轮询实现成功

三、使用Feign实现负载均衡

1.简介

Feign 和 Ribbon 是 Spring Cloud 的 Netflix 中提供的两个实现软负载均衡的组件,Ribbon 和 Feign 都是用于调用其他服务的,方式不同,Feign 则是在 Ribbon 的基础上进行了一次改进,采用接口的方式,将需要调用的其他服务的方法定义成抽象方法即可,不需要自己构建 http 请求,不过要注意的是抽象方法的注解、方法名要和提供服务的方法对应上

2、Feign和Ribbon 区别

  • 启动类使用的注解不同,Ribbon 用的是@RibbonClient,Feign 用的是@EnableFeignClients。
  • 服务的指定位置不同,Ribbon 是在@RibbonClient 注解上声明,Feign 则是在定义抽象方法的接口中使用@FeignClient 声明。
  • 调用方式不同,Ribbon 需要自己构建 http 请求,模拟 http 请求然后使用 RestTemplate 发送给其他服务,步骤相当繁琐,Feign 是直接通过接口方式调用。

3、使用

  • 在springcloudalibaba-micro-service-consumer-8080的pom.xml中添加依赖

     org.springframework.cloudspring-cloud-starter-openfeign2.2.6.RELEASE
    
  • 在启动类上加上@EnableFeignClients注解,开启Feign
    在这里插入图片描述

  • 创建UserService

    package com.lzl.service;import com.lzl.dto.UserDto;
    import com.lzl.utils.JsonResult;
    import org.springframework.cloud.openfeign.FeignClient;
    import org.springframework.stereotype.Service;
    import org.springframework.web.bind.annotation.*;/*** --效率,是成功的核心关键--** @Author lzl* @Date 2023/3/15 16:23*/
    @Service
    @FeignClient("provider")//服务名,需要在nacos界面查看服务列表
    public interface UserService {@RequestMapping("/user-provider/findAll")JsonResult findAll();}

    注意要加上@FeignClient(“provider”)注解,values为服务提供方yml文件中配置的服务名,也可以在nacos界面查看

  • 创建FeignUserController

    package com.lzl.controller;import com.lzl.dto.UserDto;
    import com.lzl.service.UserService;
    import com.lzl.utils.JsonResult;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.*;/*** --效率,是成功的核心关键--** @Author lzl* @Date 2023/3/15 16:25*/@RestController
    @RequestMapping("feign")
    public class FeignUserController {@Autowiredprivate UserService userService;@RequestMapping("findAll")public JsonResult findAll(){return userService.findAll();}
    }
  • 启动多个provider服务提供方,测试
    在这里插入图片描述

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

成功


总结

本篇主要记录了SpringCloud中的负载均衡组件,其中,Ribbon基本上已经弃用了,更多的开发者还是选择Feign这种直接通过接口调用的方式,重点是,SpringCloud的服务负载均衡和Nginx的负载均衡不是一种东西,不要混淆,下篇继续

相关内容

热门资讯

linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
C++ 机房预约系统(六):学... 8、 学生模块 8.1 学生子菜单、登录和注销 实现步骤: 在Student.cpp的...
A.机器学习入门算法(三):基... 机器学习算法(三):K近邻(k-nearest neigh...
数字温湿度传感器DHT11模块... 模块实例https://blog.csdn.net/qq_38393591/article/deta...
有限元三角形单元的等效节点力 文章目录前言一、重新复习一下有限元三角形单元的理论1、三角形单元的形函数(Nÿ...
Redis 所有支持的数据结构... Redis 是一种开源的基于键值对存储的 NoSQL 数据库,支持多种数据结构。以下是...
win下pytorch安装—c... 安装目录一、cuda安装1.1、cuda版本选择1.2、下载安装二、cudnn安装三、pytorch...
MySQL基础-多表查询 文章目录MySQL基础-多表查询一、案例及引入1、基础概念2、笛卡尔积的理解二、多表查询的分类1、等...
keil调试专题篇 调试的前提是需要连接调试器比如STLINK。 然后点击菜单或者快捷图标均可进入调试模式。 如果前面...
MATLAB | 全网最详细网... 一篇超超超长,超超超全面网络图绘制教程,本篇基本能讲清楚所有绘制要点&#...
IHome主页 - 让你的浏览... 随着互联网的发展,人们越来越离不开浏览器了。每天上班、学习、娱乐,浏览器...
TCP 协议 一、TCP 协议概念 TCP即传输控制协议(Transmission Control ...
营业执照的经营范围有哪些 营业执照的经营范围有哪些 经营范围是指企业可以从事的生产经营与服务项目,是进行公司注册...
C++ 可变体(variant... 一、可变体(variant) 基础用法 Union的问题: 无法知道当前使用的类型是什...
血压计语音芯片,电子医疗设备声... 语音电子血压计是带有语音提示功能的电子血压计,测量前至测量结果全程语音播报࿰...
MySQL OCP888题解0... 文章目录1、原题1.1、英文原题1.2、答案2、题目解析2.1、题干解析2.2、选项解析3、知识点3...
【2023-Pytorch-检... (肆十二想说的一些话)Yolo这个系列我们已经更新了大概一年的时间,现在基本的流程也走走通了,包含数...
实战项目:保险行业用户分类 这里写目录标题1、项目介绍1.1 行业背景1.2 数据介绍2、代码实现导入数据探索数据处理列标签名异...
记录--我在前端干工地(thr... 这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前段时间接触了Th...
43 openEuler搭建A... 文章目录43 openEuler搭建Apache服务器-配置文件说明和管理模块43.1 配置文件说明...