10. Dubbo原理解析-代理之Listener & filter

Listener

ExporterListener:

dubbo在服务暴露(exporter)以及销毁暴露(unexporter)服务的过程中提供了回调窗口,供用户做业务处理。ProtocolListenerWrapper在暴露过程中构建了监听器链

public
class
ProtocolListenerWrapper implements Protocol {

public <T> Exporter<T> export(Invoker<T>invoker)
throws RpcException {

……. //注册中心代码

return
new
ListenerExporterWrapper<T>(protocol.export(invoker),                Collections.unmodifiableList(ExtensionLoader.getExtensionLoader(ExporterListener.class).getActivateExtension(invoker.getUrl(),Constants.EXPORTER_LISTENER_KEY)));

}

}

1.      根据Dubbo的SPI扩展机制获取所有实现了ExporterListener的监听器listeners

2.      Protocol.export(invoker)暴露服务返回结果exporter对象

3.      ListenerExporterWrapper装饰exporter, 在构造器中遍历listeners构建export的监听链

4.      ListenerExporterWrapper实现Exproter<T>接口,在unexport方法实现中构建unexport的监听链

InvokerListener:

dubbo在服务引用(refer)以及销毁引用(destroy)服务的过程中提供了回调窗口,供用户做业务处理。ProtocolListenerWrapper在暴露过程中构建了监听器链

public <T> Invoker<T> refer(Class<T> type,URL url)
throws RpcException {

return
new
ListenerInvokerWrapper<T>(protocol.refer(type, url),               Collections.unmodifiableList(ExtensionLoader.getExtensionLoader(InvokerListener.class).getActivateExtension(url,Constants.INVOKER_LISTENER_KEY)));

}

1.      根据Dubbo的SPI扩展机制获取所有实现了InvokerListener的监听器listeners

2.      Protocol.refer(type, url)暴露服务返回结果invoker对象

3. ListenerInvokerWrapper装饰invoker, 在构造器中遍历listeners构建referer的监听链3.      ListenerInvokerWrapper装饰invoker, 在构造器中遍历listeners构建referer的监听链

4.      ListenerInvokerWrapper实现Invoker<T>接口,在destory方法实现中构建destory的监听链

Dubbo的开源版本中没有监听的实现,但是开放了口子,业务方如有需要可以利用这个功能实现特定的业务

Filter

Filter:是一种递归的链式调用,用来在远程调用真正执行的前后加入一些逻辑,跟aop的拦截器servlet中filter概念一样的

Filter接口定义

@SPI

public
interface
Filter {

Result invoke(Invoker<?> invoker,Invocation invocation)
throws
RpcException;

}

ProtocolFilterWrapper:在服务的暴露与引用的过程中根据KEY是PROVIDER还是CONSUMER来构建服务提供者与消费者的调用过滤器链

public <T> Exporter<T> export(Invoker<T>invoker)
throws RpcException {

return
protocol.export(buildInvokerChain(invoker, Constants.SERVICE_FILTER_KEY, Constants.PROVIDER));

}

public <T> Invoker<T> refer(Class<T> type,URL url)
throws RpcException {

return
buildInvokerChain
(protocol.refer(type, url),Constants.REFERENCE_FILTER_KEY, Constants.CONSUMER);

}

Filter的实现类需要打上@Activate注解, @Activate的group属性是个string数组,我们可以通过这个属性来指定这个filter是在consumer, provider还是两者情况下激活,所谓激活就是能够被获取,组成filter链

List<Filter> filters =ExtensionLoader.getExtensionLoader(Filter.class).getAct ivateExtension(invoker.getUrl(),key, group);

Key就是SERVICE_FILTER_KEY还是REFERENCE_FILTER_KEY

Group就是consumer或者provider

构建filter链,当我们获取激活的filter集合后就通过buildInvokerChain方法来构建

for (int i = filters.size() - 1; i >= 0; i --) {

final Filter filter = filters.get(i);

final Invoker<T> next = last;

last = new Invoker<T>() {

public Result invoke(Invocation invocation)
throws RpcException {

return filter.invoke(next, invocation);

}

。。。。。。。 //其他方法

};

}

以上代码展示了构建filter链的过程

Dubbo内容提供了大量内部实现,用来实现调用过程额外功能, 如向监控中心发送调用数据, Tps限流等等, 每个filer专注一块功能。用户同样可以通过Dubbo的SPI扩展机制现在自己的功能

时间: 2024-10-25 10:51:36

10. Dubbo原理解析-代理之Listener & filter的相关文章

8. Dubbo原理解析-代理之服务发布

