OpenFeign高级用法:缓存、QueryMap、MatrixVariable、CollectionFormat优雅地远程调用

码到三十五 : 个人主页

微服务架构中,服务之间的通信变得尤为关键。OpenFeign,一个声明式的Web服务客户端,使得REST API的调用变得更加简单和优雅。OpenFeign集成了Ribbon和Hystrix,具有负载均衡和容错的能力,并且在Spring Cloud的加持下,可以轻松地与注册中心(nacos,Eureka)和配置中心(Spring Cloud Config,nacos)等组件集成。

目录

      • 一、OpenFeign简介
      • 二、OpenFeign的使用
        • 1. 添加依赖
        • 2. 启用OpenFeign
        • 3. 定义Feign客户端
        • 4. 注入和使用Feign客户端
      • 三、@FeignClient注解
      • 四、feign缓存
        • 1. Feign缓存的意义
        • 2. feign缓存的使用
      • 五、@QueryMap支持
        • 使用方法
      • 六、@MatrixVariable支持
        • 使用 `@MatrixVariable`
        • URI 结构
      • 七、@CollectionFormat支持
      • 八、其他高级特性
      • 总结

一、OpenFeign简介

OpenFeign是一个声明式的Web服务客户端,它使得编写HTTP客户端变得更简单。使用Feign,你只需要创建一个接口并用注解来配置它,Feign会自动完成接口的实现。OpenFeign具有可插拔的注解特性,同时也支持JAX-RS注解和Feign注解。此外,它还支持负载均衡和容错,通过集成Spring Cloud alibaba和Spring Cloud,可以轻松地查找服务并进行调用。
在这里插入图片描述

二、OpenFeign的使用

1. 添加依赖

首先需要在项目中添加OpenFeign的依赖。Maven可以在pom.xml文件中添加以下依赖:

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2. 启用OpenFeign

在spring Boot应用主类上添加@EnableFeignClients注解,以启用OpenFeign。

@SpringBootApplication
@EnableFeignClients
public class MyApp {public static void main(String[] args) {SpringApplication.run(MyApp.class, args);}
}
3. 定义Feign客户端

定义Feign客户端接口,并使用@FeignClient注解进行配置。假设有一个名为user-service的远程服务,可以这样定义一个Feign客户端:

@FeignClient("user-service")
public interface UserClient {@GetMapping("/users/{id}")User getUser(@PathVariable("id") Long id);
}

@FeignClient注解指定了要调用的远程服务的名称(在本例中是user-service),而接口中的方法则定义了具体的HTTP请求。@GetMapping注解表示这是一个GET请求,@PathVariable注解则用于从URL路径中提取参数。

4. 注入和使用Feign客户端

一旦你定义了Feign客户端接口,你就可以在你的服务中注入并使用它了。例如:

@Service
public class UserService {private final UserClient userClient;@Autowiredpublic UserService(UserClient userClient) {this.userClient = userClient;}public User getUser(Long userId) {return userClient.getUser(userId);}
}

在这个例子中,UserService类注入了UserClient的实例,并通过它来调用远程服务。当你调用getUser方法时,OpenFeign会自动将HTTP请求发送到指定的远程服务,并将响应映射到Java对象上。

在这里插入图片描述

三、@FeignClient注解

@FeignClient注解是用于标记Feign客户端接口的关键注解。通过此注解,OpenFeign能够自动生成接口的实现,使得开发者能够以声明式的方式调用远程服务。

