Feign Client端redis缓存设计与实现

本文探讨了在FeignClient中应用缓存以减少HTTP请求,针对服务频繁调用的问题,作者选择了JetCache作为解决方案。详细介绍了问题背景、尝试的扩展方法和最终采用的JetCache配置,以及如何通过AOP实现自定义缓存策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基于JetCache的Feign Client端缓存

1、为什么要在Feign上加缓存

在我们的服务端已经使用redis缓存来解决一些数据查询问题,比如组织机构缓存、用户信息缓存,但是这些缓存都是在服务端的缓存。大家都知道Feign调用其实简化了http请求,如果某一个Feign方法需要有大量的重复的调用会有很多此的http请求,这样对服务器的消耗也是很大的,现在如果将一些Feign方法的返回结果缓存到redis中,客户端去调用的时候先去缓存里面取,如果缓存中存在则不用去进行http请求调用,直接返回结果,减少http请求调用

举个例子,如果一个Feign方法在一个小时内会被调用1万次,那我们可以将这个Feign方法的返回结果缓存在redis中,客户端去调用之前先到redis里面去取,这样一个小时就减少了9999次的http请求

前提条件,数据改动不大,基本很少改动,或者很长时间才会改动一次(场景要适配)

 

2、遇到的问题

初始方向是在我们的FeignConfig中做一些事情,在过滤器中获取Feign请求的参数,通过参数来判断是否需要缓存,缓存多长时间,最终没能成功,因为有一些参数在这里面是获取不到的

Feign API的几种构建方式都不支持扩展或者自定义编解码方式

自定义一个编解码的框架,类似基于histrixFeign 构建feign API,框架过于复杂,时间不允许。

 

3、方案确定

最终方案使用阿里的jetCache 缓存,这个缓存方案在我们系统中本身就有使用,所以基本就是现成的配置(见最终代码),只需要在Feign接口上加一个注解即可,使用方便,代码如下:

@Cached(name="AdminDeptService.queryLevelChildDeptId", expire = 3600, cacheType = CacheType.REMOTE)

保存到redis中如下图:

 

4、最终代码

加载bean 过程中 执行拦截器 扫描到注解方法 封装方法调用对象 加入到缓存中

 

调用方法 aop拦截器拦截到 当前方法属于封装调用方法对象规则 执行拦截器业务

 

jetCache 默认实现方案 使用jedis

 

 

获取配置文件中所有 redis为前缀的属性 赋值为当前redisPool配置

 

 

redis的使用

 

 

 

 

启动类上需要加注解,如下:

 

5、扩展方案

构建缓存方法对象的时通过自定义的匹配机制构建多个自定义的缓存对象

1.构建对象的规则怎么定义

2.构建对象后怎么缓存

通过redis key的命令策略实现多个方法调用缓存 执行不同的缓存机制

1.redis缓存需要特殊策略的方法和缓存机制

2.cached命名策略自定义,符合策略的命令单独取出

3.根据取出的redis命名策略选择对应的缓存策略

4.自定义cached注解的aop实现,符合缓存策略的方法进来后走自定义的实现

5.自定义的aop实现根据方法获取redis 缓存key然后获取缓存

问题

redis缓存的策略管理

cached默认拦截器和自定义的aop的执行冲突处理

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值