`

dubbo-filter 源码分析

阅读更多
说明:这个模块的功能是缓存调用结果,但是我有一个疑问,比如说开始调用的时候,返回结果列表中只有一条数据,另一个进程插入了一条数据,那么下一次调用缓存的那个方法时,那是返回一条结果,还是两条结果了?


Cache 接口定义了两个方法,put 和 get.

public interface Cache {
    /**
     * API to store value against a key
     * @param key  Unique identifier for the object being store.
     * @param value Value getting store
     */
    void put(Object key, Object value);

    /**
     * API to return stored value using a key.
     * @param key Unique identifier for cache lookup
     * @return Return stored object against key
     */
    Object get(Object key);

}

CacheFactory 定义了获取 Cache 的方法

@SPI("lru")
public interface CacheFactory {

    /**
     * CacheFactory implementation class needs to implement this return underlying cache instance for method against
     * url and invocation.
     * @param url
     * @param invocation
     * @return Instance of Cache containing cached value against method url and invocation.
     */
    @Adaptive("cache")
    Cache getCache(URL url, Invocation invocation);

}

AbstractCacheFactory 实现了 CacheFactory 的基本骨架.

我们先看下 LruCache 吧,LruCache 是最近最久未使用,它的实现原理是借用了 LinkedHashMap 实现的.

public LruCache(URL url) {
        final int max = url.getParameter("cache.size", 1000);
        this.store = new LRUCache<>(max);
    }

public class LruCacheFactory extends AbstractCacheFactory {

    /**
     * Takes url as an method argument and return new instance of cache store implemented by LruCache.
     * @param url url of the method
     * @return ThreadLocalCache instance of cache
     */
    @Override
    protected Cache createCache(URL url) {
        return new LruCache(url);
    }

}

ThreadLocalCache 是借助于 ThreadLocal 实现的.

JCache 是用于缓存的 Java API. 它提供一组通用的类和接口,可用于将 Java 对象临时存储在内存中.  所以即可以使用 JCache 实现,同样的,我也可以使用 Ecache 实现.

ExpiringMap 采用的 ConcurrentHashMap + Thread 实现可自动移除失效数据的结构,所以此处我认为采用 redis 实现效果会更好.

现在来重点关注下 CacheFilter 这个类. 这里实现了缓存结果的具体逻辑.

public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
        if (cacheFactory != null && ConfigUtils.isNotEmpty(invoker.getUrl().getMethodParameter(invocation.getMethodName(), CACHE_KEY))) {
            Cache cache = cacheFactory.getCache(invoker.getUrl(), invocation);
            if (cache != null) {
                String key = StringUtils.toArgumentString(invocation.getArguments());
                Object value = cache.get(key);
                if (value != null) {
                    if (value instanceof ValueWrapper) {
                        return AsyncRpcResult.newDefaultAsyncResult(((ValueWrapper) value).get(), invocation);
                    } else {
                        return AsyncRpcResult.newDefaultAsyncResult(value, invocation);
                    }
                }
                Result result = invoker.invoke(invocation);
                if (!result.hasException()) {
                    cache.put(key, new ValueWrapper(result.getValue()));
                }
                return result;
            }
        }
        return invoker.invoke(invocation);
    }



dubbo-filter-validation 包

Validator 类的实例在实际方法调用前对方法输入参数执行验证的扩展.
public interface Validator {

    void validate(String methodName, Class<?>[] parameterTypes, Object[] arguments) throws Exception;

}

Validation 获取 Validator 的工厂接口
@SPI("jvalidation")
public interface Validation {

    /**
     * Return the instance of {@link Validator} for a given url.
     * @param url Invocation url
     * @return Instance of {@link Validator}
     */
    @Adaptive(VALIDATION_KEY)
    Validator getValidator(URL url);

}

AbstractValidation 抽象类,实现 Validation 的基本骨架.



ValidationFilter 在实际调用方法前,通过 Validation 校验参数的合法性(这个类似于以前在前端使用的 validateEngine 一样,通用的数据校验API).

public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
        if (validation != null && !invocation.getMethodName().startsWith("$")
                && ConfigUtils.isNotEmpty(invoker.getUrl().getMethodParameter(invocation.getMethodName(), VALIDATION_KEY))) {
            try {
                Validator validator = validation.getValidator(invoker.getUrl());
                if (validator != null) {
                    validator.validate(invocation.getMethodName(), invocation.getParameterTypes(), invocation.getArguments());
                }
            } catch (RpcException e) {
                throw e;
            } catch (Throwable t) {
                return AsyncRpcResult.newDefaultAsyncResult(t, invocation);
            }
        }
        return invoker.invoke(invocation);
    }


0
2
分享到:
评论

相关推荐

    dubbo-2.5.3源码

    《深入剖析Dubbo 2.5.3源码》 Dubbo是一款高性能、轻量级的开源Java RPC框架,由阿里...通过对源码的分析,我们可以了解到Dubbo如何优雅地处理服务发现、调用、监控等问题,为构建大规模分布式系统提供有力的支持。

    alibaba-dubbo-dubbo-2.5.7-0-ge2d63ad.tar.gz

    《阿里巴巴Dubbo 2.5.7源码分析与应用》 阿里巴巴的Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了服务发现、服务治理、流量控制等一系列完整的服务解决方案。本压缩包"alibaba-dubbo-dubbo-2.5.7-0-ge2d...

    dubbo-demo-provider-consumer

    9. **监控与日志**:Dubbo提供了服务调用的监控和日志记录功能,帮助开发者分析服务性能和排查问题。 10. **扩展性**:Dubbo设计了插件化机制,如Filter、Protocol等,方便开发者进行功能扩展和定制。 通过这个...

    dubbo-master源码

    通过对Dubbo源码的阅读和分析,我们可以更深入地理解服务治理的原理,学习到如何设计高可用、可扩展的微服务架构,这对于提升我们的Java编程技能和系统设计能力具有重要的实践意义。同时,Dubbo也是许多企业级项目的...

    apache-dubbo-2.7.5-src.zip

    在分析2.7.5源码之前,我们需要理解Dubbo的基本概念和组件。Dubbo的核心组件包括服务提供者(Provider)、服务消费者(Consumer)、注册中心(Registry)、监控中心(Monitor)和服务治理(Service Governance)。...

    dubbo-master.zip

    6. **filter**: 过滤器模块,提供了服务调用前后的拦截处理,可以实现日志记录、性能统计、权限校验等功能,极大地扩展了Dubbo的功能。 7. **monitor**: 监控中心,收集服务的调用数据,如调用次数、成功率、耗时等...

    阿里巴巴dubbo-2.5.4源代码

    提及的`dubbo-admin`模块是Dubbo的服务治理平台,它提供了可视化的服务管理界面,包括服务的注册、监控、调用分析等功能,便于运维人员对微服务环境进行管理。 通过深入学习和研究阿里巴巴Dubbo 2.5.4的源代码,...

    dubbo源码分析pdf.zip

    《Dubbo源码分析》是一套深入探讨Apache Dubbo这一著名Java开源框架的书籍,旨在帮助开发者更好地理解和应用Dubbo。Dubbo是一个高性能、轻量级的服务治理框架,广泛应用于微服务架构中,以实现服务的发布、发现、...

    dubbo源码解读与实战.doc

    #### 三、Dubbo源码自带Demo分析 **3.1 Demo概述** - **HelloWorld**:最简单的Dubbo应用示例,展示了如何使用Dubbo发布和消费一个简单的服务。 - **SpringBoot**:基于Spring Boot框架的Dubbo应用示例。 - **...

    dubbo源码包

    Dubbo作为阿里巴巴开源的一款高性能、轻量级的服务治理框架,其源码的深入理解和分析对于Java开发者来说,具有极高的学习价值。本文将针对提供的dubbo-2.4.3-sources.jar等一系列源码包,逐一剖析其中的核心组件和...

    dubbo-dubbo-2.5.3-codeanalysis:dubbo源码分析

    通过以上对 Dubbo 源码的分析,不仅可以帮助我们更好地理解和使用 Dubbo,还能为我们设计和实现类似的分布式服务治理框架提供宝贵的参考。在实践中,可以结合代码分析逐步学习,不断提升自己在分布式系统领域的专业...

    Dubbo 源码分析

    Dubbo是中国阿里巴巴开源的一款高性能、轻量级的Java服务治理框架,它主要专注于服务调用、服务注册与发现、负载均衡、容错以及监控等核心...同时,源码分析也是提升自身技术能力,掌握分布式系统设计原理的重要途径。

    dubbo源码zipdubbo源码zip

    通过分析dubbo源码,我们可以了解到其实现的诸多设计模式,如工厂模式、装饰器模式、责任链模式等,这些都是软件设计中的重要思想。同时,Dubbo的模块化设计使得各个组件可以独立扩展,增强了框架的灵活性和可维护性...

    demo-dubbo:dubbo源码分析

    《Dubbo源码分析》 Dubbo是一款高性能、轻量级的Java开源RPC框架,它由阿里巴巴开源并广泛应用于各种分布式系统中。本项目“demo-dubbo”旨在深入剖析Dubbo的核心原理,帮助开发者理解其背后的实现机制,提升在实际...

    Dubbo源码解析

    ### Dubbo源码解析——Filter和Listener的注入过程 #### 前言 本文将深入探讨Dubbo框架中Filter和Listener的注入过程。不同于普通的概念介绍或功能概述,本文聚焦于技术实现细节,旨在帮助中高级软件开发工程师...

    与dubbo 相关的源码

    《Dubbo源码解析:深度探索服务治理框架的内在机制》 Dubbo,作为阿里巴巴开源的一款高性能、轻量级的服务治理框架,它在分布式...通过源码分析,我们可以从中汲取灵感,为自己的项目开发提供宝贵的经验和实践指导。

    ribbon,feign,dubbo,sentinel等等的源码分析

    以下是对标题和描述中提到的几个关键组件——Ribbon、Feign、Dubbo、Sentinel的源码分析,以及与它们相关的Spring Boot启动过程、配置文件加载流程、Nacos源码分析、Web MVC配置、DataBinder和Servlet与Filter的加载...

    Dubbo-Code:dubbo原始码解析

    4. **服务过滤器**:Dubbo的扩展性体现在服务过滤器上,`Filter`接口定义了服务调用前后的处理逻辑。用户可以通过自定义过滤器实现特定的功能,如日志记录、性能统计等。 5. **服务容错**:Dubbo提供了多种容错策略...

    深入理解Spring与Dubbo整合原理与源码分析:从启动类配置到注解解析.rar

    《深入理解Spring与Dubbo整合原理与源码分析:从启动类配置到注解解析》是一本专注于探讨Spring和Dubbo两大开源框架整合的技术书籍。本文将基于书中的主题,结合标签“spring”、“dubbo”和“软件/插件”,深入解析...

Global site tag (gtag.js) - Google Analytics