3.OpenFeign与负载均衡

文章目录

  • 什么是 OpenFegin
  • 0penFeign 与 Ribbon.
  • 对 consumer 的改造
  • 超时配置
  • 请求响应的压缩设置
  • 选择远程调用的底层实现技术
  • OpenFegin 整合 LoadBalancer 负载均衡
  • 负载均衡策略的更换
  • 小结

前面消费者对于微服务的消费是通过 RestTemplate 完成的,这种方式的弊端是很明显的:消费者对提供者的调用无法与业务接口完全吻合。
例如,原本Service 接口中的方法是有返回值的,但经过 RestTemplate 相关API调用后没有了其返回值,最终执行是否成功用户并不清楚。
再例如 RestTemplate 的对数据的删除与修改操作方法都没有返回值。
代码编写不方便,不直观。提供者原本是按照业务接口提供服务的,而经过 RestTemplate一转手,变为了 URL,使得程序员在编写消费者对提供者的调用代码时,变得不直接、不明了。没有直接通过业务接口调用方便、清晰。

什么是 OpenFegin

018d0c610e3534fb3cfb35858fca11d.png

  • 声明式 REST 客户端:Feign 通过使用 JAX-RS(JavaApieXtensionsofRESTful webServivces)或 SpringMVc 注解的修饰方式,生成接口的动态实现。”
  • Feign,假装、伪装。openFeign 可以将提供者提供的 Restful服务伪装为接口进行消费,消费者只需使用“feign 接口 + 注解”的方式即可直接调用提供者提供的 Restful 服务而无需再使用 RestTemplate。
  • 对于 openFeign,可简单总结为以下几点:OpenFeign 只涉及 Consumer,与Provider 无关。因为其是用于 Consumer 调用 Provider的
    • OpenFeign 仅仅就是一个伪客户端,其不会对请求做任务的处理。
    • OpenFeign 是通过注解的方式实现 RESTful 请求的。

0penFeign 与 Ribbon.

OpenFeign 具有负载均衡功能,其可以对指定的微服务采用负载均衡方式进行消费、访问。之前老版本 Springcloud 所集成的 OpenFeign 默认采用了 Ribbon 负载均衡器。但由于Netflix 已不再维护 Ribbon,所以从 Springcloud2021.x开始集成的 OpenFeign 中已彻底丢弃Ribbon,而是采用 SpringCloud 自行研发的 SpringCloud Loadbalancer 作为负载均衡器

对 consumer 的改造

  • SpringCloud 2021.x 版本不在使用 Ribbon,需要额外引入 SpringCloud-Loadbalancer 依赖
<!--openfegin依赖-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
  • 新增 service 接口
/*** ProjectName:    springcloudalibaba* ClassName:    DepartService* Package:    com.cheese.service* Description: openFegin 伪客户端接口* Datetime:    2024-07-23   1:12* Author:   LJZ*/
@FeignClient(value = "depart-provider", path = "/provider/depart") //微服务名称,uri
public interface DepartService {/*** 接口名,注解路径,所有方法名与provider-server 中的接口一致* @param depart* @return*///新增@PostMapping("/save")Boolean addDepart(@RequestBody DepartEntity depart);//修改@PutMapping("/update")Boolean updateDepart(@RequestBody DepartEntity depart);//删除@DeleteMapping("/del/{id}")Boolean deleteDepartById(@PathVariable Integer id);//查询@GetMapping("/get/{id}")DepartEntity getDepartById(@PathVariable Integer id);//列表@GetMapping("/list")List<DepartEntity> getAllDepart();
}
//SpringCloud2021.x前后版本的openfegin使用差异
//旧版本
@FeignClient(value = "depart-provider", path = "/provider/depart") //微服务名称,uri
或是
@FeignClient(value = "depart-provider") //微服务名称,uri
@RequestMapping("/provider/depart")
//两种方式均可
//-----------------------------------------
//新版本只能使用第一种方式进行注解配置
  • DepartController 中调用的 service 与接口方法命保持一致
    @Resourceprivate DepartService departService;//新增@PostMapping("/")public Boolean addDepart(@RequestBody DepartEntity depart) {return departService.addDepart(depart);}//修改@PutMapping("/")public Boolean modifyDepart(@RequestBody DepartEntity depart) {return departService.updateDepart(depart);}//删除@DeleteMapping("/{id}")public Boolean deleteDepart(@PathVariable Integer id) {return departService.deleteDepartById(id);}//查询@GetMapping("/{id}")public DepartEntity getDepart(@PathVariable Integer id) {return departService.getDepartById(id);}//列表@GetMapping("/list")public List<DepartEntity> getDepartList() {return departService.getAllDepart();}
  • 启动类上新增注解@EnableFeignClients //开启OpenFeginClient
  • 启动 nacos, 启动 consumer 启动 provider,使用 consumer,openfegin 调用 provider

