服务提供端配置:
1 <!-- 提供方应用信息,用于计算依赖关系 --> 2 <dubbo:application name="demo-provider"/> 3 4 <!-- 使用zookeeper注册中心,并使用curator客户端 --> 5 <dubbo:registry protocol="zookeeper" address="10.211.55.5:2181" client="curator"/> 6 7 <!-- 用dubbo协议在20880端口暴露服务 --> 8 <dubbo:protocol name="dubbo" port="20880"/> 9 10 <!-- 和本地bean一样实现服务 --> 11 <bean id="demoService" class="com.alibaba.dubbo.demo.provider.DemoServiceImpl"/> 12 13 <!-- 声明需要暴露的服务接口 --> 14 <dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService"/>
一 ServiceBean
1 继承实现关系
2 最终的ServiceBean实例
-->String id: "com.alibaba.dubbo.demo.DemoService" -->String beanName: "com.alibaba.dubbo.demo.DemoService" -->ApplicationContext applicationContext: ClassPathXmlApplicationContext实例 -->supportedApplicationListener:true -->List<URL> urls: ["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"] -->List<Exporter<?>> exporters:[ -->InjvmExporter实例 -->String key:com.alibaba.dubbo.demo.DemoService -->Map<String, Exporter<?>> exporterMap: {"com.alibaba.dubbo.demo.DemoService ", 当前的JvmExporter实例} -->Invoker invoker:经过filter包装的AbstractProxyInvoker实例 -->RegistryProtocol返回的新的Exporter实例 -->Exporter exporter: ExporterChangeableWrapper<T> exporter实例 -->Invoker originInvoker:经过filter包装的AbstractProxyInvoker实例 -->Exporter exporter: DubboExporter -->Registry registry: 上边的ZookeeperRegistry实例 ] -->String interfaceName:"com.alibaba.dubbo.demo.DemoService" -->Class<?> interfaceClass:interface com.alibaba.dubbo.demo.DemoService -->T ref: DemoServiceImpl实例 -->String path:"com.alibaba.dubbo.demo.DemoService" -->List<ProtocolConfig> protocols:[解析:<dubbo:protocol name="dubbo" port="20880" id="dubbo" />] -->ApplicationConfig application:[解析:<dubbo:application name="demo-provider" id="demo-provider" />] -->List<RegistryConfig> registries:[解析:<dubbo:registry address="10.211.55.5:2181" protocol="zookeeper" id="com.alibaba.dubbo.config.RegistryConfig" />]
二 调用简图
三 代码调用链
ServiceBean.onApplicationEvent(ApplicationEvent event) -->ServiceConfig.export() -->doExport() -->doExportUrls() -->doExportUrlsFor1Protocol(ProtocolConfig protocolConfig, List<URL> registryURLs) protocolConfig:<dubbo:protocol name="dubbo" port="20880" id="dubbo" /> registryURLs:registry://10.211.55.5:2181/com.alibaba.dubbo.registry.RegistryService?application=demo-provider&client=curator&dubbo=2.0.0&pid=3141®istry=zookeeper×tamp=1510021313960 <!-- 一 本地暴露 --> -->exportLocal(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=3141&side=provider×tamp=1510021401013 //1.1 将实现类ref封装成Invoker -->JavassistProxyFactory.getInvoker(T proxy, Class<T> type, URL url) proxy:DemoServiceImpl实例(即ref实例) type:interface com.alibaba.dubbo.demo.DemoService url:injvm://127.0.0.1/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 -->Wrapper.getWrapper(Class DemoServiceImpl) -->new AbstractProxyInvoker<T>(proxy, type, url) //1.2 将实现类Invoker暴露为Exporter -->ProtocolFilterWrapper.buildInvokerChain(final Invoker<T> invoker, String key, String group) 组建invoker链,实际上只有最后一个是真正的AbstractProxyInvoker实例,前边的都是filter。 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:com.alibaba.dubbo.demo.DemoService exporterMap:传入时为空,构造器执行后为{"com.alibaba.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.211.55.5: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) -->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://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 -->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实例} //2.3 开启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.4 创建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.5 向注册中心注册服务 -->registry.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.6 订阅override数据 -->ZookeeperRegistry.doSubscribe(final URL url, final NotifyListener listener) url:provider://10.10.10.10:20880/com.alibaba.dubbo.demo.DemoService?anyhost=true&application=demo-provider&category=configurators&check=false&dubbo=2.0.0&generic=false&interface=com.alibaba.dubbo.demo.DemoService&methods=sayHello&pid=3508&side=provider×tamp=1510023456461 listener:RegistryProtocol.OverrideListener实例 //2.7 创建新的Exporter实例 -->new Exporter<T>()//包含了上边的ExporterChangeableWrapper<T> exporter实例 + ZookeeperRegistry实例