当前位置: 首页 > news >正文

负载均衡 Ribbon 与 Fegin 远程调用原理

文章目录

  • 一、什么是负载均衡
  • 二、Ribbon 负载均衡
    • 2.1 Ribbon 使用
    • 2.2 Ribbon 实现原理 (★)
    • 2.3 Ribbon 负载均衡算法
  • 三、Feign 远程调用
    • 3.1 Feign 简述
    • 3.2 Feign 的集成
    • 3.3 Feign 实现原理 (★)


一、什么是负载均衡

《服务治理:Nacos 注册中心》 末尾提到了负载均衡,那什么是负载均衡呢?

负载均衡就是将负载(⼯作任务,访问请求)进⾏分摊到多个操作单元(服务器,组件)上进行执行
根据负载均衡发⽣位置的不同,⼀般分为: 服务端负载均衡客户端负载均衡

  • 服务端负载均衡指的是发生在服务提供者一方,比如常见的 Nginx 负载均衡。
  • 客户端负载均衡指的是发生在服务请求的一方,也就是在发送请求之前已经选好了由哪个实例处理请求。

在这里插入图片描述
注:在微服务调⽤关系中⼀般会选择客户端负载均衡,也就是在服务调用的一方来决定服务由哪个提供者执行。


二、Ribbon 负载均衡

2.1 Ribbon 使用

Ribbon 是 Spring Cloud 的⼀个组件, 它可以让我们使用一个注解就能轻松的搞定负载均衡。

1、在 RestTemplate 的生成方法上添加 @LoadBalanced 注解

@Bean
@LoadBalanced // 表示继承Ribbon进行负载均衡
public RestTemplate restTemplate() {return new RestTemplate();
}

2、修改服务调用的方法

@Service
@Slf4j
public class OrderServiceImpl implements OrderService {@Autowiredprivate OrderDao orderDao;@Autowiredprivate RestTemplate restTemplate;@Overridepublic Order createOrder(Long productId, Long userId) {log.info("接收到{}号商品的下单请求,接下来调⽤商品微服务查询此商品信息", productId);// 远程调⽤商品微服务,查询商品信息String url = "http://product-service/product/" + productId;log.info("服务器地址: {}", url);// 远程调⽤商品微服务,查询商品信息Product product = restTemplate.getForObject(url, Product.class);log.info("查询到{}号商品的信息,内容是:{}", productId, JSON.toJSONString(product));// 创建订单并保存Order order = new Order();order.setUid(userId);order.setUsername("安秀岩");order.setPid(productId);order.setName(product.getName());order.setPrice(product.getPrice());order.setNumber(1);orderDao.save(order);log.info("创建订单成功,订单信息为{}", JSON.toJSONString(order));return order;}
}

在这里插入图片描述
对比以下两种方式,差异显著:

 //⾃定义规则实现随机挑选服务List<ServiceInstance> instances = discoveryClient.getInstances("product-service");int index = new Random().nextInt(instances.size());ServiceInstance instance = instances.get(index);String url = instance.getHost() + ":" + instance.getPort();log.info("从nacos中获取到的微服务地址为:" + url);简化成了以下一行// Ribbon 直接使用需要远程调用的服务名称即可
String url = "http://product-service/";

那 Ribbon 底层原理又是什么呢?为什么可以使用服务名称就能远程调用该服务呢?


2.2 Ribbon 实现原理 (★)

现假设:两个商品服务做集群,向Nacos注册的IP分别是192.168.10.111:8081192.168.10.112:8081

step1:当使用 RestTemplate 远程访问时,http://product-service/product/1 首先会将服务名称截取出来 product-service
step2:并在本地缓存列表中获取到服务的 IP 集合,即{{192.168.10.111:8081}, {192.168.10.112:8081}}
step3:根据内部配置的 负载均衡算法,从集合中选取其中一个IP地址,如:192.168.10.112:8081
step4:将原来的 url 替换成 http://192.168.10.112:8081/product/1,最终通过 RestTemplate 发起请求。


2.3 Ribbon 负载均衡算法

Ribbon 内置了多种负载均衡策略,内部负载均衡的顶级接口为 com.netflix.loadbalancer.IRule,具体的负载策略如下图所示:

在这里插入图片描述
可以通过修改配置来调整 Ribbon 的负载均衡策略,如在 order-server 项目的 application.yml 中增加如下配置:

product-service: # 调⽤的提供者的名称ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

三、Feign 远程调用

3.1 Feign 简述

为什么要使用 feign 呢?原来的调用的方式 String url = "http://product-service/product/" + productId; 是固定的字符串做拼接不够灵活,而且还存在 productId 参数校验问题等,因此 Feign 可解决这个问题。

