深入 OpenFeign:探索缓存、QueryMap、MatrixVariable 和 CollectionFormat 的高级用法以实现优雅的远程调用

免费多模型AI网站,支持豆包、GPT-4o、谷歌Gemini等AI模型,无限制使用,快去白嫖👉海鲸AI

一、OpenFeign简介

OpenFeign 是一个声明式的 HTTP 客户端,它使得我们可以通过简单的注解和接口定义来调用远程 HTTP 服务。与传统的 HTTP 客户端相比,OpenFeign 提供了更为简洁和优雅的调用方式,极大地提升了开发效率。

二、OpenFeign的使用
1. 添加依赖

在 Spring Boot 项目中使用 OpenFeign,需要在 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 FeignApplication {public static void main(String[] args) {SpringApplication.run(FeignApplication.class, args);}
}
3. 定义Feign客户端

定义一个接口,并使用 @FeignClient 注解来指定远程服务的名称和请求路径:

@FeignClient(name = "remoteService", url = "http://remote-service-url")
public interface RemoteServiceClient {@GetMapping("/data")String getData();@PostMapping("/data")String postData(@RequestBody Data data);
}
4. 注入和使用Feign客户端

在需要调用远程服务的地方注入 Feign 客户端,并进行调用:

@RestController
public class MyController {@Autowiredprivate RemoteServiceClient remoteServiceClient;@GetMapping("/fetch-data")public String fetchData() {return remoteServiceClient.getData();}@PostMapping("/send-data")public String sendData(@RequestBody Data data) {return remoteServiceClient.postData(data);}
}
三、@FeignClient注解

@FeignClient 注解用于定义一个 Feign 客户端,它可以指定远程服务的名称、URL、配置等。常用属性包括:

  • name:指定远程服务的名称。
  • url:指定远程服务的 URL。
  • configuration:指定 Feign 客户端的配置类。
四、Feign缓存
1. Feign缓存的意义

Feign 缓存可以减少重复的网络请求,提升应用性能,降低远程服务的负载。

2. Feign缓存的使用

可以通过配置 Feign 的缓存来实现请求的缓存。以下是一个简单的示例:

@Configuration
public class FeignConfig {@Beanpublic Feign.Builder feignBuilder() {return Feign.builder().requestInterceptor(new FeignCacheInterceptor());}
}public class FeignCacheInterceptor implements RequestInterceptor {private final Cache<String, Response> cache = CacheBuilder.newBuilder().expireAfterWrite(10, TimeUnit.MINUTES).build();@Overridepublic void apply(RequestTemplate template) {String key = template.url();Response cachedResponse = cache.getIfPresent(key);if (cachedResponse != null) {template.header("If-None-Match", cachedResponse.headers().get("ETag"));}}
}
五、@QueryMap支持

@QueryMap 注解用于将一个对象转换为查询参数:

@FeignClient(name = "remoteService")
public interface RemoteServiceClient {@GetMapping("/search")String search(@QueryMap Map<String, Object> queryMap);
}@RestController
public class MyController {@Autowiredprivate RemoteServiceClient remoteServiceClient;@GetMapping("/search")public String search(@RequestParam Map<String, Object> queryMap) {return remoteServiceClient.search(queryMap);}
}
六、@MatrixVariable支持
使用 @MatrixVariable

@MatrixVariable 注解用于处理矩阵变量:

@FeignClient(name = "remoteService")
public interface RemoteServiceClient {@GetMapping("/matrix/{path}")String getMatrixVariable(@PathVariable("path") String path, @MatrixVariable Map<String, String> matrixVars);
}@RestController
public class MyController {@Autowiredprivate RemoteServiceClient remoteServiceClient;@GetMapping("/matrix/{path}")public String getMatrixVariable(@PathVariable("path") String path, @MatrixVariable Map<String, String> matrixVars) {return remoteServiceClient.getMatrixVariable(path, matrixVars);}
}
URI 结构

矩阵变量通常出现在路径变量中,例如:/matrix/var1;key1=value1;key2=value2/var2;key3=value3

七、@CollectionFormat支持

@CollectionFormat 注解用于处理集合类型的查询参数:

@FeignClient(name = "remoteService")
public interface RemoteServiceClient {@GetMapping("/collection")String getCollection(@RequestParam("ids") List<String> ids);
}@RestController
public class MyController {@Autowiredprivate RemoteServiceClient remoteServiceClient;@GetMapping("/collection")public String getCollection(@RequestParam List<String> ids) {return remoteServiceClient.getCollection(ids);}
}
八、其他高级特性

