基于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的执行冲突处理