From e11f2bb99c310edf0aad152f6dae7f0c0249a3a5 Mon Sep 17 00:00:00 2001 From: YunaiV <> Date: Sun, 15 Apr 2018 19:43:07 +0800 Subject: [PATCH] =?UTF-8?q?CacheFilter=20=E8=BF=87=E6=BB=A4=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/alibaba/dubbo/cache/Cache.java | 16 +++++++++++++++- .../com/alibaba/dubbo/cache/CacheFactory.java | 10 +++++++++- .../dubbo/cache/filter/CacheFilter.java | 15 +++++++++++++++ .../cache/support/AbstractCacheFactory.java | 16 ++++++++++++++++ .../dubbo/cache/support/jcache/JCache.java | 18 +++++++++++++++++- .../cache/support/jcache/JCacheFactory.java | 1 + .../dubbo/cache/support/lru/LruCache.java | 9 +++++++++ .../cache/support/lru/LruCacheFactory.java | 1 + .../support/threadlocal/ThreadLocalCache.java | 10 ++++++++-- .../threadlocal/ThreadLocalCacheFactory.java | 1 + 10 files changed, 92 insertions(+), 5 deletions(-) diff --git a/dubbo-filter/dubbo-filter-cache/src/main/java/com/alibaba/dubbo/cache/Cache.java b/dubbo-filter/dubbo-filter-cache/src/main/java/com/alibaba/dubbo/cache/Cache.java index d4116307f..c8e2b330e 100644 --- a/dubbo-filter/dubbo-filter-cache/src/main/java/com/alibaba/dubbo/cache/Cache.java +++ b/dubbo-filter/dubbo-filter-cache/src/main/java/com/alibaba/dubbo/cache/Cache.java @@ -18,11 +18,25 @@ package com.alibaba.dubbo.cache; /** * Cache + * + * 缓存容器接口 */ public interface Cache { + /** + * 添加键值 + * + * @param key 键 + * @param value 值 + */ void put(Object key, Object value); + /** + * 获得值 + * + * @param key 键 + * @return 值 + */ Object get(Object key); -} +} \ No newline at end of file diff --git a/dubbo-filter/dubbo-filter-cache/src/main/java/com/alibaba/dubbo/cache/CacheFactory.java b/dubbo-filter/dubbo-filter-cache/src/main/java/com/alibaba/dubbo/cache/CacheFactory.java index d2bc56d99..47c314f53 100644 --- a/dubbo-filter/dubbo-filter-cache/src/main/java/com/alibaba/dubbo/cache/CacheFactory.java +++ b/dubbo-filter/dubbo-filter-cache/src/main/java/com/alibaba/dubbo/cache/CacheFactory.java @@ -22,11 +22,19 @@ import com.alibaba.dubbo.common.extension.SPI; /** * CacheFactory + * + * 缓存工厂接口 */ @SPI("lru") public interface CacheFactory { + /** + * 获得缓存对象 + * + * @param url URL 对象 + * @return 缓存对象 + */ @Adaptive("cache") Cache getCache(URL url); -} +} \ No newline at end of file diff --git a/dubbo-filter/dubbo-filter-cache/src/main/java/com/alibaba/dubbo/cache/filter/CacheFilter.java b/dubbo-filter/dubbo-filter-cache/src/main/java/com/alibaba/dubbo/cache/filter/CacheFilter.java index 8b4347397..18648d4a4 100644 --- a/dubbo-filter/dubbo-filter-cache/src/main/java/com/alibaba/dubbo/cache/filter/CacheFilter.java +++ b/dubbo-filter/dubbo-filter-cache/src/main/java/com/alibaba/dubbo/cache/filter/CacheFilter.java @@ -31,32 +31,47 @@ import com.alibaba.dubbo.rpc.RpcResult; /** * CacheFilter + * + * 缓存过滤器实现类 */ @Activate(group = {Constants.CONSUMER, Constants.PROVIDER}, value = Constants.CACHE_KEY) public class CacheFilter implements Filter { + /** + * CacheFactory$Adaptive 对象。 + * + * 通过 Dubbo SPI 机制,调用 {@link #setCacheFactory(CacheFactory)} 方法,进行注入 + */ private CacheFactory cacheFactory; public void setCacheFactory(CacheFactory cacheFactory) { this.cacheFactory = cacheFactory; } + @Override public Result invoke(Invoker invoker, Invocation invocation) throws RpcException { + // 方法开启 Cache 功能 if (cacheFactory != null && ConfigUtils.isNotEmpty(invoker.getUrl().getMethodParameter(invocation.getMethodName(), Constants.CACHE_KEY))) { + // 基于 URL + Method 为维度,获得 Cache 对象。 Cache cache = cacheFactory.getCache(invoker.getUrl().addParameter(Constants.METHOD_KEY, invocation.getMethodName())); if (cache != null) { + // 获得 Cache Key String key = StringUtils.toArgumentString(invocation.getArguments()); + // 从缓存中获得结果。若存在,创建 RpcResult 对象。 Object value = cache.get(key); if (value != null) { return new RpcResult(value); } + // 服务调用 Result result = invoker.invoke(invocation); + // 若非异常结果,缓存结果 if (!result.hasException()) { cache.put(key, result.getValue()); } return result; } } + // 服务调用 return invoker.invoke(invocation); } diff --git a/dubbo-filter/dubbo-filter-cache/src/main/java/com/alibaba/dubbo/cache/support/AbstractCacheFactory.java b/dubbo-filter/dubbo-filter-cache/src/main/java/com/alibaba/dubbo/cache/support/AbstractCacheFactory.java index 06713da56..547e762e8 100644 --- a/dubbo-filter/dubbo-filter-cache/src/main/java/com/alibaba/dubbo/cache/support/AbstractCacheFactory.java +++ b/dubbo-filter/dubbo-filter-cache/src/main/java/com/alibaba/dubbo/cache/support/AbstractCacheFactory.java @@ -25,14 +25,24 @@ import java.util.concurrent.ConcurrentMap; /** * AbstractCacheFactory + * + * Cache 工厂抽象类 */ public abstract class AbstractCacheFactory implements CacheFactory { + /** + * Cache 集合 + * + * key:URL + */ private final ConcurrentMap caches = new ConcurrentHashMap(); + @Override public Cache getCache(URL url) { + // 获得 Cache 对象 String key = url.toFullString(); Cache cache = caches.get(key); + // 不存在,创建 Cache 对象,并缓存 if (cache == null) { caches.put(key, createCache(url)); cache = caches.get(key); @@ -40,6 +50,12 @@ public abstract class AbstractCacheFactory implements CacheFactory { return cache; } + /** + * 创建 Cache 对象 + * + * @param url URL + * @return Cache 对象 + */ protected abstract Cache createCache(URL url); } diff --git a/dubbo-filter/dubbo-filter-cache/src/main/java/com/alibaba/dubbo/cache/support/jcache/JCache.java b/dubbo-filter/dubbo-filter-cache/src/main/java/com/alibaba/dubbo/cache/support/jcache/JCache.java index 8ad802b03..6427eddf9 100644 --- a/dubbo-filter/dubbo-filter-cache/src/main/java/com/alibaba/dubbo/cache/support/jcache/JCache.java +++ b/dubbo-filter/dubbo-filter-cache/src/main/java/com/alibaba/dubbo/cache/support/jcache/JCache.java @@ -31,32 +31,46 @@ import java.util.concurrent.TimeUnit; /** * JCache + * + * 与 [JSR107](https://jcp.org/en/jsr/detail?id=107) 集成,可以桥接各种缓存实现。 */ public class JCache implements com.alibaba.dubbo.cache.Cache { private final Cache store; public JCache(URL url) { + // 获得 Cache Key String method = url.getParameter(Constants.METHOD_KEY, ""); String key = url.getAddress() + "." + url.getServiceKey() + "." + method; + // `"jcache"` 配置项,为 Java SPI 实现的全限定类名 // jcache parameter is the full-qualified class name of SPI implementation String type = url.getParameter("jcache"); + // 基于类型,获得 javax.cache.CachingProvider 对象, CachingProvider provider = type == null || type.length() == 0 ? Caching.getCachingProvider() : Caching.getCachingProvider(type); + // 获得 javax.cache.CacheManager 对象 CacheManager cacheManager = provider.getCacheManager(); + // 获得 javax.cache.Cache 对象 Cache cache = cacheManager.getCache(key); + // 不存在,则进行创建 if (cache == null) { try { - //configure the cache + // 设置 Cache 配置项 + // configure the cache MutableConfiguration config = new MutableConfiguration() + // 类型 .setTypes(Object.class, Object.class) + // 过期策略,按照写入时间过期。通过 `"cache.write.expire"` 配置项设置过期时间,默认为 1 分钟。 .setExpiryPolicyFactory(CreatedExpiryPolicy.factoryOf(new Duration(TimeUnit.MILLISECONDS, url.getMethodParameter(method, "cache.write.expire", 60 * 1000)))) .setStoreByValue(false) + // 设置 MBean .setManagementEnabled(true) .setStatisticsEnabled(true); + // 创建 javax.cache.Cache 对象 cache = cacheManager.createCache(key, config); } catch (CacheException e) { + // 初始化 cache 的并发情况 // concurrent cache initialization cache = cacheManager.getCache(key); } @@ -65,10 +79,12 @@ public class JCache implements com.alibaba.dubbo.cache.Cache { this.store = cache; } + @Override public void put(Object key, Object value) { store.put(key, value); } + @Override public Object get(Object key) { return store.get(key); } diff --git a/dubbo-filter/dubbo-filter-cache/src/main/java/com/alibaba/dubbo/cache/support/jcache/JCacheFactory.java b/dubbo-filter/dubbo-filter-cache/src/main/java/com/alibaba/dubbo/cache/support/jcache/JCacheFactory.java index 5ccc6acd9..737d192f5 100644 --- a/dubbo-filter/dubbo-filter-cache/src/main/java/com/alibaba/dubbo/cache/support/jcache/JCacheFactory.java +++ b/dubbo-filter/dubbo-filter-cache/src/main/java/com/alibaba/dubbo/cache/support/jcache/JCacheFactory.java @@ -25,6 +25,7 @@ import com.alibaba.dubbo.common.URL; */ public class JCacheFactory extends AbstractCacheFactory { + @Override protected Cache createCache(URL url) { return new JCache(url); } diff --git a/dubbo-filter/dubbo-filter-cache/src/main/java/com/alibaba/dubbo/cache/support/lru/LruCache.java b/dubbo-filter/dubbo-filter-cache/src/main/java/com/alibaba/dubbo/cache/support/lru/LruCache.java index a56aa0cc8..2cb5c980e 100644 --- a/dubbo-filter/dubbo-filter-cache/src/main/java/com/alibaba/dubbo/cache/support/lru/LruCache.java +++ b/dubbo-filter/dubbo-filter-cache/src/main/java/com/alibaba/dubbo/cache/support/lru/LruCache.java @@ -24,20 +24,29 @@ import java.util.Map; /** * LruCache + * + * 基于最近最少使用原则删除多余缓存,保持最热的数据被缓存。 */ public class LruCache implements Cache { + /** + * 缓存集合 + */ private final Map store; public LruCache(URL url) { + // `"cache.size"` 配置项,设置缓存大小 final int max = url.getParameter("cache.size", 1000); + // 创建 LRUCache 对象 this.store = new LRUCache(max); } + @Override public void put(Object key, Object value) { store.put(key, value); } + @Override public Object get(Object key) { return store.get(key); } diff --git a/dubbo-filter/dubbo-filter-cache/src/main/java/com/alibaba/dubbo/cache/support/lru/LruCacheFactory.java b/dubbo-filter/dubbo-filter-cache/src/main/java/com/alibaba/dubbo/cache/support/lru/LruCacheFactory.java index 376423b6c..2c7b28d31 100644 --- a/dubbo-filter/dubbo-filter-cache/src/main/java/com/alibaba/dubbo/cache/support/lru/LruCacheFactory.java +++ b/dubbo-filter/dubbo-filter-cache/src/main/java/com/alibaba/dubbo/cache/support/lru/LruCacheFactory.java @@ -25,6 +25,7 @@ import com.alibaba.dubbo.common.URL; */ public class LruCacheFactory extends AbstractCacheFactory { + @Override protected Cache createCache(URL url) { return new LruCache(url); } diff --git a/dubbo-filter/dubbo-filter-cache/src/main/java/com/alibaba/dubbo/cache/support/threadlocal/ThreadLocalCache.java b/dubbo-filter/dubbo-filter-cache/src/main/java/com/alibaba/dubbo/cache/support/threadlocal/ThreadLocalCache.java index bffdd1782..95f0fded4 100644 --- a/dubbo-filter/dubbo-filter-cache/src/main/java/com/alibaba/dubbo/cache/support/threadlocal/ThreadLocalCache.java +++ b/dubbo-filter/dubbo-filter-cache/src/main/java/com/alibaba/dubbo/cache/support/threadlocal/ThreadLocalCache.java @@ -24,26 +24,32 @@ import java.util.Map; /** * ThreadLocalCache + * + * 当前线程缓存,比如一个页面渲染,用到很多 portal,每个 portal 都要去查用户信息,通过线程缓存,可以减少这种多余访问。 */ public class ThreadLocalCache implements Cache { - private final ThreadLocal> store; + private final ThreadLocal> store; // 线程变量 public ThreadLocalCache(URL url) { this.store = new ThreadLocal>() { + @Override protected Map initialValue() { return new HashMap(); } + }; } + @Override public void put(Object key, Object value) { store.get().put(key, value); } + @Override public Object get(Object key) { return store.get().get(key); } -} +} \ No newline at end of file diff --git a/dubbo-filter/dubbo-filter-cache/src/main/java/com/alibaba/dubbo/cache/support/threadlocal/ThreadLocalCacheFactory.java b/dubbo-filter/dubbo-filter-cache/src/main/java/com/alibaba/dubbo/cache/support/threadlocal/ThreadLocalCacheFactory.java index 24606664e..693d33eb0 100644 --- a/dubbo-filter/dubbo-filter-cache/src/main/java/com/alibaba/dubbo/cache/support/threadlocal/ThreadLocalCacheFactory.java +++ b/dubbo-filter/dubbo-filter-cache/src/main/java/com/alibaba/dubbo/cache/support/threadlocal/ThreadLocalCacheFactory.java @@ -25,6 +25,7 @@ import com.alibaba.dubbo.common.URL; */ public class ThreadLocalCacheFactory extends AbstractCacheFactory { + @Override protected Cache createCache(URL url) { return new ThreadLocalCache(url); } -- GitLab