二、dubbo标签解析
com.alibaba.dubbo.config.spring.schema.DubboNamespaceHandler
public void init() {
   registerBeanDefinitionParser("application", new DubboBeanDefinitionParser(ApplicationConfig.class, true));
        registerBeanDefinitionParser("module", new DubboBeanDefinitionParser(ModuleConfig.class, true));
        registerBeanDefinitionParser("registry", new DubboBeanDefinitionParser(RegistryConfig.class, true));
        registerBeanDefinitionParser("monitor", new DubboBeanDefinitionParser(MonitorConfig.class, true));
        registerBeanDefinitionParser("provider", new DubboBeanDefinitionParser(ProviderConfig.class, true));
        registerBeanDefinitionParser("consumer", new DubboBeanDefinitionParser(ConsumerConfig.class, true));
        registerBeanDefinitionParser("protocol", new DubboBeanDefinitionParser(ProtocolConfig.class, true));
        registerBeanDefinitionParser("service", new DubboBeanDefinitionParser(ServiceBean.class, true));
        registerBeanDefinitionParser("reference", new DubboBeanDefinitionParser(ReferenceBean.class, false));
        registerBeanDefinitionParser("annotation", new DubboBeanDefinitionParser(AnnotationBean.class, true));
    }

三、ServiceBean<T> 生产者服务暴漏过程,<dubbo:service>标签最终解析成了ServiceBean。
1、 ServiceConfig 的export方法为暴漏服务的方法。
    private void doExportUrls() {
        List<URL> registryURLs = loadRegistries(true);
//loadRegistries检查了注册中心,如果存在设置了URL的Protocol为registry
// url = url.addParameter(Constants.REGISTRY_KEY, url.getProtocol());
//可以配置多协议暴漏
        for (ProtocolConfig protocolConfig : protocols) {
            doExportUrlsFor1Protocol(protocolConfig, registryURLs);
        }
    }
2、 doExportUrlsFor1Protocol中
   Invoker<?> invoker = proxyFactory.getInvoker(ref, (Class) interfaceClass, registryURL.addParameterAndEncoded(Constants.EXPORT_KEY, url.toFullString()));
   //生成了invoker,默认使用JavassistProxyFactory
   Exporter<?> exporter = protocol.export(invoker);
   exporters.add(exporter);
   
   这个protocol使用的是Adaptive的,而这个invoker.url.protocol为registry,所以实际会得到RegistryProtocol
   再加上wrapper则会得到ProtocolListenerWrapper->ProtocolFilterWrapper->RegistryProtocol
   
3、ProtocolListenerWrapper和ProtocolFilterWrapper在export方法中对registry类型的直接通过
   ProtocolFilterWrapper
   public <T> Exporter<T> export(Invoker<T> invoker) throws RpcException {
        if (Constants.REGISTRY_PROTOCOL.equals(invoker.getUrl().getProtocol())) {
            return protocol.export(invoker);
        }
        return protocol.export(buildInvokerChain(invoker, Constants.SERVICE_FILTER_KEY, Constants.PROVIDER));
    }

到了RegistryProtocol的export
   //export invoker
   final ExporterChangeableWrapper<T> exporter = doLocalExport(originInvoker);
   
   doLocalExport中
   final Invoker<?> invokerDelegete = new InvokerDelegete<T>(originInvoker, getProviderUrl(originInvoker));
   exporter = new ExporterChangeableWrapper<T>((Exporter<T>)protocol.export(invokerDelegete), originInvoker);
   bounds.put(key, exporter);
   
   getProviderUrl(originInvoker)通过invoker的url 获取 providerUrl的地址,这时候url的protocol就不是registry了,
   而是具体的协议,比如dubbo
   那么后面的protocol.export就会使用DubboProtocol,当然同样加上了wrapper,这两个wrapper会在调用过程中加上
   listener和filter链,链的最后就是invoker
   
4、DubboProtocol的export
   DubboExporter<T> exporter = new DubboExporter<T>(invoker, key, exporterMap);
   ....
   openServer(url)->createServer(url);
   根据具体协议启动服务器,监听端口

5、Exchangers.bind->Transporters.bind->Server
   server = Exchangers.bind(url, requestHandler);
   HeaderExchanger的bind
    public ExchangeServer bind(URL url, ExchangeHandler handler) throws RemotingException {
        return new HeaderExchangeServer(Transporters.bind(url, new DecodeHandler(new HeaderExchangeHandler(handler))));
    }

Transporters的bind  return getTransporter().bind(url, handler);
这里的Transporter使用的是自适应的,那么会根据配置或者默认使用NettyTransporter

6、NettyTransporter.bind->NettyServer(url, listener);
   NettyServer里面的doOpen就是netty启动服务端的过程。
   
