本文基于dubbo 2.7.5版本代码


服务结果缓存整体架构实现原理

  • 一、缓存数据清除策略配置
  • 二、缓存的实现原理


一、缓存数据清除策略配置

dubbo可以将远程服务的结果缓存到本地,后续访问同一个方法可以从缓存中获取。
是否使用缓存可以在方法级别、接口级别配置,也可以配置到ConsumerConfig、ProviderConfig中,使客户端所有的服务都使用缓存。
接口级别的配置如下:

@Reference(cache="lru")

版本2.7.5及以上可以使用注解配置方法级别的属性,配置方式如下:

@Reference(cache="lru",methods={@Method(name="process",cache="lru")})

二、缓存的实现原理

dubbo对数据缓存是通过CacheFilter过滤器实现的。CacheFilter类的注解是:

@Activate(group = {CONSUMER, PROVIDER}, value = CACHE_KEY)

通过group可以看出,CacheFilter既适用于客户端也适用于服务端,后面的value表示需要配置cache属性该过滤器才能生效(CACHE_KEY=cache)。本文只介绍客户端对CacheFilter的使用,服务端在其他文章中介绍。

CacheFilter过滤器生效是在类ProtocolFilterWrapper中完成的,ProtocolFilterWrapper类位于dubbo的协议层,协议层在客户端启动的时候会使用到。

dubbo本地缓存什么时候失效 dubbo缓存文件_spring


ProtocolFilterWrapper在上图蓝色部分引入到启动流程中,ProtocolFilterWrapper是Protocol接口对象的包装类,对Protocol对象调用必须通过ProtocolFilterWrapper。Protocol对象创建完Invoker对象(Invoker对象可以简单的认为是远程服务提供者)后,会返回到ProtocolFilterWrapper的buildInvokerChain方法中,然后buildInvokerChain使用SPI查找Filter实现类,使用Filter实现类对Invoker对象封装。这样每次访问远程服务时,都会经过这些Filter实现类。

下面介绍一下CacheFilter过滤器的具体实现。

当客户端访问服务时,会调用CacheFilter的invoke方法。

dubbo本地缓存什么时候失效 dubbo缓存文件_dubbo本地缓存什么时候失效_02


上图中的url可以理解为远程服务在注册中心注册的url,url里面包括了协议、服务ip、端口、调用的方法等信息。根据访问远程服务的请求参数生成key的规则是将每个参数转换为Json格式,使用逗号分隔参数拼装成一个字符串对象。

上图的cacheFactory属性是调用ExtensionLoader.getAdaptiveExtension通过内部的代码生成类生成的对象,类名字为CacheFactory$$Adaptive,在该类中根据cache属性值调用ExtensionLoader.getExtension找到名字对应的CacheFactory对象。