Dubbo接口还自带LRU缓存?

336 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第10天,点击查看活动详情

在这里你能得到如下信息
通过这篇文章, 能从这里学到的点:
1. dubbo合并url参数?如何从对应的url参数Map中取对应key的值?
2.dubbo扩展点分类?dubbo如何对扩展点进行管理?

故障过程

dubbo provider端设置cache="lru",consumer端无任何cache配置,由第1规则的补充效果可知,consumer端缓存自动生效

dubbo consumer端基于lru的缓存(default size: 1000) 无法被及时清理, 存在内存泄漏, 最终触发FullGC, 集群雪崩

相关技术点展开介绍

  • 适用场景: dubbo SPI 扩展接口-缓存扩展

  • 原理介绍:

 1. 合并url参数 - 补充:provider端存在的配置consumer端若没有对应key的配置会自动补充 , 合并: 顺序为override > -D(jvm参数) >Consumer > Provider

例: 
补充:比如provider未配置cache="lru",cousumer端未配置cache,但consumer端cache的配置会拿provider端配置补充,最后consumer端cache="lru"
合并:比如provider和consumer端均配置了cache, 但provider端配置cache="lru", consumer端配置cache="threadlocal",由规则里的合并顺序知,最终consumer端cache="threadlocal"
                     

2. url参数Map中对应取key(比如cache时)值,若cousumer和provider端未配置值时,取默认值key(如default.cache)值(dubbo:consumerdubbo:provider级别的配置)

3.dubbo扩展点分两类:默认扩展点和用户自定义扩展点,dubbo为用户设置两个两个参数reference.filter(reference.filter="-cache")和service.filter进行扩展点是否active的管理

  • 如何使用:
    默认consumer端无此配置,由第1规则的补充效果可知,consumer端自动生效,所以
  1. 对于consumer端

    • 若某个ref dubbo服务不使用缓存可在dubbo:reference标签设置cache="false"即可
    • 若所有ref dubbo服务不使用缓存可在dubbo:consumer标签设置参数reference.filter="-cache"即可
  2. 对于provider端

    • 若某个dubbo服务不使用缓存可在dubbo:service标签设置cache="false"或不设置
    • 若所有 dubbo服务不使用缓存可在dubbo:provider标签设置参数service.filter="-cache"或不设置  
  3. 对于两端,若想正常使用cache时,设置对应有效值(lru/threadlocal/jcache)即可  

  • 注意点
    引用外部dubbo服务时, 确认provider是否使用cache, 若使用且consumer端不需要此cache,需将其屏蔽,防止内存泄露。

  • 相关点

  1. 合并url参数逻辑: com.alibaba.dubbo.registry.integration.RegistryDirectory#mergeUrl
  2. URL取参数parameters对应key值com.alibaba.dubbo.common.URL#getParameter(java.lang.String)
  3. CacheFIlter扩展点: com.alibaba.dubbo.cache.filter.CacheFilter
  4. build rpc invoker chain: com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper#buildInvokerChain
  5. 获取active扩展点: com.alibaba.dubbo.common.extension.ExtensionLoader#getActivateExtension(com.alibaba.dubbo.common.URL, java.lang.String, java.lang.String) 
  • 引申点
    如何更改cache size:  参数cache.size=500,如consumer端:
<dubbo:consumer>
   <dubbo:parameter key="cache.size" value="500"/>
</dubbo:consumer>

总结

     1.provider端最好不要配置cache-对所有未配置cache的cosumer将会带来内存泄漏的风险

     2.若provider端必须设置扩展点(如协议扩展,调用拦截扩展,序列化扩展,线程池扩展,负载均衡扩展等)时,注意对consumer端会造成的影响,谨慎设置合理的参数

     3.consumer使用dubbo服务时,注意provider端是否有SPI扩展点,若有评估对已方应用的影响,从而决定是否使用或者屏蔽该扩展点

相关参考

  •  dubbo扩展点可参考dubbo-dev-book