首页 > 其他分享 >【微服务】第38节:微服务的OpenFeign远程调用

【微服务】第38节:微服务的OpenFeign远程调用

时间:2024-07-20 22:29:12浏览次数:13  
标签:负载 38 服务 OpenFeign service Spring 调用 实例 均衡

1.远程调用

我们知道微服务间远程调用都是有OpenFeign帮我们完成的,甚至帮我们实现了服务列表之间的负载均衡。但具体负载均衡的规则是什么呢?何时做的负载均衡呢?

接下来我们一起来分析一下。

1.1.负载均衡原理

在SpringCloud的早期版本中,负载均衡都是有Netflix公司开源的Ribbon组件来实现的,甚至Ribbon被直接集成到了Eureka-client和Nacos-Discovery中。

但是自SpringCloud2020版本开始,已经弃用Ribbon,改用Spring自己开源的Spring Cloud LoadBalancer了,我们使用的OpenFeign的也已经与其整合。

接下来我们就通过源码分析,来看看OpenFeign底层是如何实现负载均衡功能的。

1.1.1.源码跟踪

要弄清楚OpenFeign的负载均衡原理,最佳的办法肯定是从FeignClient的请求流程入手。

⁉️ 首先,我们在com.hmall.cart.service.impl.CartServiceImpl中的queryMyCarts方法中打一个断点。然后在swagger页面请求购物车列表接口。

进入断点后,观察ItemClient这个接口:

你会发现ItemClient是一个代理对象,而代理的处理器则是SentinelInvocationHandler。这是因为我们项目中引入了Sentinel导致。

我们进入SentinelInvocationHandler类中的invoke方法看看:

可以看到这里是先获取被代理的方法的处理器MethodHandler,接着,Sentinel就会开启对簇点资源的监控:

开启Sentinel的簇点资源监控后,就可以调用处理器了,我们尝试跟入,会发现有两种实现:

这其实就是OpenFeign远程调用的处理器了。继续跟入会进入SynchronousMethodHandler这个实现类:

在上述方法中,会循环尝试调用executeAndDecode()方法,直到成功或者是重试次数达到Retryer中配置的上限。

我们继续跟入executeAndDecode()方法:

executeAndDecode()方法最终会利用client去调用execute()方法,发起远程调用。

这里的client的类型是feign.Client接口,其下有很多实现类:

由于我们项目中整合了seata,所以这里client对象的类型是SeataFeignBlockingLoadBalancerClient,内部实现如下:

这里直接调用了其父类,也就是FeignBlockingLoadBalancerClientexecute方法,来看一下:

标签:负载,38,服务,OpenFeign,service,Spring,调用,实例,均衡
From: https://blog.csdn.net/m0_46013789/article/details/140534816

相关文章

  • springboot基于Java的企业人才引进服务平台的设计与实现(源码+lw+部署文档+讲解等)
    具体实现截图技术栈后端框架SpringBoot采用springboot作为后台的框架,java框架具有简化配置和开发的效率。Spring框架目前是很多java开发者的首选框架,Spring主要有两大功能,控制反转和面向切面的编程。控制反转(IOC)可以实现代码的依赖注入,减少代......
  • PermissionError: [Errno 13] 权限被拒绝: 生产服务器上的“/root/.u2net”
    我正在使用rembg,它可以在我的本地计算机上运行,​​但在生产中会引发错误。所以我认为这与linux操作系统目录权限有关。这是服务器的完整日志:Traceback(mostrecentcalllast):File"/home/airnet-technologies-test-bgrm/htdocs/test-bgrm.airnet-technologies.com......
  • ubuntu服务器网站搭建
    一、安装apache2sudoapt-getupdatesudoapt-getinstallapache2然后在地址栏输入公网IP看是否能访问到如下页面此时网站的页面在/var/www/html/目录下,修改即可二、配置多网站如果想要一个服务器配置多个网站比如jeanhua.cn和blog.jeanhua.cn(通过主机头来区分)在Ap......
  • 字符的统计 387、389、383、242、49
    387.字符串中的第一个唯一字符解法一、哈希映射计算每个字符出现的次数,然后再遍历,与数组里记录次数进行比对顺便一提哈希表数据结构耗时很大,数组计数哈希思想快很多(是不是桶排来着classSolution{publicstaticintfirstUniqChar(Strings){intlen=......
  • web服务器1
    (1)仅提供用户浏览的单向静态网页单纯是由服务器单向提供数据给客户端,Server不需要与client端有互动,所以你可以到该网站上去浏览,但是无法进行数据的上传。(2)提供用户互动接口的动态网站这种类型的网站可以让服务器与用户互动,常见的例如留言板,博客。这种类......
  • Python学习笔记38:进阶篇(二十七)pygame的使用之时间与帧数控制
    前言基础模块的知识通过这么长时间的学习已经有所了解,更加深入的话需要通过完成各种项目,在这个过程中逐渐学习,成长。我们的下一步目标是完成pythoncrashcourse中的外星人入侵项目,这是一个2D游戏项目。在这之前,我们先简单学习一下pygame模块。私信我发送消息python资料,......
  • 构建未来水利管理的新生态:聚焦智慧水利解决方案的创新与发展,探讨其如何融合物联网、云
    目录一、引言:智慧水利的时代背景与意义二、智慧水利的核心技术体系1.物联网技术:感知水世界的神经末梢2.云计算技术:数据处理与存储的云端大脑3.5G通信技术:连接万物的信息高速路三、智慧水利的创新实践与发展趋势1.精准水资源管理与调度2.智能防洪抗旱与减灾3.智......
  • vue3 - 最新详细实现 “拖曳式课程表“ 日历课程排班功能,用鼠标拖拽课程放到日历课表
    效果图在vue3、nuxt3项目开发中,详解实现用鼠标拖拽排课的日历课程表,拖动课程名(学科)到日历课程表的某一节课中,拖放到课表上的时候自动沿边吸附贴合,vue3可视化拖拽生成课程表插件,左边是科目课程、右边是教学周课表,鼠标拖动把课程放到指定的日期时间上即可快速生成课表,数据......
  • 使用Java和Consul实现服务配置管理
    使用Java和Consul实现服务配置管理大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在现代微服务架构中,服务配置管理是一个重要的环节。Consul是一个用于服务发现和配置管理的工具,它提供了一个灵活的方式来管理和存储配置数据。本文将展示如何使用Java......
  • [CP_AUTOSAR]_通信服务_CanTp模块(二)
    目录3、功能规范3.1、提供给上层的服务3.1.1、Initializationandshutdown3.1.2、Transmitrequest3.1.3、Transmitcancellation3.2、提供给下层的服务3.2.1、Transmitconfirmation3.2.2、Receptionindication3.3、内部行为3.3.1、N-SDU接收  在前面《[CP......