HeaderExchangeClient 注释是DefaultMessageClient,类中定义了心跳定时器
HeaderExchangeChannel 发送请求
HeaderExchangeHandler provider中处理请求,consumer中处理响应

创建HeaderExchangeClient对象:

  1. //HeaderExchanger
  2. public ExchangeClient connect(URL url, ExchangeHandler handler) throws RemotingException {
  3. //对象是 HeaderExchangeClient/NettyClient/DecodeHandler/HeaderExchangeHandler
  4. return new HeaderExchangeClient(
            Transporters.connect(url, new DecodeHandler(new HeaderExchangeHandler(handler))));
  5. }

HeaderExchangeClient类:

  1. private final ExchangeChannel channel;
  2. public HeaderExchangeClient(Client client){
  3. if (client == null) {
  4. throw new IllegalArgumentException("client == null");
  5. }
  6. this.client = client;
  7. //关联上HeaderExchangeChannel
  8. this.channel = new HeaderExchangeChannel(client);
  9. String dubbo = client.getUrl().getParameter(Constants.DUBBO_VERSION_KEY);
  10. this.heartbeat = client.getUrl().getParameter( Constants.HEARTBEAT_KEY, dubbo != null && dubbo.startsWith("1.0.") ? Constants.DEFAULT_HEARTBEAT : 0 );
  11. this.heartbeatTimeout = client.getUrl().getParameter( Constants.HEARTBEAT_TIMEOUT_KEY, heartbeat * 3 );
  12. if ( heartbeatTimeout < heartbeat * 2 ) {
  13. throw new IllegalStateException( "heartbeatTimeout < heartbeatInterval * 2" );
  14. }
  15. startHeatbeatTimer();
  16. }

Transporters类:

  1. //Transporters
  2. public static Client connect(URL url, ChannelHandler... handlers) throws RemotingException {
  3. if (url == null) {
  4. throw new IllegalArgumentException("url == null");
  5. }
  6. ChannelHandler handler;
  7. if (handlers == null || handlers.length == 0) {
  8. handler = new ChannelHandlerAdapter();
  9. } else if (handlers.length == 1) {
  10. handler = handlers[0];
  11. } else {
  12. handler = new ChannelHandlerDispatcher(handlers);
  13. }
  14. return getTransporter().connect(url, handler);
  15. }
  16.  
  17. public static Transporter getTransporter() {
  18. //返回Transporter$Adpative对象
  19. return ExtensionLoader.getExtensionLoader(Transporter.class).getAdaptiveExtension();
  20. }

Transporter$Adpative类:

  1. package com.alibaba.dubbo.remoting;
  2. import com.alibaba.dubbo.common.extension.ExtensionLoader;
  3. public class Transporter$Adpative implements com.alibaba.dubbo.remoting.Transporter {
  4. //省略其他代码
  5. public com.alibaba.dubbo.remoting.Client connect(
  6. com.alibaba.dubbo.common.URL arg0,
  7. com.alibaba.dubbo.remoting.ChannelHandler arg1)
  8. throws com.alibaba.dubbo.common.URL {
  9. if (arg0 == null)
  10. throw new IllegalArgumentException("url == null");
  11. com.alibaba.dubbo.common.URL url = arg0;
  12. String extName = url.getParameter("client",
  13. url.getParameter("transporter", "netty"));
  14. if (extName == null)
  15. throw new IllegalStateException(
  16. "Fail to get extension(com.alibaba.dubbo.remoting.Transporter) name from url("
  17. + url.toString()
  18. + ") use keys([client, transporter])");
  19. com.alibaba.dubbo.remoting.Transporter extension = (com.alibaba.dubbo.remoting.Transporter) ExtensionLoader
  20. .getExtensionLoader(
  21. com.alibaba.dubbo.remoting.Transporter.class)
  22. .getExtension(extName);
  23. //extension是NettyTransporter
  24. return extension.connect(arg0, arg1);
  25. }
  26. }

NettyTransporter类

  1. //NettyTransporter
  2. public Client connect(URL url, ChannelHandler listener) throws RemotingException {
  3. return new NettyClient(url, listener);
  4. }

/META-INF/dubbo/internal/com.alibaba.dubbo.remoting.Transporter文件内容中,没有发现wrapper。
netty=com.alibaba.dubbo.remoting.transport.netty.NettyTransporter
mina=com.alibaba.dubbo.remoting.transport.mina.MinaTransporter
grizzly=com.alibaba.dubbo.remoting.transport.grizzly.GrizzlyTransporter

