dubbo可以将远程服务的结果缓存到本地,以加快服务访问速度。
是否使用缓存可以配置到方法级别、接口级别,也可以配置到ConsumerConfig、ProviderConfig中,使客户端所有的服务都使用缓存。
接口级别的配置如下:
@Reference(cache="lru")
版本2.7.5可以使用注解配置方法级别的属性,配置方式如下:
@Reference(cache="lru",methods={@Method(name="process",cache="lru")})
对缓存数据的清理分为:lru,threadlocal,jcache。
lru:基于最近最少使用原则删除多余缓存,保持最热的数据被缓存。
threadlocal:当前线程缓存,比如一个页面渲染,用到很多 portal,每个 portal 都要去查用户信息,通过线程缓存,可以减少这种多余访问。
jcache:与 JSR107 集成,可以桥接各种缓存实现。
dubbo对数据缓存是通过CacheFilter过滤器实现的。CacheFilter类的注解是:
@Activate(group = {CONSUMER, PROVIDER}, value = CACHE_KEY)
通过group可以看出,CacheFilter既适用于客户端也适用于服务端,后面的value表示需要配置cache属性该过滤器才能生效。本文只介绍客户端对CacheFilter的使用,服务端在其他文章中介绍。
CacheFilter过滤器生效是在类ProtocolFilterWrapper中完成的,ProtocolFilterWrapper类位于dubbo的协议层,协议层在客户端启动的时候会使用到。
ProtocolFilterWrapper是在上图蓝色部分引入到启动流程中的,ProtocolFilterWrapper的buildInvokerChain方法查找Filter实现类,使用Filter实现类对上图中最后一个方块找到的Invoker对象封装。这样每次访问远程服务时,都会经过这些Filter实现类。
下面介绍一下CacheFilter过滤器的具体实现。
当客户端访问服务时,会调用CacheFilter的invoke方法。
上图中的url可以理解为远程服务在注册中心注册的url,url里面包括了协议、服务ip、端口、调用的方法等信息。根据访问远程服务的请求参数生成key的规则是将每个参数转换为Json格式,使用逗号分隔参数拼装成一个字符串对象。
上图的cacheFactory属性是调用ExtensionLoader.getAdaptiveExtension通过内部的代码生成类生成的对象,类名字为CacheFactory$$Adaptive。在CacheFactory$Adaptive中根据cache属性值调用ExtensionLoader.getExtension找到名字对应的CacheFactory对象。
下一篇文章介绍CacheFactory。