3.OpenFeign与负载均衡

news2024/9/23 19:28:40

文章目录

  • 什么是 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 与接口方法命保持一致
    @Resource
    private 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: 1
          depart-provider: #指定微服务设置,优先于全局设置,feginName即,@FeginClient注解value的值
            connect-timeout: 1
            read-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"]
        #最小请求大小,默认值2048
        min-request-size: 1024
      response:
        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 {
    @Bean
    public 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.coloradmin.cn/o/1976513.html

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

相关文章

清华计算几何-算法LowBound和ConvexHull(凸包)-GrahamScan

算法复杂度最低界限LowBound 算法求解复杂度是否存在一个最低界限&#xff0c;有时候想尽一切办法优化一个算法&#xff0c;去优化其复杂度&#xff0c;比如 清华计算几何-ConvexHull(凸包)-求极点InTriangle/ToLeft Test-CSDN博客 清华计算几何-ConvexHull(凸包)-求极边_计…

5.0-软件工程基础知识-考点分析

考试占比大概10分 软件工程概述软件过程模型 瀑布模型 瀑布模型变种-V模型 演化模型-原型模型 增量模型 喷泉模型 基于构件的开发模型 形式化方法模型需求分析系统设计系统测试运维软件质量和度量项目管理系统分析与设计概念结构化分析WebApp设计与用户界面设计

【小技巧】Keil5 和 NotePad++ 代码格式化 (Ctrl + Q) ( 插件安装astyle-3.5-x64 / NppAStyle)

Artistic Style 是适用于 C、C、C/CLI、 Objective-C 、C# 和 Java 编程语言的源代码缩进器、格式化器和美化器。它用 C 编写&#xff0c;可以从命令行使用&#xff0c;也可以作为库合并到另一个程序中。可以从命令行或选项文件输入选项。可以从用 C 以外的语言编写的程序中调用…

【qiankun微前端】基座主应用(vue2)+多个微应用(任意框架)

前言 前段时间对我们已有的工程进行了微前端改造,后来思考一下微前端的本质,查询了不少资料,从qiankun微前端示例中学到了不少。 微前端的核心,似乎应该是一个基座应用(含登录页,layout页,404和首页等),多个子应用(任意框架,提供内部页面内容),下面就对这个思路…

预警器件控制思考

预警器件控制思考 最小示例思想 当读取到环境信息与环境阈值的时候, 我们预警系统就要根据这些信息做出判断,是否要启动器件。 最简单的就是&#xff0c; 举温度temp的例子, temp(温度)与temp_th(阈值), 通过判断, 得出是否要启动器件. 如果在一段时间内, 一直是环境异常, 我…

私藏心术:低谷期翻身转运秘籍

私藏心术&#xff1a;低谷期翻身转运秘籍 在生活中&#xff0c;每个人都可能遇到低谷期&#xff0c;那些看似无法逾越的障碍和挫折。但记住&#xff0c;低谷期不是终点&#xff0c;而是重新站起来的起点。本文将分享一些实用的心术和策略&#xff0c;帮助你在低谷期实现翻身转…

第一个 Flask 项目

第一个 Flask 项目 安装环境创建项目启动程序访问项目参数说明Flask对象的初始化参数app.run()参数 应用程序配置参数 安装环境 mkvirtualenv flask_envpip install flask创建项目 启动程序 访问项目 http://127.0.0.1:5000/ 参数说明 Flask是一个用Python编写的轻量级Web应…

程序员学长 | 快速学习一个算法,CLIP

本文来源公众号“程序员学长”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;快速学习一个算法&#xff0c;CLIP 今天给大家介绍一个强大的算法模型&#xff0c;CLIP。 CLIP (Contrastive Language–Image Pre-training) 是一个…

机器学习流程图

第一部分&#xff1a;课程使用的技术栈 &#xff08;1&#xff09;Numpy 科学计算基础库&#xff0c;矩阵运算&#xff0c;线性代数 &#xff08;2&#xff09;matplotlib 绘图库&#xff0c;数据可视化 &#xff08;3&#xff09;Scikit 封装了各种分类&#xff0c;回归…

【课程总结】day19(下):Transformer源码深入理解

前言 在上一章【课程总结】day19(下):Transformer架构及注意力机制了解总结中,我们对Transformer架构以及注意力机制有了初步了解,本章将结合《The Annotated Transformer》中的源码,对Transformer的架构进行深入理解。 背景 《The Annotated Transformer》是由 Harva…

LaneATT推理详解及部署实现(上)

目录 前言1. 概述2. 环境配置3. Demo测试4. ONNX导出初探5. ONNX导出优化6. ONNX导出总结结语下载链接参考 前言 最近想关注下车道线检测任务&#xff0c;在 GitHub 上找了一个模型 LaneATT&#xff0c;想通过调试分析 LaneATT 代码把 LaneATT 模型导出来&#xff0c;并在 tens…

Java游戏源码:象棋网络对战版

学习java朋友们&#xff0c;福利来了&#xff0c;今天小编给大家带来了一款象棋网络对战版源码。 源码搭建和讲解 源码分为客户端和服务器&#xff0c;采用java原生 java.net.Socket 实现&#xff0c;服务器主循环代码&#xff1a; import java.net.ServerSocket; import jav…

二维码生成原理及解码原理

☝☝☝二维码配图 二维码 二维码&#xff08;Quick Response Code&#xff0c;简称QR码&#xff09;是一种广泛使用的二维条形码技术&#xff0c;由日本公司Denso Wave在1994年开发。二维码能有效地存储和传递信息&#xff0c;广泛应用于商品追溯、支付、广告等多个领域。二维…

Star-CCM+负体积网格检查与出现原因

要使网格可用于有限体积计算&#xff0c;每个网格单元必须具有正体积&#xff0c;否则初始化过程将失败&#xff0c;且模拟计算无法运行。 负体积网格单元可能会以多种不同的方式出现&#xff0c;但必须修复或从网格中移除&#xff0c;才能继续执行任何后续操作。 要检查体网…

<数据集>人员摔倒识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;8605张 标注数量(xml文件个数)&#xff1a;8605 标注数量(txt文件个数)&#xff1a;8605 标注类别数&#xff1a;1 标注类别名称&#xff1a;[fall] 序号类别名称图片数框数1fall860512275 使用标注工具&#xf…

当前生物信息学研究面临的四大机遇和挑战(特别是最后一个,一定要足够重视)...

生物信息学是应用计算方法分析生物数据&#xff0c;如 DNA&#xff0c;RNA&#xff0c;蛋白质和代谢物。生物信息学已成为促进我们对生命科学的理解以及开发新的诊断&#xff0c;治疗和生物技术产品的重要工具。本文我们将探讨生物信息学研究的一些当前趋势和发展&#xff0c;以…

如何快速入门 PyTorch ?

PyTorch是一个机器学习框架&#xff0c;主要依靠深度神经网络&#xff0c;目前已迅速成为机器学习领域中最可靠的框架之一。 PyTorch 的大部分基础代码源于 Ronan Collobert 等人 在 2007 年发起的 Torch7 项目&#xff0c;该项目源于 Yann LeCun 和 Leon Bottou 首创的编程语…

【C++题解】1249. 搬砖问题

欢迎关注本专栏《C从零基础到信奥赛入门级&#xff08;CSP-J&#xff09;》 问题&#xff1a;1249. 搬砖问题 类型&#xff1a;嵌套穷举 题目描述&#xff1a; 36 块砖&#xff0c; 36 人搬。男搬 4 &#xff0c;女搬 3 &#xff0c;两个小儿抬一砖。 要求一次全搬完。问需…

GitHub最全中文排行榜开源项目,助你轻松发现优质资源!

文章目录 GitHub-Chinese-Top-Charts&#xff1a;中文开发者的开源项目精选项目介绍项目特点核心功能1. 热门项目榜单2. 详细项目信息 如何使用覆盖范围软件类资料类 GitHub-Chinese-Top-Charts&#xff1a;中文开发者的开源项目精选 在全球范围内&#xff0c;GitHub已经成为了…

谷歌外链:提升网站权重的秘密武器!

谷歌外链之被称为提升网站权重的秘密武器&#xff0c;主要是因为它们对网站的搜索引擎排名有着直接且显著的影响 谷歌和其他搜索引擎使用外链作为衡量网站信任度和权威性的重要指标。当一个网站获得来自其他信誉良好的源的链接时&#xff0c;这被视为信任的投票。多个高质量链…