- 浏览: 77723 次
文章分类
最新评论
-
kevinflynn:
...
ThreadLocal 源码分析 -
kevinflynn:
[url=aaaa][/url]
ThreadLocal 源码分析 -
kevinflynn:
学习到了 感谢楼主。
ThreadLocal 源码分析
说明:这个模块的功能是缓存调用结果,但是我有一个疑问,比如说开始调用的时候,返回结果列表中只有一条数据,另一个进程插入了一条数据,那么下一次调用缓存的那个方法时,那是返回一条结果,还是两条结果了?
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);
}
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);
}
发表评论
-
dubbo-common-rpc
2020-12-30 22:46 403ApplicationModel 实例模型. ... -
dubbo 配置中心源码分析(一)
2019-11-28 23:09 533Configuration 接口分析 /** * 配置中心 ... -
dubbo 监控中心源码分析
2019-11-28 00:15 534MonitorFactory 创建 Monitor 的接口 ... -
dubbo injvm 协议分析
2019-11-21 23:49 811在看 injvm 协议的时候,我们还是从 InjvmProto ... -
[dubbo] resteasy 调用流程分析
2019-11-21 00:46 741在看 dubbo rest 协议的时候,很多东西都不是很懂,特 ... -
【dubbo】基于httpclient实现rpc的思路
2019-11-18 22:05 720今天在看 dubbo http 协议的时候,发现它是使用 js ... -
dubbo http 协议分析
2019-11-13 23:30 678今天看 dubbo http 协议的时候,觉得很好玩,开始的理 ... -
dubbo remoting 层之 exchange
2019-10-31 00:38 623补充点额外知识: CompletableFuture 现在 ... -
dubbo remoting 层分析
2019-10-29 01:17 709remote 层关注 transport 和 exchange ... -
dubbo 序列化是如何封装的
2019-10-27 17:55 553dubbo 是支持多种序列化方式的,那么它就必须在此基础上做一 ... -
dubbo 线程池
2019-08-31 23:18 0dubbo 中有四个线程池: CachedThreadPoo ... -
dubbo 线程池
2019-08-31 23:18 769dubbo 中有四个线程池: CachedThreadPoo ... -
关于 dubbo 的 SpiExtensionFactory 的一点说明
2019-08-29 00:30 672关于 dubbo 的 SpiExtensionFa ...
相关推荐
《深入剖析Dubbo 2.5.3源码》 Dubbo是一款高性能、轻量级的开源Java RPC框架,由阿里...通过对源码的分析,我们可以了解到Dubbo如何优雅地处理服务发现、调用、监控等问题,为构建大规模分布式系统提供有力的支持。
《阿里巴巴Dubbo 2.5.7源码分析与应用》 阿里巴巴的Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了服务发现、服务治理、流量控制等一系列完整的服务解决方案。本压缩包"alibaba-dubbo-dubbo-2.5.7-0-ge2d...
9. **监控与日志**:Dubbo提供了服务调用的监控和日志记录功能,帮助开发者分析服务性能和排查问题。 10. **扩展性**:Dubbo设计了插件化机制,如Filter、Protocol等,方便开发者进行功能扩展和定制。 通过这个...
通过对Dubbo源码的阅读和分析,我们可以更深入地理解服务治理的原理,学习到如何设计高可用、可扩展的微服务架构,这对于提升我们的Java编程技能和系统设计能力具有重要的实践意义。同时,Dubbo也是许多企业级项目的...
在分析2.7.5源码之前,我们需要理解Dubbo的基本概念和组件。Dubbo的核心组件包括服务提供者(Provider)、服务消费者(Consumer)、注册中心(Registry)、监控中心(Monitor)和服务治理(Service Governance)。...
6. **filter**: 过滤器模块,提供了服务调用前后的拦截处理,可以实现日志记录、性能统计、权限校验等功能,极大地扩展了Dubbo的功能。 7. **monitor**: 监控中心,收集服务的调用数据,如调用次数、成功率、耗时等...
提及的`dubbo-admin`模块是Dubbo的服务治理平台,它提供了可视化的服务管理界面,包括服务的注册、监控、调用分析等功能,便于运维人员对微服务环境进行管理。 通过深入学习和研究阿里巴巴Dubbo 2.5.4的源代码,...
#### 三、Dubbo源码自带Demo分析 **3.1 Demo概述** - **HelloWorld**:最简单的Dubbo应用示例,展示了如何使用Dubbo发布和消费一个简单的服务。 - **SpringBoot**:基于Spring Boot框架的Dubbo应用示例。 - **...
《Dubbo源码分析》是一套深入探讨Apache Dubbo这一著名Java开源框架的书籍,旨在帮助开发者更好地理解和应用Dubbo。Dubbo是一个高性能、轻量级的服务治理框架,广泛应用于微服务架构中,以实现服务的发布、发现、...
Dubbo作为阿里巴巴开源的一款高性能、轻量级的服务治理框架,其源码的深入理解和分析对于Java开发者来说,具有极高的学习价值。本文将针对提供的dubbo-2.4.3-sources.jar等一系列源码包,逐一剖析其中的核心组件和...
通过以上对 Dubbo 源码的分析,不仅可以帮助我们更好地理解和使用 Dubbo,还能为我们设计和实现类似的分布式服务治理框架提供宝贵的参考。在实践中,可以结合代码分析逐步学习,不断提升自己在分布式系统领域的专业...
Dubbo是中国阿里巴巴开源的一款高性能、轻量级的Java服务治理框架,它主要专注于服务调用、服务注册与发现、负载均衡、容错以及监控等核心...同时,源码分析也是提升自身技术能力,掌握分布式系统设计原理的重要途径。
《Dubbo源码分析》 Dubbo是一款高性能、轻量级的Java开源RPC框架,它由阿里巴巴开源并广泛应用于各种分布式系统中。本项目“demo-dubbo”旨在深入剖析Dubbo的核心原理,帮助开发者理解其背后的实现机制,提升在实际...
### Dubbo源码解析——Filter和Listener的注入过程 #### 前言 本文将深入探讨Dubbo框架中Filter和Listener的注入过程。不同于普通的概念介绍或功能概述,本文聚焦于技术实现细节,旨在帮助中高级软件开发工程师...
《Dubbo源码解析:深度探索服务治理框架的内在机制》 Dubbo,作为阿里巴巴开源的一款高性能、轻量级的服务治理框架,它在分布式...通过源码分析,我们可以从中汲取灵感,为自己的项目开发提供宝贵的经验和实践指导。
以下是对标题和描述中提到的几个关键组件——Ribbon、Feign、Dubbo、Sentinel的源码分析,以及与它们相关的Spring Boot启动过程、配置文件加载流程、Nacos源码分析、Web MVC配置、DataBinder和Servlet与Filter的加载...
4. **服务过滤器**:Dubbo的扩展性体现在服务过滤器上,`Filter`接口定义了服务调用前后的处理逻辑。用户可以通过自定义过滤器实现特定的功能,如日志记录、性能统计等。 5. **服务容错**:Dubbo提供了多种容错策略...
《深入理解Spring与Dubbo整合原理与源码分析:从启动类配置到注解解析》是一本专注于探讨Spring和Dubbo两大开源框架整合的技术书籍。本文将基于书中的主题,结合标签“spring”、“dubbo”和“软件/插件”,深入解析...
《Dubbo基础源码分析》 Dubbo,作为阿里巴巴开源的一款高性能、轻量级的Java服务治理框架,已经成为分布式系统中的重要组件。深入理解Dubbo的源码,可以帮助我们更好地运用和优化它,以实现更高效、稳定的系统架构...