OpenFeign 还支持其他高级特性,如自定义编码器和解码器、错误处理、日志记录等。可以通过配置类来实现这些功能:

@Configuration
public class FeignConfig {@Beanpublic Encoder feignEncoder() {return new JacksonEncoder();}@Beanpublic Decoder feignDecoder() {return new JacksonDecoder();}@Beanpublic ErrorDecoder feignErrorDecoder() {return new CustomErrorDecoder();}
}
总结

OpenFeign 提供了丰富的功能和灵活的配置,使得远程调用变得更加简单和优雅。通过本文的介绍,相信大家已经掌握了 OpenFeign 的高级用法,包括缓存、QueryMap、MatrixVariable、CollectionFormat 等。希望这些内容能够帮助大家在实际项目中更好地应用 OpenFeign。

免费多模型AI网站,支持豆包、GPT-4o、谷歌Gemini等AI模型,无限制使用,快去白嫖👉海鲸AI

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

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

相关文章

K8S集群再搭建

前述&#xff1a;总体是非常简单的&#xff0c;就是过程繁琐&#xff0c;不过都是些重复的操作 master成员: [controller-manager, scheduler, api-server, etcd, proxy,kubelet] node成员: [kubelet, proxy] master要修改的配置文件有 1. vi /etc/etcd/etcd.conf # 数…

Mokito的一些API

Mockito是一个Java单元测试框架&#xff0c;它允许开发者创建和配置模拟对象&#xff08;mock objects&#xff09;&#xff0c;以便在隔离的环境中测试代码&#xff0c;尤其是当实际对象难以构造或其行为不确定时。下面是一些核心的Mockito API及其使用场景和代码示例。 基础…

wordpress教程视频 wordpress教程网盘 wordpress教程推荐wordpress教程网

WordPress&#xff0c;作为一款强大且灵活的开源内容管理系统&#xff0c;已成为许多网站开发者与运营者的首选。其强大的功能、丰富的插件以及易于上手的特点&#xff0c;使得无论是初学者还是专业开发者都能轻松构建出个性化的网站。然而&#xff0c;对于初学者来说&#xff…

JUnit5标记测试用例

使用场景&#xff1a; 通过Tag对用例分组&#xff1a; 环境分组&#xff1a;测试环境、预发布环境阶段分组&#xff1a;冒烟用例版本分组&#xff1a;V1.1、V1.2 Tag标记用例&#xff1a; 设置标签根据标签执行 结合Maven执行结合测试套件执行 设置标签&#xff1a; 通过T…

NER 数据集格式转换

NER 数据集格式 格式一 某些地方的数据和标签拆成两个文件了 sentences.txt 如 何 解 决 足 球 界 长 期 存 在 的 诸 多 矛 盾 &#xff0c; 重 振 昔 日 津 门 足 球 的 雄 风 &#xff0c; 成 为 天 津 足 坛 上 下 内 外 到 处 议 论 的 话 题 。 该 县 一 手 抓 农 业…

【Spring Cloud】全面解析服务容错中间件 Sentinel 持久化两种模式

文章目录 推送模式本地文件持久化&#xff08;拉模式&#xff09;配置yml编写处理类添加配置演示 配置中心持久化&#xff08;推模式&#xff09;修改nacos在sentinel中生效引入依赖配置文件 修改sentinel在nacos中生效下载源码更改代码演示 总结 推送模式 Sentinel 规则的推送…

allegro 无法删除Xnet

allegro 无法删除Xnet Orcad中打开Constraint Manager之后&#xff0c;再生成网表&#xff0c;导入PCB后就会出现一堆Xnet网络。无法去除Xnet。 解决办法 在原理图ORCAD中&#xff0c; 1、打开Edit Object properties 2、选择Filter by:Capture 3、点击New Property 4、设置…

火山引擎边缘云亮相 Force 原动力大会,探索 AI 应用新范式

5月15日&#xff0c;2024 春季火山引擎 FORCE 原动力大会在北京正式举办。大会聚焦 AI 主题&#xff0c;以大模型应用为核心、以 AI 落地为导向&#xff0c;展示了火山引擎在大模型、云计算领域的实践应用&#xff0c;携手汽车、手机终端、金融、消费、互联网等领域的专家和企业…

2024042102-array-list

数组 Array 一、前言 数组是数据结构还是数据类型&#xff1f; 数组只是个名称&#xff0c;它可以描述一组操作&#xff0c;也可以命名这组操作。数组的数据操作&#xff0c;是通过 idx->val 的方式来处理。它不是具体要求内存上要存储着连续的数据才叫数据&#xff0c;而…