HeaderExchangeClient的更多相关文章

  1. Dubbo中服务消费者和服务提供者之间的请求和响应过程

    服务提供者初始化完成之后,对外暴露Exporter.服务消费者初始化完成之后,得到的是Proxy代理,方法调用的时候就是调用代理. 服务消费者经过初始化之后,得到的是一个动态代理类,InvokerIn ...

  2. Dubbo中消费者初始化的过程解析

    首先还是Spring碰到dubbo的标签之后,会使用parseCustomElement解析dubbo标签,使用的解析器是dubbo的DubboBeanDefinitionParser,解析完成之后返 ...

  3. Dubbo 源码分析 - 服务调用过程

    注: 本系列文章已捐赠给 Dubbo 社区,你也可以在 Dubbo 官方文档中阅读本系列文章. 1. 简介 在前面的文章中,我们分析了 Dubbo SPI.服务导出与引入.以及集群容错方面的代码.经过 ...

  4. Dubbo 源码分析 - 服务引用

    1. 简介 在上一篇文章中,我详细的分析了服务导出的原理.本篇文章我们趁热打铁,继续分析服务引用的原理.在 Dubbo 中,我们可以通过两种方式引用远程服务.第一种是使用服务直联的方式引用服务,第二种 ...

  5. 【Dubbo 源码解析】05_Dubbo 服务发现&引用

    Dubbo 服务发现&引用 Dubbo 引用的服务消费者最终会构造成一个 Spring 的 Bean,具体是通过 ReferenceBean 来实现的.它是一个 FactoryBean,所有的 ...

  6. 9.7 dubbo心跳机制

    dubbo的心跳机制: 目的:检测provider与consumer之间的connection连接是不是还连接着,如果连接断了,需要作出相应的处理. 原理: provider:dubbo的心跳默认是在 ...

  7. bubbo调用Failed to invoke remote method异常解决

    bubbo调用服务异常: com.alibaba.dubbo.rpc.RpcException: Failed to invoke remote method: getPlanFlowInfo, pr ...

  8. 浅谈dubbo的ExceptionFilter异常处理

    背景 我们的项目使用了dubbo进行不同系统之间的调用. 每个项目都有一个全局的异常处理,对于业务异常,我们会抛出自定义的业务异常(继承RuntimeException). 全局的异常处理会根据不同的 ...

  9. dubbo超时重试和异常处理

    dubbo超时重试和异常处理 dubbo超时重试和异常处理 参考: https://www.cnblogs.com/ASPNET2008/p/7292472.html https://www.tuic ...

随机推荐

  1. PHP二维数组排序(感谢滔哥lvtao.net)

    滔哥原创 /* _ooOoo_ o8888888o 88" . "88 (| -_- |) O\ = /O ____/`---'\____ .' \\| |// `. / \\|| ...

  2. P4824 [USACO15FEB]Censoring (Silver) 审查(银)&&P3121 [USACO15FEB]审查(黄金)Censoring (Gold)

    P3121 [USACO15FEB]审查(黄金)Censoring (Gold) (银的正解是KMP) AC自动机+栈 多字符串匹配--->AC自动机 删除单词的特性--->栈 所以我们先 ...

  3. Linux内存管理--用户空间和内核空间【转】

    本文转载自:http://blog.csdn.net/yusiguyuan/article/details/12045255 关于虚拟内存有三点需要注意: 4G的进程地址空间被人为的分为两个部分--用 ...

  4. SQL NULL

    表 select CHARACTER_MAXIMUM_LENGTH from information_schema.columns where table_name= 'Alliance' selec ...

  5. 不同ContentType的post请求

    public static T Invoke<T>(string url, object input, bool requireJSON = true) { using (var clie ...

  6. redhat 7.2更新yum源时踩的坑

    一.update yum .先查看redhat7.2中yum的包版本 [root@localhost jiayimeng]# rpm -qa | grep yum -.el7.noarch -.el7 ...

  7. 论文笔记——SQUEEZENET ALEXNET-LEVEL ACCURACY WITH 50X FEWER PARAMETERS AND <0.5MB MODEL SIZE

    论文地址:https://arxiv.org/abs/1602.07360 模型地址:https://github.com/DeepScale/SqueezeNet 1. 论文思想 提出一种新的卷积组 ...

  8. Java自学入门新的体会0.2

    Java 基本数据类型 变量就是申请内存来存储值,也就是说,当创建变量的时候,需要在内存中申请空间. 内存管理系统根据变量的类型为变量分配存储空间,分配的空间只能用来存储该类型数据. 因此,通过定义不 ...

  9. Ubuntu 14.04 安装adobe flash player

    参考: How to install flash payer in Ubuntu 14.04 LTS? [duplicate] Ubuntu 14.04 安装adobe flash player 32 ...

  10. ThreadPool开启多线程时支持最大连接200个(默认为2个),不加则会超时

    //ThreadPool System.Net.ServicePointManager.DefaultConnectionLimit = 200;