文档章节

dubbo remoting(3)

hyssop
 hyssop
发布于 2016/08/24 18:11
字数 675
阅读 36
收藏 0

上文说了dubbo remoting 的发送、处理逻辑。本文的重点是dubbo remoting的代码逻辑,看看这块是如何组织代码解决问题的。我们不谈代码的来由,需要读者对dubbo remoting的代码有一定的了解。 输入图片说明

dubbo remoting的代码要涉及到发送数据的各个方面:通道channel、处理器handler、序列化反序列化、编解码codec。

#通道 dubbo里面的通道具体有三种:Grizzly、Netty、Mina的。 #处理器 有了通道就有了发送接收数据的工具。数据发送接收需要做一系列的逻辑处理。这些逻辑处理就是处理器要做的事情。处理器要做的事情就是将channel包装成channel事务ChannelEventRunnable,然后配置一个线程池处理该信息。

executor.execute(new ChannelEventRunnable(channel, handler ,ChannelState.DISCONNECTED));

渠道那么多,他们是如何选择处理器的呢?答案是派发器Dispatcher,派发起决定哪个渠道使用哪个处理器。 那派发器有是什么时候指定的呢? 首先我们看代码ChannelHandlers

 */
public class ChannelHandlers {

    public static ChannelHandler wrap(ChannelHandler handler, URL url){
        return ChannelHandlers.getInstance().wrapInternal(handler, url);
    }

    protected ChannelHandlers() {}

    protected ChannelHandler wrapInternal(ChannelHandler handler, URL url) {
        return new MultiMessageHandler(new HeartbeatHandler(ExtensionLoader.getExtensionLoader(Dispatcher.class)
                                        .getAdaptiveExtension().dispatch(handler, url)));
    }

    private static ChannelHandlers INSTANCE = new ChannelHandlers();

    protected static ChannelHandlers getInstance() {
        return INSTANCE;
    }

    static void setTestingChannelHandlers(ChannelHandlers instance) {
        INSTANCE = instance;
    }
}

该类是一个单利类,在实例化的时候调用了方法wrapInternal,这样返回过去的实例是一个代理类MultiMessageHandler的实例。里面代理了HeartbeatHandler实例,而HeartbeatHandler实例还是一个代理类,它代理的东西使用spi找到dispacher实现类,通过调用Dispacher的dispatch方法获得了对应的处理器。 接着,我们发现在实例化客户端的时候调用了AbstractClient的方法

    protected static ChannelHandler wrapChannelHandler(URL url, ChannelHandler handler){
        url = ExecutorUtil.setThreadName(url, CLIENT_THREAD_POOL_NAME);
        url = url.addParameterIfAbsent(Constants.THREADPOOL_KEY, Constants.DEFAULT_CLIENT_THREADPOOL);
        return ChannelHandlers.wrap(handler, url);
    }

实例化服务器端的时候也使用了以下这段代码

public NettyServer(URL url, ChannelHandler handler) throws RemotingException{
        super(url, ChannelHandlers.wrap(handler, ExecutorUtil.setThreadName(url, SERVER_THREAD_POOL_NAME)));
    }

可以看出在客户端、服务器端实例化的时候都调用了ChannelHandlers的wrap方法。至此,通道处理器已经在这个实例化的过程中准备完毕。 那么问题又来了有三种方式可以发送接收数据(Grizzly、Netty、Mina),选择哪一种呢?就是Transporter在起作用。管理器Transporters主要使用spi找到真正额Transporter

getTransporter().bind(url, handler);

调用Transporters方法在HeaderExchanger中

public ExchangeClient connect(URL url, ExchangeHandler handler) throws RemotingException {
        return new HeaderExchangeClient(Transporters.connect(url, new DecodeHandler(new HeaderExchangeHandler(handler))));
    }

在这里又采用了代理模式用DecodeHandler代理了HeaderExchangeHandler,HeaderExchangeHandler实例代理了handler。从后往前看下,就知道了handler的层级换下如下: 输入图片说明

© 著作权归作者所有

上一篇: 说说类型转换
下一篇: dubbo remoting(2)
hyssop
粉丝 20
博文 102
码字总数 111521
作品 0
昌平
程序员
私信 提问
Dubbo 升级扩展 --Dubbo-G

Dubbo-G 详细介绍 Dubbo是一个被国内很多互联网公司广泛使用的开源分布式服务框架,即使从国际视野来看应该也是一个非常全面的SOA基础框架。作为一个重要的技术研究课题,在联想电商我们根据...

技术专家
2017/05/26
8.5K
23
dubbo源码学习笔记----整体结构

dubbo核心包 config dubbo-config-api dubbo-config-spring remoting dubbo-remoting-netty dubbo-remoting-netty4 dubbo-remoting-mina dubbo-remoting-grizzly dubbo-remoting-p2p dubbo-......

春哥大魔王的博客
2018/01/13
274
3
聊聊dubbo的ExecutionDispatcher

序 本文主要研究一下dubbo的ExecutionDispatcher ExecutionDispatcher dubbo-2.7.3/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/transport/dispatcher/exec......

go4it
09/02
22
0
dubbo Servlet Bridge Server时同时支持hessian和webservice

原生的bubbo在发布hessian和webservice时使用了嵌入jetty的方式开启了两个端口。 而考虑到我们实际的情况,需要使用weblogic发布,并且是使用同一个端口对外提供服务。 所以我们要扩展dubbo...

linan
2015/10/13
860
0
聊聊dubbo的AllDispatcher

序 本文主要研究一下dubbo的AllDispatcher Dispatcher dubbo-2.7.3/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/Dispatcher.java Dispatcher接口定义了dis......

go4it
08/31
29
0

没有更多内容

加载失败,请刷新页面

加载更多

数据流中的中位数

吐出的较小的N/2 个,都在大根堆里,较大的 N/2 个,都在小根堆里。 此时 5、4,都在大根堆,小根堆没有数。 此时应该从大根堆的堆顶弹出来,扔到小根堆里。 比如:先把 5 拿出来,再把堆最后...

Garphy
1分钟前
0
0
微服务下配置管理中心 SCCA

SCCA 简介 SCCA 全称 spring-cloud-config-admin,微服务下 Spring Boot 应用(包含 Spring Cloud)统一的配置管理平台。 Github 地址:spring-cloud-config-admin 核心贡献者:程序员DD | ...

SpringForA
3分钟前
2
0
spring 是如何注入对象的和bean 创建过程分析

文章目录: beanFactory 及 bean 生命周期起步 BeanFactory refresh 全过程 BeanFactoryPostProcessor 和 BeanPostProcessor 解析 使用 BeanPostProcessor 实现 aop 和 springboot Cache 相关......

sanri1993
6分钟前
2
0
@PathVariable使用

public interface ProductInfoRepository extends JpaRepository<ProductInfo, String>{ List<ProductInfo> findByProductId(String productId);} ProductInfoController @Autowired ......

观海562
17分钟前
2
0
利用CSS禁止手机长按出现气泡: 复制、选择等功能

可以用 * ,也可作用于一个div div{  -webkit-touch-callout:none;  /*系统默认菜单被禁用*/  -webkit-user-select:none; /*webkit浏览器*/  -khtml-user-select:none; /*早期浏览...

蓝小驴
57分钟前
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部