image.png
image.png

超时配置

  • 在 consumer 的 yaml 配置文件中做如下配置
spring:cloud:# OpenFegin 超时配置openfeign:client:config:default: #全局设置#consumer与provider建立连接的超时时间<==取决于网络因素connect-timeout: 1#建立连接后的读取时间,consumer发出请求到provider的响应这段时间的阈值<==取决于provider的业务逻辑read-timeout: 1depart-provider: #指定微服务设置,优先于全局设置,feginName即,@FeginClient注解value的值connect-timeout: 1read-timeout: 2
  • 使用全局设置时(将下方的 depart-provider 进行注释),重启 consumer,预期结果超时时间 1ms 出现 timeout 现象较多

image.png
GIF 2024-07-30 00-19-41.gif
image.png

  • 指定 feginName 方式(将注解放开),重启 consumer

depart-provider.gif

  • 有时能够访问到,由于 read-timeout 比原先的的 default 设置的比较大,符合预期

请求响应的压缩设置

spring:cloud:#对请求响应的压缩设置compression:request:#开启压缩配置enabled: true#指定类型mime-types: ["text/xml", "application/xml", "application/json","video/mp4"]#最小请求大小,默认值2048min-request-size: 1024response:enabled: true

image.png

选择远程调用的底层实现技术

  • feign 的远程调用底层实现技术默认采用的是 JDK的 URLConnection,同时还支持HttpClient 与OkHttp。.
  • 由于 JDK 的 URLConnection 不支持连接池,通信效率很低,所以生产中是不会使用该默认实现的。所以在 Spring cloud OpenFeign 中直接将默认实现变为了 Htpclient,同时也支持OkHttp。
  • 用户可根据业务需求选择要使用的远程调用底层实现技术。”

OpenFegin 整合 LoadBalancer 负载均衡

  • 紧接上文,现在已经有了一个 provider8081,如何使用 springcloud 负载均衡呢?查阅官网

image.png

  • 简而言之,想要使用 OpenFegin 客户端负载均衡,必须引入spring-cloud-starter-loadbalancer依赖,如果不引入依赖也能够使用默认的 feginclient,但是就不会有负载均衡的功能
  • 引入依赖
<!--nacos2.2.0.1往后版本的客户端负载均衡依赖-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
  • 使用 idea 动态参数构建 provider8082,provider8083

image.png
loadbalancer.gif

  • 可以看到 consumer 已经具备负载均衡功能了,默认负载均衡策略为轮询方式

负载均衡策略的更换

  • 新增一个配置类 DepartConfig.java,用于配置负载均衡策略
/*** ProjectName:    springcloudalibaba* ClassName:    DepartConfig* Package:    com.cheese.config* Description: 用于修改负载均衡策略* Datetime:    2024-07-30   1:21* Author:   LJZ*/
public class DepartConfig {@Beanpublic ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,LoadBalancerClientFactory factory) {//获取负载均衡客户端名称,即提供者服务名称String serverName = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);//获取提供者微服务名称可用的实例列表ObjectProvider<ServiceInstanceListSupplier> lazyProvider = factory.getLazyProvider(serverName, ServiceInstanceListSupplier.class);//从集合lazyProvider中获取指定serverName的实例,随机做负载均衡return new RandomLoadBalancer(lazyProvider, serverName);}
}
  • 在 DepartConfig 类中未见@Configuration注解,在启动类中需添加@LoadBalancerClients(defaultConfiguration = DepartConfig.class)

image.png

  • 重启 consumer8080

random.gif

小结