  Feign 是 Spring Cloud 提供的⼀个声明式的伪 Http 客户端,它使得调用远程服务就像调用本地服务一样简单,只需要创建一个接口并添加一个注解即可。Nacos 很好的兼容了 Feign,Feign 默认集成了 Ribbon,所以在 Nacos 下使用 Fegin 默认就实现了负载均衡的效果


3.2 Feign 的集成

1、在shop-order-server项⽬的pom文件加入Fegin的依赖

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2、在启动类上添加 Fegin 的扫描注解 @EnableFeignClients,注意扫描路径(默认扫描当前包及其子包)

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients // 会扫描当包及其子包下贴有@FeignClient注解的接口
public class OrderServer {public static void main(String[] args) {SpringApplication.run(ProductApplication .class, args);}
}

3、在 shop-order-server 项目中新增接口 ProductFeignApi 和该接口的容错类 ProductFeignFallback

@FeignClient(name = "product-service", fallback = ProductFeignFallback.class)
// 远程调用服务名称;fallback 指定返回兜底数据的类的字节码,即服务挂起时的降级类方法
public interface ProductFeignApi {@RequestMapping("/product/{pid}")// 路径要与 ProductController 的接口保持一致Product findByPid(@PathVariable("pid") Long pid);
}
@Component // 该类的作用是返回兜底数据以防 “服务器雪崩”
public class ProductFeignFallback implements ProductFeignApi {@Overridepublic Product findByPid(Long pid) {System.out.println("返回兜底数据");return new Product();}
}

在这里插入图片描述

4、修改服务调用的方法

@Service
@Slf4j
public class OrderServiceImpl implements OrderService {@Autowiredprivate OrderDao orderDao;@Autowiredprivate ProductFeignApi productFeignApi;@Overridepublic Order createOrderFeign(Long productId, Long userId) {// feign 调用Product product = productFeignApi.findByPid(productId);log.info("查询到{}号商品的信息,内容是:{}", productId, JSON.toJSONString(product));// 创建订单并保存Order order = new Order();order.setUid(userId);order.setUsername("叩丁狼教育");order.setPid(productId);order.setName(product.getName());order.setPrice(product.getPrice());order.setNumber(1);orderDao.save(order);log.info("创建订单成功,订单信息为{}", JSON.toJSONString(order));return order;}
}

3.3 Feign 实现原理 (★)

Feign 实现的原理是基于动态代理和反射技术,并且内部还是使用 RestTemplate 实现的,具体详细流程如下:
在这里插入图片描述


文章参考:Java微服务商城高并发秒杀项目实战|Spring Cloud Alibaba真实项目实战+商城双11秒杀+高并发+消息+支付+分布式事物Seata

相关文章:

负载均衡 Ribbon 与 Fegin 远程调用原理

文章目录 一、什么是负载均衡二、Ribbon 负载均衡2.1 Ribbon 使用2.2 Ribbon 实现原理 (★)2.3 Ribbon 负载均衡算法 三、Feign 远程调用3.1 Feign 简述3.2 Feign 的集成3.3 Feign 实现原理 (★) 一、什么是负载均衡 《服务治理&#xff1a;Nacos 注册中心》 末尾提到了负载均…...

c/c++:CMakeLists.txt中添加编译/连接选项使用内存错误检测工具Address Sanitizer(ASan)

Address Sanitizer(ASan)是一个快速的内存错误检测工具。从gcc 4.8开始&#xff0c;AddressSanitizer成为gcc的一部分。 既然是gcc内置的内存检查工具&#xff0c;用起来比第三方的库更方便些。只要指定相应的编译链接参数就可以实现内存泄露检查了&#xff0c;如下是是cmake脚…...

armbian cups 远程打印机 1022

使用 CUPS Web 浏览器界面设置和管理打印机 - Oracle Solaris 管理&#xff1a;常见任务 N1刷armbian变身打印服务器&#xff0c;支持全平台无线打印PC扫描_存储设备_什么值得买 (smzdm.com) 第 6 章 使用 Web 界面向 CUPS 添加打印机 | Red Hat Product Documentation apt…...

three.js使用3DTilesRendererJS加载3d tiles数据

原生的 three.js 目前不支持 3d tiles 数据的加载&#xff0c;不过开源社区已经给出了一些解决方案&#xff0c;其中最活跃的要属 3DTilesRendererJS。它为 three.js 提供了加载和调度 3d tiles 数据的基本能力&#xff0c;虽说和 Cesium.js 对 3d tiles 的支持相比还有很大的差…...

坐牢第三十五天(c++)

一.作业 1.使用模版类自定义栈 代码&#xff1a; #include <iostream> using namespace std; template<typename T> // 封装一个栈 class stcak { private:T *data; //int max_size; // 最大容量int top; // 下标 public:// 无参构造函数stcak();// 有参…...

Conda离线部署django

要在没有网络连接的环境中使用conda部署Django&#xff0c;你需要预先在有网络连接的机器上创建一个包含所有必要包的环境&#xff0c;并导出该环境的配置文件。然后&#xff0c;你可以将这个配置文件和必要的包传输到目标机器上进行安装。 下面是详细的步骤&#xff1a; 1. …...

1. Fabric.js安装使用

安装 # 安装 fabricjs npm i fabric --save在需要使用的页面引入 import * as fabric from fabric...

Excel中.xls和.xlsx文件格式的区别,及C++操作Excel文件

‌文件结构和兼容性‌&#xff1a; XLS是Excel 97-2003版本的文件格式&#xff0c;而XLSX是Excel 2007及以上版本的文件格式。XLS格式是向下兼容的&#xff0c;意味着较新的Excel版本可以打开XLS文件&#xff0c;但较旧的版本无法打开XLSX文件。相反&#xff0c;XLSX格式是向上…...

php实用命令

php相关命令 命令错误级别 命令 命令命令介绍具体用法php -v查看php版本php -vphp -l检查php文件是否有语法错误php -lphp -m查看当前php安装的扩展php -mphp -i | grep extension_dir查看扩展安装的目录php -i | grep extension_dir 错误级别 命令命令介绍具体用法error_re…...

TypeError:未绑定方法

TypeError: unbound method 错误通常发生在类方法被调用时&#xff0c;但没有正确绑定到实例。这通常意味着你试图在类本身上调用一个实例方法&#xff0c;或者没有使用正确的方式创建类实例。 1、问题背景 某位开发者在尝试创建一个类似于经典的 Pratt 递归下降解析器时遇到了…...

Java虚拟机(JVM)的架构和工作原理,字节码执行流程

JVM的概念 JVM是Java Virtual Machine的缩写&#xff0c; 即Java虚拟机&#xff0c;也被称为Java程序运行的核心环境 。它是一种用于计算设备的规范&#xff0c;‌通过在实际的计算机上仿真模拟各种计算机功能来实现。‌JVM由一套字节码指令集、‌一组寄存器、‌一个栈、‌一个…...

416.分割等和子集

416.分割等和子集 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等。 示例 1&#xff1a; 输入&#xff1a;nums [1,5,11,5] 输出&#xff1a;true 解释&#xff1a;数组可以分割成 [1, 5, 5] 和…...

python初始化一个三维数组

文章目录 1.什么是三维数组2.那我应该如何初始化一个自定义长度的三维数组呢&#xff1f; 1.什么是三维数组 从最外层开始理解&#xff0c;可以理解为一维数组&#xff0c;里面套了一个二维数组&#xff08;12等于三维数组&#xff09; arr [ [[], []], [[], [], []], [[],[]]…...

EI会议推荐-第二届大数据与数据挖掘国际会议(BDDM 2024)

第二届大数据与数据挖掘国际会议&#xff08;BDDM 2024&#xff09; 1、基本信息 大会官网&#xff1a;http://www.icbddm.org/ 官方邮箱&#xff1a;icbddm163.com 主办方&#xff1a;武汉纺织大学 会议时间&#xff1a;2024年12月13日-12月15日 会议地点&#xff1a;湖…...

RK3566/RK3568 Android 11 动态显示/隐藏下拉框

概述 在系统服务中增加显示/隐藏状态栏方法,在上层app动态调用显示/隐藏下拉框方法,设备关机和重启后也能继续生效。 创建全局变量 1.定义全局变量 在frameworks/base/core/java/android/provider/Settings.java中添加 /*** Disable drop-down box* @hide*/public static…...

Android图片缓存工具类LruCache原理和使用介绍

LruCache & DiskLruCache原理。 常用的三级缓存主要有LruCache、DiskLruCache、网络&#xff0c;其中LruCache对应内存缓存、 DiskLruCache对应持久化缓存。Lru表示最近最少使用&#xff0c;意思是当缓存到达限制时候&#xff0c;优先淘汰近 期内最少使用的缓存&#xff0c…...

生活杂记1

生命中&#xff0c;总有一些事需要你一生去治愈&#xff0c;我把这些杂记写出来&#xff0c;写完了就不再想了&#xff0c;太内耗了…hahaha~ 因为嘴馋&#xff0c;小时候经常去老姑家&#xff0c;她家有各类零食及平时很少吃的“山珍海味”。去的次数多了&#xff0c;就和她家…...

go常用代码

连接阿波罗&#xff1a; 默认properties类型 package mainimport ("fmt""github.com/apolloconfig/agollo/v4""github.com/apolloconfig/agollo/v4/env/config" )func main() {c : &config.AppConfig{AppID: "2222",Cl…...

各种各样的正则表达式

一、校验数字的表达式 数字:^[0-9]*$ n位的数字:^\d{n}$ 至少n位的数字:^\d{n,}$ m-n位的数字:^\d{m,n}$ 零和非零开头的数字:^(0|[1-9][0-9]*)$ 非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(.[0-9]{1,2})?$ 带1-2位小数的正数或负数:^(\-)?\d+(\.\d{1,2})?$ 正…...

WebRTC 基础

WebRTC 基础 目录 什么是 WebRTCWebRTC 的基本概念WebRTC 的基本流程 连接建立流程图 WebRTC 的基本对象 RTCPeerConnectionRTCSessionDescriptionRTCIceCandidate WebRTC API 详解 RTCPeerConnection API媒体流 API 详细的代码示例 基本连接示例完整的 WebRTC 实现示例 总结…...

抖音直播回放智能下载工具:从技术实现到价值创造的完整指南

抖音直播回放智能下载工具&#xff1a;从技术实现到价值创造的完整指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback …...

LumiPixel Canvas Quest多模态探索:结合文本描述生成特定场景人像

LumiPixel Canvas Quest多模态探索&#xff1a;结合文本描述生成特定场景人像 1. 效果亮点预览 LumiPixel Canvas Quest在理解复杂文本描述并生成对应场景人像方面展现出惊人的能力。输入一段详细的场景描述&#xff0c;模型就能生成高度符合文本意境且细节丰富的图像。比如输…...

如何永久保存网络小说?这款开源工具让你的阅读体验不再受限于平台

如何永久保存网络小说&#xff1f;这款开源工具让你的阅读体验不再受限于平台 【免费下载链接】fanqienovel-downloader 下载番茄小说 项目地址: https://gitcode.com/gh_mirrors/fa/fanqienovel-downloader 核心痛点分析&#xff1a;数字阅读时代的内容失控危机 识别阅…...

TranslucentTB:Windows任务栏透明化改造的工程级解决方案

TranslucentTB&#xff1a;Windows任务栏透明化改造的工程级解决方案 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB 当你面对Windows单调…...

Laravel多租户安全防护完整手册:保护租户数据隔离与访问控制的终极指南

Laravel多租户安全防护完整手册&#xff1a;保护租户数据隔离与访问控制的终极指南 【免费下载链接】multi-tenant Run multiple websites using the same Laravel installation while keeping tenant specific data separated for fully independent multi-domain setups, pre…...

UR机械臂ROS2驱动选型指南:深入对比Ethernet RTDE与EtherCAT,你的项目该怎么选?

UR机械臂ROS2驱动选型指南&#xff1a;Ethernet RTDE与EtherCAT深度对比与实战决策 在工业自动化与协作机器人领域&#xff0c;UR&#xff08;Universal Robots&#xff09;机械臂因其灵活性和易用性广受青睐。然而&#xff0c;当工程师们将UR机械臂集成到ROS2生态系统中时&…...

资管规模突破千万!传统理财师转型AI量化理财专家,如何用数据说服大用户

从“人脑经验”到“数据驱动”&#xff0c;一位理财师的真实进阶之路2025年&#xff0c;我的资管规模正式突破1000万。这不是一个简单的数字&#xff0c;而是对我从传统理财师转型AI量化理财专家最有力的证明。很多人问我&#xff1a;你是靠什么说服那些高净值客户的&#xff1…...

Browsershot终极教程:从零开始掌握Chrome无头浏览器

Browsershot终极教程&#xff1a;从零开始掌握Chrome无头浏览器 【免费下载链接】browsershot Convert HTML to an image, PDF or string 项目地址: https://gitcode.com/gh_mirrors/br/browsershot Browsershot是一款强大的工具&#xff0c;能够轻松实现HTML到图片、PD…...

SEO关键词长尾词怎么找

SEO关键词长尾词怎么找&#xff1f;一步步教你掌握高效方法 在当今数字营销的环境中&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;无疑是一个至关重要的环节。对于想要在百度上取得高排名的网站来说&#xff0c;找到合适的SEO关键词是至关重要的。尤其是长尾词&#x…...

实时手机检测-通用效果展示:手机在镜面反射/玻璃橱窗中的识别能力

实时手机检测-通用效果展示&#xff1a;手机在镜面反射/玻璃橱窗中的识别能力 1. 模型介绍与核心优势 实时手机检测-通用模型是一个专门用于检测图像中手机位置的高性能AI模型。这个模型基于先进的DAMO-YOLO框架开发&#xff0c;在检测精度和推理速度方面都表现出色。 与传统…...