基于javaagent的http智能缓存方案
智能缓存方案有很多种,比如服务的代理,http代理层,可以在nginx层做;或者应用的代理,agent的方式去做,本次我们选择通过javaagent的方式去实现。
一、代码结构如下:
1、agent包
agent入口
2、annotation包
提供默认策略与默认缓存的注解
3、constants包
提供一些常量
4、data包
请求与响应数据对象,以及生成请求唯一编码和包含响应的唯一编码
5、filter包
拦截请求,基于策略去缓存
6、storage包(spi扩展)
缓存方案,主要包含分布式缓存redis、本地缓存guavacache以及自己实现的localcache,CacheLoader为缓存实例加载器,初始化时加载
7、strategy包(spi扩展)
缓存策略,目前有长期缓存、固定时间段缓存、固定时间点缓存、随机缓存等策略,另外缓存策略管理器在该包中
8、utils包
工具类
9、wrapper包
request和response的包装类
二、时序图
三、初始化流程
1、加载agent
2、初始化过滤器
3、初始化缓存策略管理器 → 初始化策略 → 初始化缓存实例
四、缓存处理流程
如时序图所示
备注:request数据封装为RequestData,基于requestData初始化AccessData,初始化过程中,对请求的地址、方法、参数、token等进行字典排序后做md5,生成每个请求唯一的accessId
通过应用获取响应后,response转为ResponseData,基于responseData和accessData,生成唯一的请求响应identityId,存储在redis/multiset等数据结构中
五、可配置项
1、缓存
包括:本地缓存、分布式缓存,可通过spi扩展缓存,可通过启动命令选择缓存,优先级:启动命令 > spi扩展 > 默认注解
2、策略
包括:长期缓存、固定时间段缓存、固定时间点缓存、随机缓存等策略,可通过spi扩展策略,可通过启动命令选择策略,也可通过启动参数设定策略和固定的时间:天、周和周期访问次数阈值
策略:strategy(long、cycle、duration、random)、缓存:cache(guava、redis、local)、时长:duration(week、day、hour)、可缓存访问次数阈值:period
六、设计模式
1、单例模式(缓存管理器保持单例)
2、策略模式(缓存策略和缓存基于加载策略加载)
3、模板模式(缓存加载器定义好获取缓存实例模板,构造方法中进行初始化)
4、装饰器模式(对request和response对象进行包装,获取请求和响应对象)
七、注意点
1、当缓存策略为固定时间段缓存的时候,再次访问会刷新缓存
2、 策略为cycle和duration时,才可配置缓存时长duration
八、使用方式
1、固定时长策略(时长为一天,访问3次)
java -javaagent:agent-1.0-SNAPSHOT.jar -Dstrategy=cycle -Dduration=day -Dperiod=3 -jar web-1.0-SNAPSHOT.jar
2、长期策略(默认策略)
java -javaagent:agent-1.0-SNAPSHOT.jar -jar web-1.0-SNAPSHOT.jar