spring-cloud-loadbalancer 存在以下弊端

  • 负载均衡策略较少
    • 仅支持轮询和随机策略,默认是轮询策略
  • 更换负载均衡策略方式较为麻烦
  • 生产环境下使用的负载均衡器,通常是 dubbo
    • dubbo 作为通讯客户端,负载均衡策略可供选择更加多样
    • 无论是 openfegin 还是 resttemplate 建立通讯方式均是基于 http 协议进行
    • http 协议效率较低,生产环境下使用远程过程调用协议 RPC 效率会更高
    • 基于 RPC 通讯协议的框架恰好就有dubbo,此外还有 gRPC

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt实现圆形窗口

重新实现paintEvent()函数。 效果如下&#xff1a; 效果为蓝色区域&#xff0c;背景是vs接面&#xff0c;代码直接复制可用&#xff0c;留给有需要的人。 #ifndef CircleWidget_h__ #define CircleWidget_h__#include <QWidget>class CCircleWidget : public QWidget {Q…

学习vue3 三,组件基础,父子组件传值

组件基础 每一个.vue 文件都可以充当组件来使用 每一个组件都可以复用 父组件引入之后可以直接当标签使用 案例&#xff1a; App.vue <script setup lang"ts"> import BaseRefAndReactive from "./components/BaseRefAndReactive.vue";</sc…

MySQL——数据表的基本操作(二)查看数据表

使用 SQL 语句创建好数据表后,可以通过查看数据表结构的定义,以确认数据表的定义是否正确。在 MySQL中,查看数据表的方式有两种,具体如下。 1、使用 SHOW CREATE TABLE 查看数据表 在 MySQL 中,SHOW CREATE TABLE语句不仅可以查看创建表时的定义语句还可以查看表的字符编码。S…

PLL基本原理、设计及应用

PLL基本原理 锁相环&#xff08;Phase-Locked Loop, PLL&#xff09;是一种基本的反馈控制系统&#xff0c;广泛应用于电子通信、信号处理、时钟同步等多个领域。PLL通过反馈机制锁定输入信号的频率和相位&#xff0c;从而实现输出信号与输入信号的同步。其基本工作原理可以概…

使用AI绘图工具生成风景图像的教程

随着人工智能技术的飞速发展&#xff0c;AI绘图工具在图像生成和艺术创作方面变得越来越强大&#xff0c;无论你是一个设计师、艺术家&#xff0c;还是仅仅对生成艺术感兴趣的爱好者&#xff0c;AI绘图工具都可以帮助你轻松地创作出惊艳的风景图像。 在这篇教程中&#xff0c;…

顶顶通手机助手拦截方案

现在很多品牌的手机&#xff0c;都自带语音助手&#xff0c;比如我用的是小米手机&#xff0c;就自带小爱助手&#xff0c;可以自动接听各种广告营销电话。如果来电号码被标记为广告营销&#xff0c;小爱助手就会自动应答&#xff0c;然后模拟真人进行对话。 现在自动外呼系统拨…

RPC通信的简单流程

远程调用者假设需要调用Login方法&#xff0c;将调用的信息通过muduo库&#xff0c;同时进行了序列化和反序列化&#xff0c;发送到Rpcprovider上&#xff0c;RpcProvider通过对象和方法表来确定需要调用哪个服务对象的哪个方法。 UserRpcServiceRpc和UseRpcServiceRpcStub是继…

【practise】电话号码的字母组合

关于我&#xff1a; 睡觉待开机&#xff1a;个人主页 个人专栏: 《优选算法》《C语言》《CPP》 生活的理想&#xff0c;就是为了理想的生活! 作者留言 PDF版免费提供&#xff1a;倘若有需要&#xff0c;想拿我写的博客进行学习和交流&#xff0c;可以私信我将免费提供PDF版。…

立即升级你的前端技能!跟随这份Vue3项目搭建教程,从零基础到专业,一步步掌握最新Web开发技术,打造响应快速、界面优雅的现代网站。

全能开发套餐&#xff0c;轻松打造现代网站&#xff01;Vue3携手Vite带来开发新体验&#xff0c;结合Axios、Pinia、Element Plus实现功能与美观并重&#xff0c;TailwindCSS与DaisyUI提供设计灵活性&#xff0c;Router 4处理页面导航。从前端到后端&#xff0c;一站式解决&…

一、Matlab基础