js积累三(web页面一段时间未操作,退出登录)

//核心代码&#xff0c;已封装function CountDownLogout() {/* if 30 seconds no operation then logout */var maxTime 30; // seconds&#xff0c;可自行修改时长var time_time maxTime;/* 鼠标点击事件 */$(document).mousedown(function(){time_time maxTime; //…

Spring Aop对本地事务的影响

1.Transactional声明式事物也是基于aop实现的&#xff0c;public方法加了Transactional注解后&#xff0c;已经成功的创建了事务&#xff0c;但是当前方法仍在方法拦截器中 2.业务方法发生异常之后的处理 判断回滚条件&#xff1a; 如果自定义了RollbackRuleAttribute列表&am…

EI会议的最佳论文奖是什么?如何申请?

EI会议的最佳论文奖通常是指在EI&#xff08;工程索引&#xff0c;Engineering Index&#xff09;收录的学术会议中&#xff0c;评选出的表现最优秀的论文奖项。以下是关于该奖项的一些基本信息及申请步骤&#xff1a; 最佳论文奖的含义 评选标准&#xff1a;最佳论文奖通常基…

多线程、进程、线程五种状态、synchronized、volatile、Lock、CAS、死锁、ThreadLocal

1、并发编程 并发编程三要素 原子性&#xff1a;只一个操作要么全部成功&#xff0c;要么全部失败可见性&#xff1a;一个线程对共享变量的修改&#xff0c;其他线程能够立刻看到有序性&#xff1a;程序执行的顺序按照代码的先后顺序执行 synchronized&#xff0c;Lock解决原…

前端vue 动态加载ts文件,动态调用ts内的方法

业务场景: 在某个业务场景中, 我们需要在数据库配置ts文件路径,和需要调用的函数名称, 前端需要再指定的场景下,触发对应的函数, 并执行处理逻辑,返回结果. 实现: 这是一个数据库配置生成的动态表单 动态校验的例子, 需要引用动态的函数校验 任意一个js文件, common1.ts c…

大模型日报|今日必读的 13 篇大模型论文

大家好&#xff0c;今日必读的大模型论文来啦&#xff01; 1.MIT新研究&#xff1a;并非所有语言模型特征都是线性的 最近的研究提出了线性表征假说&#xff1a;语言模型通过操作激活空间中概念&#xff08;“特征”&#xff09;的一维表征来执行计算。与此相反&#xff0c;来…

CHI dataless 传输——CHI(4)

上篇介绍了read的操作类型&#xff0c;本篇我们来介绍一下dataless 目录 一、dataless操作概览 二、Non-CMO (Non-Cache Maintenance Operation) 1、CleanUnique 2、StashOnce and StashOnceSep 3、Evict 三、CMO (Cache Maintenance Operation) 一、dataless操作概览 名…

C# 中的 Dictionary<TKey, TValue> 类

Dictionary<TKey, TValue> 是 C# 中的一个泛型集合类,它提供了一种键值对的存储结构,可以用来存储和快速访问数据。它的主要特点如下: 键值对结构: Dictionary 中的每个元素都是一个键值对,键必须是唯一的,值可以重复。 快速访问: Dictionary 基于哈希表实现,可以提供 O…

大白话聊聊MySQL查询之五子句(知识简单但重要)

前言&#xff1a; 在日常开发中&#xff0c;查询数据占很大的比重&#xff0c;在使用 MySQL 数据库进行查询时&#xff0c;我们经常需要通过各种条件和规则来筛选和排序数据。要实现这些功能&#xff0c;就不得不使用以下这些子句&#xff1a;WHERE、ORDER BY、GROUP BY、HAVI…

物联网层次架构设计

物联网可以分为三个层次&#xff0c;底层是用来感知数据的感知层&#xff0c;即利用传感器、二维码、RFID等设备随时随地获取物体的信息。第二层是数据传输处理的网络层&#xff0c;即通过各种传感网络与互联网的融合&#xff0c;将对象当前的信息实时准确地传递出去。第三层则…

忍の摸头之术游戏娱乐源码

本资源提供给大家学习及参考研究借鉴美工之用&#xff0c;请勿用于商业和非法用途&#xff0c;无任何技术支持&#xff01; 忍の摸头之术游戏娱乐源码&#xff0c;抖音上面非常火的摸头杀画面,看得我眼花缭乱,源码拿去玩吧&#xff1b; 目录说明 忍の摸头之术&#xff1a;域…