持续创作,加速成长!这是我参与「掘金日新计划 · 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:consumer和dubbo:provider级别的配置)
3.dubbo扩展点分两类:默认扩展点和用户自定义扩展点,dubbo为用户设置两个两个参数reference.filter(reference.filter="-cache")和service.filter进行扩展点是否active的管理
- 如何使用:
默认consumer端无此配置,由第1规则的补充效果可知,consumer端自动生效,所以
-
对于consumer端
- 若某个ref dubbo服务不使用缓存可在dubbo:reference标签设置cache="false"即可
- 若所有ref dubbo服务不使用缓存可在dubbo:consumer标签设置参数reference.filter="-cache"即可
-
对于provider端
- 若某个dubbo服务不使用缓存可在dubbo:service标签设置cache="false"或不设置
- 若所有 dubbo服务不使用缓存可在dubbo:provider标签设置参数service.filter="-cache"或不设置
-
对于两端,若想正常使用cache时,设置对应有效值(lru/threadlocal/jcache)即可
-
注意点
引用外部dubbo服务时, 确认provider是否使用cache, 若使用且consumer端不需要此cache,需将其屏蔽,防止内存泄露。 -
相关点
- 合并url参数逻辑: com.alibaba.dubbo.registry.integration.RegistryDirectory#mergeUrl
- URL取参数parameters对应key值com.alibaba.dubbo.common.URL#getParameter(java.lang.String)
- CacheFIlter扩展点: com.alibaba.dubbo.cache.filter.CacheFilter
- build rpc invoker chain: com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper#buildInvokerChain
- 获取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