下面是@FeignClient注解的详细参数及其用法:

  1. name

    • 含义:指定Feign客户端的名称,这个名称通常用于服务发现和服务间的负载均衡。在微服务架构中,这个名称通常与服务提供者在服务注册中心注册的服务名相对应。
    • 用法:@FeignClient(name = "serviceName"),其中"serviceName"是远程服务的名称。
  2. url

    • 含义:直接指定Feign客户端的请求地址。当该参数被设置时,Feign将不再从服务注册中心获取服务地址,而是直接使用这个URL作为请求的目标地址。
    • 用法:@FeignClient(url = "http://localhost:8080"),指定具体的服务地址。
    • 注意:如果同时指定了name和url,url会覆盖name中定义的地址。
  3. configuration

    • 含义:指定Feign客户端的配置类。在这个配置类中,可以自定义Feign的各种参数,如请求拦截器、编码器、解码器等。
    • 用法:@FeignClient(configuration = CustomFeignConfiguration.class),其中CustomFeignConfiguration是自定义的配置类。
  4. fallback

    • 含义:指定Feign客户端的降级方案。当请求出现异常时,如远程服务不可用或请求超时,Feign会返回fallback指定的实例的数据。这通常用于实现熔断和降级逻辑,以提高系统的稳定性。
    • 用法:@FeignClient(fallback = UserClientFallback.class),其中UserClientFallback是实现了Feign客户端接口的降级处理类。
  5. fallbackFactory

    • 含义:与fallback类似,但是提供了一个工厂类来创建降级逻辑的实例。这个工厂类需要实现FallbackFactory接口,并覆盖create(Throwable cause)方法。这个方法返回一个实现了Feign客户端接口的实例,用于处理降级逻辑。
    • 用法:通常与Hystrix等熔断框架结合使用,提供更灵活的降级策略。
  6. path

    • 含义:定义所有方法请求的基础路径。这样可以在Feign客户端的接口方法中省略这个基础路径。
    • 用法:@FeignClient(path = "/api/users"),指定所有请求的基础路径。
  7. qualifier

    • 含义:当使用Spring的自动装配功能时,可以使用qualifier参数来指定一个bean的名称,以便在多个相同类型的Feign客户端之间进行区分。
    • 用法:通常与@Qualifier注解结合使用,用于解决自动装配时的歧义。
  8. decode404

    • 含义:指定当服务端返回404状态时是否抛出FeignException。默认情况下,Feign会将404视为一个正常的响应(即不会抛出异常)。如果将此参数设置为true,则当服务端返回404状态时,Feign会抛出一个FeignException
    • 用法:在需要特殊处理404响应的场景中使用。
  9. primary

    • 含义:当存在多个相同类型的bean时,将此参数设置为true可以将该bean设置为首选bean。这样,在使用@Autowired进行自动装配时,Spring会优先选择标记为primary的bean。
    • 用法:在需要指定首选bean的场景中使用。

此外,@FeignClient注解还支持使用Spring Expression Language (SpEL) 表达式来动态地指定某些参数值。例如,可以使用${property.name}来从配置文件或环境变量中读取值。这种动态配置方式使得Feign客户端更加灵活和可配置。

四、feign缓存

1. Feign缓存的意义

在网络请求中,频繁地调用相同的接口会消耗大量的时间和资源。通过引入缓存机制,可以将一些不经常变化且查询频繁的数据存储在本地,从而减少对远程服务的调用,提高系统的响应速度和性能。

Feign 缓存是通过结合 Spring Framework 的缓存抽象来实现的。当你使用 @EnableCaching 注解时,Spring Boot 会启用对 @Cacheable@CacheEvict@CachePut 等缓存相关注解的支持。对于 Feign 客户端来说,这意味着你可以在 Feign 接口的方法上使用这些注解来控制缓存行为。

2. feign缓存的使用

启用缓存

首先在 Spring Boot 应用中使用 @EnableCaching 注解来启用缓存支持。这通常是在配置类或者启动类上添加的。

@EnableCaching
@SpringBootApplication
public class MyApp {public static void main(String[] args) {SpringApplication.run(MyApp.class, args);}
}

使用 @Cacheable 注解

在Feign 客户端接口中,可以使用 @Cacheable 注解来标记需要缓存的方法。这个注解指定了缓存的名称(cacheNames)和用于生成缓存键的表达式(key)。

@FeignClient("some-service")
public interface SomeServiceClient {@Cacheable(cacheNames = "infos", key = "#id")@GetMapping("/info/{id}")public Object info(@PathVariable("id") Integer id);
}

info 方法被标记为可缓存的。当这个方法被调用时,Spring 会检查名为 infos 的缓存中是否已经有对应 id 的缓存项。如果有,就直接返回缓存的数据;如果没有,就执行远程调用,并将结果存储到缓存中。

配置缓存管理器

通过配置文件来指定缓存管理器的类型和其他相关设置。使用了Redis 作为缓存存储,并配置了 Redis 缓存的相关参数。

spring:cache:type: redis # 指定缓存类型为 Redisredis:key-prefix: 'feign:' # 设置 Redis 缓存键的前缀time-to-live: 60s # 设置缓存的有效期为 60 秒

这样配置后,Feign 客户端的缓存数据会被存储到 Redis 中,并且每个缓存项的有效期为 60 秒。这意味着在 60 秒内对同一个 id 的多次请求都会直接从 Redis 缓存中获取数据,而不会触发远程调用。当缓存过期后,下一次请求会触发远程调用,并更新缓存。

五、@QueryMap支持

