Dubbo源码Debug-服务暴露解析

dubbo_export.md 
//服务暴露
ServiceConfig.export()
-->doExport()
    -->doExportUrls()
        -->doExportUrlsFor1Protocol(ProtocolConfig protocolConfig, List<URL> registryURLs)
            protocolConfig:<dubbo:protocol name="dubbo" valid="true" id="dubbo" prefix="dubbo.protocols." />
            registryURLs:registry://127.0.0.1:2181/org.apache.dubbo.registry.RegistryService?application=dubbo-demo-api-provider&dubbo=2.0.2&pid=1420&registry=zookeeper&timestamp=1556884008715
            //1.本地暴露
            -->exportLocal(URL url)
                url:dubbo://30.208.41.156:20880/org.apache.dubbo.demo.DemoService?anyhost=true&application=dubbo-demo-api-provider&bind.ip=30.208.41.156&bind.port=20880&default.deprecated=false&default.dynamic=true&default.register=true&deprecated=false&dubbo=2.0.2&dynamic=true&generic=false&interface=org.apache.dubbo.demo.DemoService&methods=sayHello&pid=1420&register=true&release=&side=provider&timestamp=1556884161421
                //1.1 将实现类ref封装成Invoker
                -->JavassistProxyFactory.getInvoker(T proxy, Class<T> type, URL url)
                    proxy:DemoServiceImpl实例(即ref实例) 
                    type:interface org.apache.dubbo.demo.DemoService  
                    url:injvm://127.0.0.1/org.apache.dubbo.demo.DemoService?anyhost=true&application=dubbo-demo-api-provider&bind.ip=30.208.41.156&bind.port=20880&default.deprecated=false&default.dynamic=true&default.register=true&deprecated=false&dubbo=2.0.2&dynamic=true&generic=false&interface=org.apache.dubbo.demo.DemoService&methods=sayHello&pid=1420&register=true&release=&side=provider&timestamp=1556884161421
                    -->Wrapper.getWrapper(Class DemoServiceImpl)
                    -->new AbstractProxyInvoker<T>(proxy, type, url)
                //1.2 将实现类Invoker暴露为Exporter
                -->ProtocolFilterWrapper.buildInvokerChain(final Invoker<T> invoker, String key, String group)
                    构建filter链表,取last最后一个为invoker
                    invoker:AbstractProxyInvoker实例 
                    key:service.filter 
                    group:provider
                -->InjvmProtocol.export(Invoker<T> invoker)
                    invoker:经过filter包装的invoker
                -->new InjvmExporter(Invoker<T> invoker, String key, Map<String, Exporter<?>> exporterMap) 
                    invoker:经过filter包装的invoker  
                    key:org.apache.dubbo.demo.DemoService 
                    exporterMap:传入时为空,构造器执行后为{"org.apache.dubbo.demo.DemoService", 当前的JvmExporter实例} 
                -->List<Exporter<?>> exporters.add(产生的exporter)
            //远程暴露
            //2.1 将实现类ref封装成Invoker
            -->JavassistProxyFactory.getInvoker(T proxy, Class<T> type, URL url)
                proxy:DemoServiceImpl实例(即ref实例) 
                type:interface com.alibaba.dubbo.demo.DemoService  
                url:registry://10.78.55.50:2181/com.alibaba.dubbo.registry.RegistryService?application=demo-provider&client=curator&dubbo=2.0.0&export=dubbo://10.10.10.10:20880/com.alibaba.dubbo.demo.DemoService?anyhost=true&application=demo-provider&dubbo=2.0.0&generic=false&interface=com.alibaba.dubbo.demo.DemoService&methods=sayHello&pid=3141&side=provider&timestamp=1510021401013&pid=3141&registry=zookeeper&timestamp=1510021313960
                -->Wrapper.getWrapper(Class DemoServiceImpl)
                -->new AbstractProxyInvoker<T>(proxy, type, url)
            -->QosProtocolWrapper.export
                -->ProtocolListenerWrapper.export
                    -->ProtocolFilterWrapper.export
                        //注册协议导出
                        -->RegistryProtocol.export(final Invoker<T> originInvoker)
                            originInvoker:上述的AbstractProxyInvoker实例
                            //2.2 将invoker转化为exporter
                            -->doLocalExport(originInvoker)
                                -->new InvokerDelegete(Invoker<T> invoker, URL url)
                                   invoker:原始的AbstractProxyInvoker实例
                                   url:dubbo://fe80:0:0:0:3c8b:dbff:fe15:87ff%8:20880/org.apache.dubbo.demo.DemoService?anyhost=true&application=dubbo-demo-api-provider&bind.ip=fe80:0:0:0:3c8b:dbff:fe15:87ff%8&bind.port=20880&default.deprecated=false&default.dynamic=true&default.register=true&deprecated=false&dubbo=2.0.2&dynamic=true&generic=false&interface=org.apache.dubbo.demo.DemoService&methods=sayHello&pid=25005&register=true&release=&side=provider&timestamp=1556988645066
                                -->ProtocolFilterWrapper.buildInvokerChain(final Invoker<T> invoker, String key, String group)
                                   组建invoker链,实际上只有最后一个是真正的InvokerDelegete实例,前边的都是filter
                                   invoker:InvokerDelegete实例 
                                   key:service.filter 
                                   group:provider
                                -->DubboProtocol.export(Invoker<T> invoker)
                                   invoker:经过filter包装的InvokerDelegete实例
                                  -->new DubboExporter(Invoker<T> invoker, String key, Map<String, Exporter<?>> exporterMap) 
                                     invoker:经过filter包装的InvokerDelegete实例  
                                     key:com.alibaba.dubbo.demo.DemoService:20880 (group/servicename:version:port) 
                                     exporterMap:传入时为空,构造器执行后又执行了put,为{"com.alibaba.dubbo.demo.DemoService:20880", 当前的DubboExporter实例} 
                                  //开启netty服务端监听客户端请求 
                                  -->openServer(URL url) 
                                     url:dubbo://10.10.10.10:20880/com.alibaba.dubbo.demo.DemoService?anyhost=true&application=demo-provider&dubbo=2.0.0&generic=false&interface=com.alibaba.dubbo.demo.DemoService&methods=sayHello&pid=3508&side=provider&timestamp=1510023456461 
                                    -->createServer(URL url) 
                                        -->HeaderExchanger.bind(URL url, ExchangeHandler handler) 
                                           url:dubbo://10.10.10.10:20880/com.alibaba.dubbo.demo.DemoService?anyhost=true&application=demo-provider&channel.readonly.sent=true&codec=dubbo&dubbo=2.0.0&generic=false&heartbeat=60000&interface=com.alibaba.dubbo.demo.DemoService&methods=sayHello&pid=3508&side=provider&timestamp=1510023456461 handler:DubboProtocol.requestHandler 
                                          -->new DecodeHandler(new HeaderExchangeHandler(handler))) 
                                            -->NettyTransporter.bind(URL url, ChannelHandler listener) 
                                               url:dubbo://10.10.10.10:20880/com.alibaba.dubbo.demo.DemoService?anyhost=true&application=demo-provider&channel.readonly.sent=true&codec=dubbo&dubbo=2.0.0&generic=false&heartbeat=60000&interface=com.alibaba.dubbo.demo.DemoService&methods=sayHello&pid=3508&side=provider&timestamp=1510023456461  listener:上边的DecodeHandler实例 
                                              -->new NettyServer(URL url, ChannelHandler handler) 
                                                -->ChannelHandler.wrapInternal(ChannelHandler handler, URL url) 
                                                   handler:上边的DecodeHandler实例  
                                                   url:dubbo://10.10.10.10:20880/com.alibaba.dubbo.demo.DemoService?anyhost=true&application=demo-provider&channel.readonly.sent=true&codec=dubbo&dubbo=2.0.0&generic=false&heartbeat=60000&interface=com.alibaba.dubbo.demo.DemoService&methods=sayHello&pid=3508&side=provider&threadname=DubboServerHandler-10.10.10.10:20880&timestamp=1510023456461 
                                                  -->new MultiMessageHandler(HeartbeatHandler(AllChannelHandler(handler))) 
                                                -->getChannelCodec(url)//获取Codec2,这里是DubboCountCodec实例 
                                                -->doOpen()//开启netty服务 
                                          -->new HeaderExchangeServer(Server server) 
                                             server:上述的NettyServer 
                                            -->startHeatbeatTimer() 
                                -->new ExporterChangeableWrapper(Exporter<T> exporter, Invoker<T> originInvoker) 
                                   exporter:上述的DubboExporter实例   
                                   originInvoker:原始的AbstractProxyInvoker实例 
                            //2.3 创建Registry:创建zkclient,连接zk 
                            -->getRegistry(final Invoker<?> originInvoker)
                                -->AbstractRegistryFactory.getRegistry(URL url)
                                   url:zookeeper://10.211.55.5:2181/com.alibaba.dubbo.registry.RegistryService?application=demo-provider&dubbo=2.0.0&export=dubbo://10.10.10.10:20880/com.alibaba.dubbo.demo.DemoService?anyhost=true&application=demo-provider&dubbo=2.0.0&generic=false&interface=com.alibaba.dubbo.demo.DemoService&methods=sayHello&pid=3508&side=provider&timestamp=1510023456461&pid=3508&timestamp=1510023439825
                                  -->ZookeeperRegistryFactory.createRegistry(URL url)
                                    -->new ZookeeperRegistry(URL url, ZookeeperTransporter zookeeperTransporter)
                                       url:zookeeper://10.211.55.5:2181/com.alibaba.dubbo.registry.RegistryService?application=demo-provider&dubbo=2.0.0&interface=com.alibaba.dubbo.registry.RegistryService&pid=3508&timestamp=1510023439825
                                      -->ZkclientZookeeperTransporter.connect(URL url)
                                        -->new ZkclientZookeeperClient(URL url)
                                           url:zookeeper://10.211.55.5:2181/com.alibaba.dubbo.registry.RegistryService?application=demo-provider&dubbo=2.0.0&interface=com.alibaba.dubbo.registry.RegistryService&pid=3508&timestamp=1510023439825
                                          -->new ZkClient(url.getBackupAddress())//这里是10.211.55.5:2181
                                -->AbstractRegistryFactory.Map<String, Registry> REGISTRIES.put("zookeeper://10.211.55.5:2181/com.alibaba.dubbo.registry.RegistryService", 上边的ZookeeperRegistry实例)
                            //2.4 向注册中心注册服务
                            -->register(registedProviderUrl)
                                -->ZookeeperRegistry.doRegister(URL url)
                                   url:dubbo://10.10.10.10:20880/com.alibaba.dubbo.demo.DemoService?anyhost=true&application=demo-provider&dubbo=2.0.0&generic=false&interface=com.alibaba.dubbo.demo.DemoService&methods=sayHello&pid=3508&side=provider&timestamp=1510023456461
                                  -->AbstractZookeeperClient.create(String path, boolean ephemeral)
                                     path:/dubbo/com.alibaba.dubbo.demo.DemoService/providers/dubbo://10.10.10.10:20880/com.alibaba.dubbo.demo.DemoService?anyhost=true&application=demo-provider&dubbo=2.0.0&generic=false&interface=com.alibaba.dubbo.demo.DemoService&methods=sayHello&pid=3508&side=provider&timestamp=1510023456461  
                                     ephemeral=true
                            //2.5 订阅override数据
                            -->FailbackRegistry.subscribe(URL url, NotifyListener listener)
                                -->ZookeeperRegistry.doSubscribe(final URL url, final NotifyListener listener)
                                     url:provider://fe80:0:0:0:3c8b:dbff:fe15:87ff%8:20880/org.apache.dubbo.demo.DemoService?anyhost=true&application=dubbo-demo-api-provider&bind.ip=fe80:0:0:0:3c8b:dbff:fe15:87ff%8&bind.port=20880&category=configurators&check=false&default.deprecated=false&default.dynamic=true&default.register=true&deprecated=false&dubbo=2.0.2&dynamic=true&generic=false&interface=org.apache.dubbo.demo.DemoService&methods=sayHello&pid=25957&register=true&release=&side=provider&timestamp=1556991658703
                                     listener:RegistryProtocol.OverrideListener实例
                                     -->notify(url, listener, urls)
                                        url:provider://fe80:0:0:0:3c8b:dbff:fe15:87ff%8:20880/org.apache.dubbo.demo.DemoService?anyhost=true&application=dubbo-demo-api-provider&bind.ip=fe80:0:0:0:3c8b:dbff:fe15:87ff%8&bind.port=20880&category=configurators&check=false&default.deprecated=false&default.dynamic=true&default.register=true&deprecated=false&dubbo=2.0.2&dynamic=true&generic=false&interface=org.apache.dubbo.demo.DemoService&methods=sayHello&pid=25957&register=true&release=&side=provider&timestamp=1556991658703
                            //2.6 返回Exporter实例 Ensure that a new exporter instance is returned every time export
                            -->return new DestroyableExporter<>(exporter)

