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®istry=zookeeper×tamp=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®ister=true&release=&side=provider×tamp=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®ister=true&release=&side=provider×tamp=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×tamp=1510021401013&pid=3141®istry=zookeeper×tamp=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®ister=true&release=&side=provider×tamp=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×tamp=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×tamp=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×tamp=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×tamp=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×tamp=1510023456461&pid=3508×tamp=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×tamp=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×tamp=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×tamp=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×tamp=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®ister=true&release=&side=provider×tamp=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®ister=true&release=&side=provider×tamp=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