服务发布是服务提供方向注册中注册服务过程,以便服务消费者从注册中心查阅并调用服务. 服务发布方在spring的配置文件中配置如下: <bean id="demoService"class="com.alibaba.dubbo.demo.provider.DemoServiceImpl" /> 上面是在spring中配置的服务的具体实现,是spring中的一个普通的bean <dubbo:serviceinterface="com.alib

9. Dubbo原理解析-代理之服务引用

服务引用是服务的消费方向注册中心订阅服务提供方提供的服务地址后向服务提供方引用服务的过程. 服务的应用方在spring的配置实例如下: <dubbo:reference id="demoService" interface="com.alibaba.dubbo.demo. DemoService"/> 如上配置spring在容器启动的时候会解析自定义的schema元素<dubbo: reference/>转换成dubbo内部数据结构Refer

4. Dubbo原理解析-代理之接口定义 (转)

转载自  斩秋的专栏  http://blog.csdn.net/quhongwei_zhanqiu/article/details/41577159 一:ProxyFactory的接口定义 import com.alibaba.dubbo.common.Constants; import com.alibaba.dubbo.common.URL; import com.alibaba.dubbo.common.extension.Adaptive; import com.alibaba.dub

5.Dubbo原理解析-代理之Javassist字节码技术生成代理 (转)

转载自  斩秋的专栏  http://blog.csdn.net/quhongwei_zhanqiu/article/details/41597219 JavassistProxyFactory:利用字节码技术来创建对象 public <T> T getProxy(Invoker<T> invoker,Class<?>[] interfaces) { return (T) Proxy.getProxy(interfaces).newInstance(new Invoke

26. Dubbo原理解析-监控

Dubbo发布代码中,自带了一个简易的监控中心实现.对于一般的小业务这个监控中心应该能够满足需求,对于那些大业务量的大公司一般都会有自己的监控中心,更加丰富的功能如常用的报警短信通知等等.这章讲解分析使得读者能够了解一般的监控中心实现,也使得有自己接入监控中心需求的大概知道如何集成自己的监控中心实现.下面我们就以dubbo自带的监控中心开始讲解. 监控中心 1.  监控中心启动,我们先看下dubbo的属性文件 dubbo.container=log4j,spring,registry,jetty

12. Dubbo原理解析-注册中心之基于dubbo协议的简单注册中心实现

基于dubbo协议开源只是给出了默认一个注册中心实现SimpleRegistryService, 它只是一个简单实现,不支持集群,就是利用Map<String/*ip:port*/, Map<String/*service*/, URL>来存储服务地址, 具体不在啰嗦了,请读者翻看源代码,可作为自定义注册中的参考. 注册中心启动 SimpleRegistryService本身也是作为一个dubbo服务暴露. <dubbo:protocolport="9090"

11. Dubbo原理解析-注册中心之基于dubbo协议的接口介绍

服务注册与发现的中心,服务的提供者将服务发布到注册中心,服务的使用着到注册中引用服务. Dubbo的注册中心提供了多种实现,其实现是基于dubbo的spi的扩展机制的,使用着可以直接实现自己的注册中心. @SPI("dubbo") public interface RegistryFactory { /** * 连接注册中心. * 连接注册中心需处理契约 * 1. 当设置check=false时表示不检查连接,否则在连接不上时抛出异常. * 2. 支持URL上的username:pas

13. Dubbo原理解析-注册中心之Zookeeper协议注册中心

下面我们来看下开源dubbo推荐的业界成熟的zookeeper做为注册中心, zookeeper是hadoop的一个子项目是分布式系统的可靠协调者,他提供了配置维护,名字服务,分布式同步等服务.对于zookeeper的原理本文档不分析,后面有时间在做专题. zookeeper注册中心 Zookeeper对数据存储类似linux的目录结构,下面给出官方文档对dubbo注册数据的存储示例 假设读者对zookeeper有所了解,能够搭建zookeeper服务,其实不了解也没关系,谷歌百度下分分钟搞起.

分布式服务框架dubbo原理解析

alibaba有好几个分布式框架,主要有:进行远程调用(类似于RMI的这种远程调用)的(dubbo.hsf),jms消息服务(napoli.notify),KV数据库(tair)等.这个框架/工具/产品在实现的时候,都考虑到了容灾,扩展,负载均衡,于是出现一个配置中心(ConfigServer)的东西来解决这些问题. 基本原理如图: 在我们的系统中,经常会有一些跨系统的调用,如在A系统中要调用B系统的一个服务,我们可能会使用RMI直接来进行,B系统发布一个RMI接口服务,然后A系统就来通过RMI