https://www.sohu.com/a/254976482_100109711

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Doe 发布 [V1.0.0] 前段时间排查某问题的时候,想要快速知道某些dubbo接口(三无)的响应结果,但不想启动项目(因为这些项目不是你负责的,不会部署而且超级笨重),也不想新建一个dubbo客户端项目(占地方),也不想开telnet客户端连接口(麻烦而且有限制)。所以扣了dubbo的netty模块源码,封装了个收发客户端集成一个工具,可以快速调试dubbo接口。源码地址:https://github.com/VIPJoey/doe 极简模式 普通模式 目录结构 mmc-dubbo-api 接口项目,主要用于测试。 mmc-dubbo-provider dubbo提供者项目,主要用于测试。 mmc-dubbo-doe 主项目,实现dubbo接口调试。 deploy 部署文档 功能特性 极简模式:通过dubbo提供的telnet协议收发数据。 普通模式:通过封装netty客户端收发数据。 用例模式:通过缓存数据,方便下一次操作,依赖普通模式。 增加依赖:通过调用maven命令,下载jar包和热加载到系统,主要用来分析接口方法参数,主要作用在普通模式。 依赖列表:通过分析pom文件,展示已经加载的jar包。 其它特性 springboot 整合 redis,支持spring el 表达式。 springboot 整合 thymeleaf。 springboot 整合 logback。 netty rpc 实现原理。 开发环境 jdk 1.8 maven 3.5.3 dubbo 2.6.1 lombok 1.16.20 idea 2018 windows 7 安装步骤 安装jdk 安装maven,并设置好环境变量,仓库目录。 进入mmc-dubbo-api目录,执行mvn clean install命令,省api的jar包。 进入mmc-dubbo-doe目录,执行mvn clean install 命令,在target目录生成dubbo-doe-1.0.0-RELEASE.jar 在F盘(可以任意盘)创建目录F:\app\doe 把dubbo-doe-1.0.0-RELEASE.jar拷贝到F:\app\doe 把deploy目录中的所有文件拷贝到F:\app\doe 如果您电脑安装了git bash,可以在bash窗口运行 ./deploy.sh start,否则如果没有安装git bash,只能打开cmd切换到F:\app\doe目录,然后执行java -jar dubbo-doe-1.0.0-RELEASE.jar --spring.profiles.active=prd 打开浏览器,访问地址:http://localhost:9876/doe/home/index 全剧终
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值