服务引用配置对象缓存

在 Dubbo3 中缓存 ReferenceConfig

功能描述

ReferenceConfig 实例很重,封装了与注册中心的连接和与提供者的连接,需要缓存。否则反复生成 ReferenceConfig 可能会导致性能问题,并出现内存和连接泄漏。在 API 方式编程时很容易忽略这个问题。

因此,从 2.4.0 版本开始,dubbo 提供了一个简单的工具类 ReferenceConfigCache 用于缓存 ReferenceConfig 实例。

使用场景

有一些场景,比如网关,会动态创建订阅。因为 ReferenceConfig 本身很重,会创建很多中间对象,而代理本身可以复用,所以这部分的属性可以通过 ReferenceConfigCache 缓存。

使用方法

清除和销毁

清除缓存中的 ReferenceConfig 会销毁 ReferenceConfig 并释放相应的资源。

ReferenceConfig<XxxService> reference = new ReferenceConfig<XxxService>();
reference.setInterface(XxxService.class);
reference.setVersion("1.0.0");
 …
ReferenceConfigCache cache = ReferenceConfigCache. getCache();
// The reference object will be cached in the cache.get method, and the ReferenceConfig.get method will be called to start the ReferenceConfig
XxxService xxxService = cache. get(reference);
// Notice! The Cache will hold the ReferenceConfig, do not call the destroy method of the ReferenceConfig outside, causing the ReferenceConfig in the Cache to become invalid!
// Use the xxxService object
xxxService. sayHello();
ReferenceConfigCache cache = ReferenceConfigCache. getCache();
cache.destroy(reference);

默认的 ReferenceConfigCache 认为相同服务组、接口和版本的 ReferenceConfig 是相同的,并缓存一份。也就是说,服务组、接口和版本是缓存键。

修改策略

您可以修改此策略,在 ReferenceConfigCache.getCache 时传递一个 KeyGenerator。有关详细信息,请参阅 ReferenceConfigCache 类的 方法。

KeyGenerator keyGenerator = new...
ReferenceConfigCache cache = ReferenceConfigCache. getCache(keyGenerator);

上次修改时间:2023 年 1 月 2 日:增强英文文档 (#1798) (95a9f4f6c1c)