基于javaagent的http智能缓存方案

     智能缓存方案有很多种,比如服务的代理,http代理层,可以在nginx层做;或者应用的代理,agent的方式去做,本次我们选择通过javaagent的方式去实现。

一、代码结构如下:

基于javaagent的http智能缓存方案

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的包装类

 

二、时序图

基于javaagent的http智能缓存方案

三、初始化流程

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