7、回到RegistryProtocol的export,在暴漏完invoker后,接着去注册中心注册了服务提供者
   使用zookeeper则会注册地址/dubbo/interfaceClass/providers/{providerUrl}存储生成者的ip,端口等,供消费者订阅获取使用

dubbo 2标签解析 ServiceBeanT 生产者服务暴漏过程相关推荐

  1. Dubbo的服务暴漏与服务发现源码详解

    服务暴漏 如果配置需要刷新则根据配置优先级刷新服务配置 如果服务已经导出,则直接返回 是否异步导出(全局或者服务级别配置了异步,则需要异步导出服务) 服务暴漏入口DefaultModuleDeploy ...

  2. dubbo配置参考手册,dubbo各个标签解析

    配置参考手册 <dubbo:service/> <dubbo:reference/> <dubbo:protocol/> <dubbo:registry/&g ...

  3. 【springcloud】Eureka 服务提供者 增加服务暴漏

    一.Controller 中添加一下代码 @Autowiredprivate DiscoveryClient client;@RequestMapping(value = "/discove ...

  4. 【SpringCloudAlibaba学习 04】整合Dubbo(实现数据消费者服务调用数据生产者服务)

    文章目录 引言 1.[数据生产者工程]创建service-api子工程 1.1.[数据生产者服务]创建user-service-api服务 目录结构 UserService服务接口 UserServi ...

  5. dubbo源码解析(二)

    大家好,我是烤鸭: dubbo 源码解析: 1.服务导出 介绍: Dubbo 服务导出过程始于 Spring 容器发布刷新事件,Dubbo 在接收到事件后,会立即执行服务导出逻辑.整个逻辑大致可分为三 ...

  6. 【Dubbo源码阅读系列】服务暴露之本地暴露

    在上一篇文章中我们介绍 Dubbo 自定义标签解析相关内容,其中我们自定义的 XML 标签 <dubbo:service /> 会被解析为 ServiceBean 对象(传送门:Dubbo ...

  7. 初试 Kubernetes 暴漏服务类型之 Nginx Ingress

    目录 Ingress 介绍 环境.软件准备 部署 Default Backend 部署 Ingress Controller 部署 Ingress Name based virtual hosting ...

  8. Kubernetes暴漏服务类型之Nginx Ingress

    Kubernetes暴漏服务类型之Nginx Ingress 一.Ingress 介绍 LoadBlancer Service NodePort Service 1.NodePort类型的服务 Ing ...

  9. Dubbo源码解析之服务路由策略

    1. 简介 服务目录在刷新 Invoker 列表的过程中,会通过 Router 进行服务路由,筛选出符合路由规则的服务提供者.在详细分析服务路由的源码之前,先来介绍一下服务路由是什么.服务路由包含一条 ...

最新文章

  1. 面试问题-使用Java线程做数学运算
  2. [官版翻译]OpenStack centos版安装(三)
  3. SQL Server移除事务日志后sys.master_files依然存在记录问题
  4. Java调用.Net的web service的几种方式
  5. 【Java MyBatis Generator】使用generator自动生成Dao,Mapping和实体文件
  6. JAVA UDP网络编程学习笔记
  7. 静默错误:为什么看了那么多灾难,还是过不好备份这一关?
  8. 织梦根目录感染abc.php,织梦SEO优化:织梦dedecms根目录下robots.txt文件设置详解! - 张俊SEO...
  9. mysql oracle视频网盘_前端和后端终极学习视频(百度网盘资料)
  10. Eclipse如何优化(转)
  11. Android 关于推送通知还需要一些其他的设置问题,最新高频Android笔试题分享
  12. php 手写签批 手机办公_好签原笔迹手写签批SDK
  13. 【灵修】应对“三季人”,多活十余年(2012-1-14)
  14. WWW 2022 | 搜索广告CVR延迟反馈建模DEFUSE
  15. 文学赏析 - 人生若只如初见
  16. 通俗解释Docker
  17. android平板改成电视盒子,【当贝市场】废旧手机改造成电视盒子详细教程
  18. 学习笔记:min-width和min-height
  19. 推荐uml 流程图 在线编辑工具
  20. 第三章-集合论 3.2-Russell 悖论(选读)

热门文章

  1. 计算机组成原理——加减运算 溢出判断
  2. Pyspark回归--IsotonicRegression
  3. 图片处理--羽化特效
  4. 搭建hadoop集群从裸机开始
  5. 研发人员为什么留不住:问题与现象、原因的解析
  6. 中央电教馆虚拟实验服务器,中央电化教育馆虚拟实验教学区域培训会(广州市)召开...
  7. java浮点型数据的比较
  8. 某政府门户网站维护项目运维方案
  9. 使用moment.js获取一个自然周开始日期和结束日期
  10. Grunt的安装与使用 (以Windows 64位为例)