文章目录 一、Matlab界面二、Matlab窗口常用命令三、Matlab的数据类型3.1 数值类型3.2 字符和字符串3.3 逻辑类型3.4 函数句柄3.5 结构类型3.6 细胞数组 四、Matlab的运算符4.1 算术运算符4.2 关系运算符4.3 逻辑运算4.4 运算符优先级 五、Matlab的矩阵5.1 矩阵的建立5.2 矩阵的…

【Linux】输入输出重定向

目录 一、概念 二、重定向的本质 三、系统调用接口dup和dup2 3.1 dup 3.2 dup2 一、概念 在之前对Linux的学习中&#xff0c;我们有接触过一系列的重定向命令&#xff0c;例如 >、>>等 它们可以将一个命令的输出或输入重定向到其他地方&#xff0c;如echo命令…

开源应用:AI监测如何成为社会安全的智能盾牌

社会背景 随着社会的快速发展&#xff0c;社会安全管理正站在一个新时代的门槛上。社会对安全管理的需求不断增长&#xff0c;传统的安全措施已难以满足现代社会的需求。AI技术以其独特的数据处理和模式识别能力&#xff0c;正在成为我们社会安全的智能盾牌。 AI大模型识别功能…

3.js - 物理引擎终极

import * as THREE from three import { OrbitControls } from three/examples/jsm/controls/OrbitControls import gsap from gsap // 导入动画库 import * as dat from dat.gui // 导入dat.gui// 导入 cannon-es 引擎 import * as CANNON from cannon-es// -----------------…

探索GPT-4o mini:开启AI驱动的开发新时代

文章目录 GPT-4o mini&#xff1a;小身材&#xff0c;大能量成本与效能的完美平衡 AI辅助开发&#xff1a;从构想到现实自动化文档编写智能代码审查 提升创新能力&#xff1a;AI驱动的新常态模型驱动的设计思维 社区共享与合作知识共享的重要性 未来展望&#xff1a;AI与人类的…

<数据集>agv仓储机器人识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;1514张 标注数量(xml文件个数)&#xff1a;1514 标注数量(txt文件个数)&#xff1a;1514 标注类别数&#xff1a;3 标注类别名称&#xff1a;[G1PB2000_Paleteira_AGVS BYD, G1RB5000, AGV-P] 序号类别名称图片数…

6自由度机械手DH坐标系建立

一、建立机械臂DH坐标系 Z为转动关节的转轴&#xff0c;Xi垂直于关节轴i和i1所在的平面&#xff0c;则根据上述方法可以建立坐标系如下图&#xff1a; 二、DH参数表 DH参数设定&#xff1a;机器人的每个连杆可以用4个运动学参数表示&#xff0c;DH法建立坐标系&#xff0c;xi-…

[开端]如何看待“低代码”开发平台的兴起

如何看待“低代码”开发平台的兴起&#xff1f; 近年来&#xff0c;“低代码”开发平台如雨后春笋般涌现&#xff0c;承诺让非专业人士也能快速构建应用程序。这种新兴技术正在挑战传统软件开发模式&#xff0c;引发了IT行业的广泛讨论。低代码平台是提高效率的利器&#xff0…

[开端]JAVA抽象类使用到redis观察着

一、绪论 当redis内容发生变化时需要通知一些观察者做一些动作怎么做&#xff1f; 二、JAVA抽象类 public abstract class AbstractRedisChangeListener {public abstract void change(String key, String value, String crudType); }使用abstract进行修饰一个类 其中抽象类…

SpringBoot中如何自定义自己的过滤器Filter(简易版)

本文不再说SpringMVC中的写法&#xff0c;毕竟现在项目都是SpringBoot&#xff0c;我们还是尽量使用SpringBoot的写法&#xff0c;首先了解一下Filter。 说白了&#xff0c;就是在请求到达服务器之前进行拦截&#xff0c;一般使用场景是拦截登录进行权限校验&#xff0c;当然一…

安装python+python的基础语法

安装python python2为内置&#xff0c;安装python3----3.6.8 最新安装3.12使用源码安装 1.查看yum源&#xff0c;epel [rootpython01 ~]# yum list installed |grep epel 2.安装python3 [rootpython01 ~]# yum -y install python3 3.查看版本 [rootpython01 ~]# python…