在Feign中使用@QueryMap或Spring Cloud OpenFeign中的@SpringQueryMap注解可以非常方便地将一个POJO(Plain Old Java Object,即简单的Java对象)或Map的属性和值映射为HTTP GET请求的查询参数。这在构建具有多个查询参数的API调用时特别有用,因为它允许你以声明式的方式组织这些参数,而不是手动构建查询字符串。

简单点说:可以将一个对象中的所有属性值以get的方式拼接到地址栏进行传递。

@QueryMap 和 @SpringQueryMap

  • @QueryMap: OpenFeign原生提供的注解,用于将POJO映射为查询参数。但是,它与Spring不兼容,因为它没有value属性。
  • @SpringQueryMap: Spring Cloud OpenFeign提供的与Spring兼容的注解,功能和@QueryMap类似,但可以在Spring环境中使用。
使用方法
  1. 定义参数对象:
    创建一个简单的Java类Params,并为其添加属性和getter方法。这些属性和方法将用于生成查询参数。
   public class Params {private Long id;private String name;// getters and setters}
  1. 在Feign客户端中使用@SpringQueryMap:
    在Feign客户端接口中,使用@GetMapping注解来定义一个GET请求,并使用@SpringQueryMap注解来标记你的POJO参数。
   @FeignClient("some-service")public interface DemoFeign {@GetMapping("/format")Object format(@SpringQueryMap Params params);}
  1. 调用Feign客户端:
    在服务中创建一个Params对象,设置其属性,并通过Feign客户端调用该方法。
   @GetMapping("/format")public Object format(Params params) {return demoFeign.format(params);}
  1. 日志输出:
    当调用这个方法时,Feign会自动将Params对象的属性转换为查询参数,并附加到GET请求的URL上。可以通过查看Feign的请求日志来确认这一点。
[DemoFeign#format] ---> GET http://localhost:8088/demos/format?name=test&id=111 HTTP/1.1

通过这种方式,可以简洁地将复杂的查询参数组织到一个对象中,并让Feign自动处理参数到查询字符串的转换,从而简化了代码并提高了可读性。

六、@MatrixVariable支持

在Spring Cloud OpenFeign中,@MatrixVariable 注解被用来处理 URI 中的矩阵变量。矩阵变量是 URI 的一种特殊参数形式,允许你在 URI 路径段中直接包含键值对。这种形式的参数在某些 RESTful API 设计中很有用,尤其是当你需要在 URI 中传递多个参数,并且这些参数都是针对同一资源的时候。

使用 @MatrixVariable

@MatrixVariable 被用来接收一个映射(Map),其中键是字符串,值是字符串列表。这在处理可能包含多个值的矩阵变量时非常有用。

@GetMapping("/m3/{params}")
public Object matrix3(@MatrixVariable Map<String, List<String>> params) {// ...
}

{params} 是一个路径占位符,它表示这个部分将由传递的矩阵变量填充。@MatrixVariable 注解告诉 Spring,params 参数应该接收来自 URI 矩阵变量的值。

URI 结构

一个包含矩阵变量的 URI 看起来像这样:

/m3/someValue;key1=value1a,value1b;key2=value2

在这个 URI 中:

  • /m3/someValue 是基本的路径。
  • ;key1=value1a,value1b;key2=value2 是矩阵变量部分,其中 key1key2 是矩阵变量的名称,value1a,value1bvalue2 是相应的值。

注意事项

  • 路径占位符的名称(在这个例子中是 {params})必须与 @MatrixVariable 注解的变量名一致,或者你可以在注解中明确指定名称。
  • 矩阵变量的值可以是单个值,也可以是用逗号分隔的多个值,这取决于你的 API 如何设计。
  • 使用矩阵变量时,要确保你的 URI 编码和解码逻辑能够正确处理这些变量,特别是当值中包含特殊字符时。

七、@CollectionFormat支持

在Feign中,@CollectionFormat 注解用于指定集合参数的格式化方式。当你在Feign客户端的方法中使用集合类型的参数(如 List<String>)时,这个注解能够帮助你定义如何将集合中的元素串联起来,以便通过HTTP请求发送给服务端。

@CollectionFormat 注解接受一个 feign.CollectionFormat 枚举值,该枚举定义了不同的格式化选项。在你提供的例子中,展示了两种格式化方式:CSVPIPES

  1. CSV (Comma Separated Values):
    当使用 feign.CollectionFormat.CSV 时,集合中的元素会使用逗号 , 进行分隔。这是最常见和默认的格式。

    示例:

    @GetMapping("/cf")
    @CollectionFormat(feign.CollectionFormat.CSV)
    public Object cf(@RequestParam("ids") List<String> ids);
    

    调用该方法并传递 List.of("S1", "S2", "S3") 时,生成的URL查询参数会是 ids=S1,S2,S3

  2. PIPES (| separator):
    当使用 feign.CollectionFormat.PIPES 时,集合中的元素会使用竖线 | 进行分隔。

    示例:

    @GetMapping("/cf")
    @CollectionFormat(feign.CollectionFormat.PIPES)
    public Object cf(@RequestParam("ids") List<String> ids);
    

    同样地,调用该方法并传递 List.of("S1", "S2", "S3") 时,生成的URL查询参数会是 ids=S1|S2|S3

这个注解在处理需要特定格式的集合参数时非常有用,尤其是当服务端期望接收特定格式的集合数据时。通过使用 @CollectionFormat,你可以确保Feign客户端发送的请求符合服务端的期望,从而避免格式错误导致的问题。

@CollectionFormat 可以应用于整个Feign客户端类或者单独的方法上。如果应用于类上,它将影响该类中所有使用集合参数的方法。如果只需要对某个特定方法应用不同的集合格式,可以将注解直接应用于该方法上。

八、其他高级特性

OpenFeign还提供了许多高级特性,如负载均衡、容错、请求拦截和重试等。这些特性可以帮助构建更健壮、更可靠的微服务架构。

  • 负载均衡:OpenFeign集成了Ribbon,支持多种负载均衡策略,如轮询、随机等。你可以根据需要选择合适的策略来分发请求。
  • 容错:通过与Hystrix的集成,OpenFeign提供了熔断和降级功能。当远程服务出现故障或响应过慢时,可以自动切换到降级逻辑,保证系统的稳定性。
  • 请求拦截:可以使用RequestInterceptor接口实现自定义的请求拦截器,用于在发送请求之前或之后执行特定的逻辑,如添加认证信息、记录日志等。
  • 重试机制:OpenFeign支持配置请求的重试次数和间隔,以提高系统的可靠性。

总结

OpenFeign是一个强大的声明式Web服务客户端,它简化了远程服务调用的复杂性,并提供了负载均衡、容错等高级特性。通过使用OpenFeign,你可以更加专注于业务逻辑的实现,而无需关心底层的HTTP通信细节。希望本文能帮助你更好地理解和使用OpenFeign,构建高效、稳定的微服务架构。


听说...关注下面公众号的人都变牛了,纯技术,纯干货 !

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

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

相关文章

期权策略交易怎么做?怎么选择期权策略?

今天期权懂带你了解期权策略交易怎么做&#xff1f;怎么选择期权策略&#xff1f;期权交易是一种金融衍生品交易方式&#xff0c;它给予购买者在未来特定时间内以特定价格购买&#xff08;或出售&#xff09;标的资产的权利。 期权策略交易怎么做&#xff1f; 配对看跌期权&am…

vue+springboot实现echarts数据图统计

①vue项目修改配置 安装依赖&#xff1a; npm i echarts -S 修改路由index.js&#xff1a; import Vue from vue import VueRouter from vue-router import Manager from ../views/Manager.vue // 解决导航栏或者底部导航tabBar中的vue-router在3.0版本以上频繁点击菜单报错…

00.OpenLayers快速开始

00OpenLayers快速开始 官方文档&#xff1a; 快速开始&#xff1a;https://openlayers.org/doc/quickstart.html 需要node环境 一、设置新项目 npm create ol-app my-app cd my-app npm start第一个命令将创建一个名为 my-app​ 的目录&#xff08;如果您愿意&#xff0c;…

Python筑基之旅-MySQL数据库(一)

目录 一、MySQL数据库 1、简介 2、优点 2-1、开源和免费 2-2、高性能 2-3、可扩展性 2-4、易用性 2-5、灵活性 2-6、安全性和稳定性 2-7、丰富的功能 2-8、结合其他工具和服务 2-9、良好的兼容性和移植性 3、缺点 3-1、对大数据的支持有限 3-2、缺乏全文…

前端面试:项目细节重难点问题分享

面试官提问&#xff1a;我现在给你出一个项目实际遇到的问题&#xff1a;由于后端比较忙&#xff0c;所以我们这边的列表数据排序需要前端最近实现&#xff0c;那你会怎么实现排序呢&#xff1f; 答&#xff1a;我的回答&#xff1a;确实&#xff0c;数据都是由后端实现的&…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-19讲 串口实验UART

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

嵌入式硬件中PCB走线与过孔的电流承载能力分析

简介 使用FR4敷铜板PCBA上各个器件之间的电气连接是通过其各层敷着的铜箔走线和过孔来实现的。 由于不同产品、不同模块电流大小不同,为实现各个功能,设计人员需要知道所设计的走线和过孔能否承载相应的电流,以实现产品的功能,防止过流时产品烧毁。 文中介绍设计和测试FR4敷…

Windows系统安装OpenSSH使用VScode远程连接内网Linux服务器开发

文章目录 &#x1f4a1;推荐 前言1、安装OpenSSH2、VS Code配置ssh3. 局域网测试连接远程服务器4. 公网远程连接4.1 ubuntu安装cpolar内网穿透4.2 创建隧道映射4.3 测试公网远程连接 5. 配置固定TCP端口地址5.1 保留一个固定TCP端口地址5.2 配置固定TCP端口地址5.3 测试固定公网…

Nginx/阿里云/二级域名的配置和使用

阿里云域名解析配置如下&#xff1a; nginx配置如下&#xff1a; 访问地址&#xff1a; zhadmin.iotzzh.com image.png

Hotcoin Research | 市场洞察:2024年5月13日-5月19日

加密货币市场表现 目前&#xff0c;加密货币总市值为1.32万亿&#xff0c;BTC占比54.41%。 本周行情呈现震荡上行的态势&#xff0c;BTC在5月15日-16日&#xff0c;有一波大的拉升&#xff0c;周末为震荡行情。BTC现价为67125美元。 上涨的主要原因&#xff1a;美国4月CPI为3…

深度学习之基于YoloV5钢材微小缺陷检测系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与目标 在钢材生产过程中&#xff0c;由于各种因素&#xff0c;钢材表面可能会出现微小缺陷&#xff…

C# OpenCvSharp 模拟生成车辆运行视频

C# OpenCvSharp 模拟生成车辆运行视频 目录 效果 项目 代码 下载 效果 项目 代码 using OpenCvSharp; using OpenCvSharp.Extensions; using System; using System.Diagnostics; using System.Drawing; using System.Windows.Forms; namespace OpenCvSharp_Demo { p…

海外云手机的运作原理和适用场景

海外云手机是一种基于云计算技术的虚拟手机服务&#xff0c;通过将手机操作系统和应用程序托管在远程服务器上&#xff0c;实现用户可以通过互联网连接来使用和管理手机功能&#xff0c;而无需实际拥有物理手机。以下是有关海外云手机的相关信息&#xff1a; 海外云手机的运作原…

树莓派3B+入门(无外设)

昨日刚到一块树莓派3B&#xff0c;甚是喜爱&#xff0c;然半宿未眠 1、下载 在官网先下载烧录文件https://www.raspberrypi.com/software/ 下载完毕打开&#xff0c;选择&#xff0c;根据自己板子型号定 操作系统用最新的就行&#xff0c;64位不太稳定 储存卡&#xff0c;需…

超声波清洗机哪家好一点?四款超一流超声波清洗机大盘点

在追求极致清洁和维护精密工具、设备及珍贵物品的时代&#xff0c;超声波清洗机显得尤为重要。不仅因其高效、快速的清洁效果&#xff0c;更因其能够触及传统手工清洁所不能及的微小缝隙。无论你是珠宝设计师、机械工程师、还是热爱生活的普通家庭用户&#xff0c;超声波清洗机…

C语言例题43、打印倒立金字塔

#include <stdio.h>void main() {int i, j;for (i 5; i > 0; i--) {for (j 5; j > i; j--) {//输出空格printf(" ");}for (j 2 * i; j > 1; j--) {//输出星号printf("* ");}printf("\n");} }运行结果&#xff1a; 本章C语言…

【高阶数据结构(四)】图的最短路径问题

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:高阶数据结构专栏⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多数据结构   &#x1f51d;&#x1f51d; 高阶数据结构 1. 前言2. 单源最短…

基于springboot实现大学生就业需求分析系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现大学生就业需求分析系统演示 摘要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲…

移动端适配(rem,vw)+响应式布局

1.1视口标签&#xff08;逻辑分辨率和设备匹配&#xff09; 1.2二倍图&#xff08;防止失真&#xff09; 二、适配方案 一、rem 1.1媒体查询 1.2、引入js文件&#xff08;remflexble.js&#xff09; 1.2、less Less 是一种动态样式语言&#xff0c;它扩展了 CSS 的功能&#…

sklearn之线性回归——以上证红利指数为例

文章目录 线性回归概念使用sklearn实现上证中立指数预测内置数据集的加载与处理 外部数据集的加载和处理数据内容数据加载和处理 开始预测分割数据集导入线性回归模型查看线性回归模型的系数绘制预测结果预测效果评估 最终代码 线性回归 线性回归&#xff08;Linear Regressio…