`

dubbo源码学习之服务Provider export

 
阅读更多

业务接口wrapper类:

Class com.alibaba.dubbo.demo.DemoService$sw1{

public Object getPropertyValue(Object o, String n)

{

com.alibaba.dubbo.demo.DemoService w;

 try{

  w = ((com.alibaba.dubbo.demo.DemoService)$1);

  }catch(Throwable e)

  {

  throw new IllegalArgumentException(e);

  }

  throw new com.alibaba.dubbo.common.bytecode.NoSuchPropertyException("Not found property \""+$2+"\" filed or setter method in class com.alibaba.dubbo.demo.DemoService.");

}

 

 

  public Object invokeMethod(Object o, String n, Class[] p, Object[] v) throws java.lang.reflect.InvocationTargetException

  {

  com.alibaba.dubbo.demo.DemoService w;

  try{

   w = ((com.alibaba.dubbo.demo.DemoService)$1);

   }catch(Throwable e)

   {

   throw new IllegalArgumentException(e);

    }

   

    try

    {

    if( "sayHello".equals( $2 )  &&  $3.length == 1 )

    { 

    return ($w)w.sayHello((java.lang.String)$4[0]);

     }

     } catch(Throwable e)

      {   

        throw new java.lang.reflect.InvocationTargetException(e);

       } throw new com.alibaba.dubbo.common.bytecode.NoSuchMethodException("Not found method \""+$2+"\" in class com.alibaba.dubbo.demo.DemoService.");

 }

      

      

      

  public void setPropertyValue(Object o, String n, Object v)

  {

   com.alibaba.dubbo.demo.DemoService w;

   try{

   w = ((com.alibaba.dubbo.demo.DemoService)$1);

   }

   catch(Throwable e)

   {

   throw new IllegalArgumentException(e);

   }

   throw new com.alibaba.dubbo.common.bytecode.NoSuchPropertyException("Not found property \""+$2+"\" filed or setter method in class com.alibaba.dubbo.demo.DemoService.");

   }

}

 

导出服务URL

dubbo://10.0.3.126:20880/com.alibaba.dubbo.demo.DemoService?anyhost=true&application=demo-provider&dubbo=2.5.4-SNAPSHOT&generic=false&interface=com.alibaba.dubbo.demo.DemoService&loadbalance=roundrobin&methods=sayHello&owner=william&pid=20593&side=provider&timestamp=1409192221291

 

local export URL

injvm://127.0.0.1/com.alibaba.dubbo.demo.DemoService?anyhost=true&application=demo-provider&dubbo=2.5.4-SNAPSHOT&generic=false&interface=com.alibaba.dubbo.demo.DemoService&loadbalance=roundrobin&methods=sayHello&owner=william&pid=20593&side=provider&timestamp=1409192221291

 

将服务实现类包装为Invoker

public <T> Invoker<T> getInvoker(T proxy, Class<T> type, URL url) {

        // TODO Wrapper类不能正确处理带$的类名

        final Wrapper wrapper = Wrapper.getWrapper(proxy.getClass().getName().indexOf('$') < 0 ? proxy.getClass() : type);

        returnnew AbstractProxyInvoker<T>(proxy, type, url) {

            @Override

            protected Object doInvoke(T proxy, String methodName,

                                      Class<?>[] parameterTypes,

                                      Object[] arguments) throws Throwable {

                return wrapper.invokeMethod(proxy, methodName, parameterTypes, arguments);

            }

        };

    }

 

Export 服务Invoker:(本地)

  Exporter<?> exporter = protocol.export(

                    proxyFactory.getInvoker(ref, (Class) interfaceClass, local));

 

ProtocolListenerWrapper 监听exported服务的动态

   returnnew ListenerExporterWrapper<T>(protocol.export(invoker),

                Collections.unmodifiableList(ExtensionLoader.getExtensionLoader(ExporterListener.class)

                        .getActivateExtension(invoker.getUrl(), Constants.EXPORTER_LISTENER_KEY)));

其中public ListenerExporterWrapper(Exporter<T> exporter, List<ExporterListener> listeners)

listeners监听Exported的服务动态

 

ProtocolFilterWrapper 装饰 Invoker

protocol.export(buildInvokerChain(invoker, Constants.SERVICE_FILTER_KEY, Constants.PROVIDER));

 

InjvmProtocol 新建exporter对象(InjvmProtocal单例对象由exporterMap缓存所有exported的服务)

returnnew InjvmExporter<T>(invoker, invoker.getUrl().getServiceKey(), exporterMap);

 

ServiceConfig<T>中由exporters对该接口新exported服务缓存

exporters.add(exporter);

 

向注册中心export

Invoker<?> invoker = proxyFactory.getInvoker(ref, (Class) interfaceClass, registryURL.addParameterAndEncoded(Constants.EXPORT_KEY, url.toFullString()));

Exporter<?> exporter = protocol.export(invoker);

//registryURL: registry://127.0.0.1:2181/com.alibaba.dubbo.registry.RegistryService?application=demo-provider&dubbo=2.5.4-SNAPSHOT&export=dubbo%3A%2F%2F10.0.3.126%3A20880%2Fcom.alibaba.dubbo.demo.DemoService%3Fanyhost%3Dtrue%26application%3Ddemo-provider%26dubbo%3D2.5.4-SNAPSHOT%26generic%3Dfalse%26interface%3Dcom.alibaba.dubbo.demo.DemoService%26loadbalance%3Droundrobin%26methods%3DsayHello%26owner%3Dwilliam%26pid%3D20593%26side%3Dprovider%26timestamp%3D1409192221291&owner=william&pid=20593&registry=zookeeper&timestamp=1409192152649

 

ProtocolListenerWrapper remote注册暴露:

if (Constants.REGISTRY_PROTOCOL.equals(invoker.getUrl().getProtocol())) {

            returnprotocol.export(invoker);

}

 

ProtocolFilterWrapper remote注册暴露:

if (Constants.REGISTRY_PROTOCOL.equals(invoker.getUrl().getProtocol())) {

            returnprotocol.export(invoker);

}

 

RegistryProtocol export服务:

Exporter<T>  export(final Invoker<T> originInvoker)

——》

ExporterChangeableWrapper<T> exporter = doLocalExport(originInvoker);

——》//RegistryURL Invoker代理为服务DubboURLInvoker

    providerURL= dubbo://10.0.3.126:20880/com.alibaba.dubbo.demo.DemoService?anyhost=true&application=demo-provider&dubbo=2.5.4-SNAPSHOT&generic=false&interface=com.alibaba.dubbo.demo.DemoService&loadbalance=roundrobin&methods=sayHello&owner=william&pid=20593&side=provider&timestamp=1409192221291

final Invoker<?> invokerDelegete = new InvokerDelegete<T>(originInvoker, getProviderUrl(originInvoker));

      exporter = new ExporterChangeableWrapper<T>((Exporter<T>)protocol.export(

invokerDelegete), originInvoker);

    bounds.put(key, exporter);

 

DubboProtocol:

openServer(url);

ExchangeServer createServer(URL url)

server = Exchangers.bind(url, requestHandler);

   getExchanger(url).bind(url, handler);

publicstatic Exchanger getExchanger(String type/*header*/) {

        return ExtensionLoader.getExtensionLoader(Exchanger.class).getExtension(type);

    }

 

new HeaderExchangeServer(Transporters.bind(url, new DecodeHandler(new HeaderExchangeHandler(handler))));

DecodeHandler->HeaderExchangeHandler->DubboProtocol$requestHandler

 

NettyTransporter::bind(URL url, ChannelHandler listener)

     new NettyServer(url, listener)

     AbstractServer (url, ChannelHandlers.wrap(handler, ExecutorUtil.setThreadName(url, SERVER_THREAD_POOL_NAME)));

      ChannelHandlers.getInstance().wrapInternal(handler, url)

        new MultiMessageHandler(new HeartbeatHandler(ExtensionLoader.getExtensionLoader(Dispatcher.class)

                                        .getAdaptiveExtension().dispatch(handler, url)));

                          AllDispatcher:: dispatch(ChannelHandler handler, URL url)

new AllChannelHandler(handler, url)

 

NettyServer::doOpen()

new NioServerSocketChannelFactory(boss, worker, getUrl().getPositiveParameter(Constants.IO_THREADS_KEY, Constants.DEFAULT_IO_THREADS));

bootstrap = new ServerBootstrap(channelFactory);

bootstrap.setPipelineFactory(new ChannelPipelineFactory() {

            public ChannelPipeline getPipeline() {

                NettyCodecAdapter adapter = new NettyCodecAdapter(getCodec() ,getUrl(), NettyServer.this);

                ChannelPipeline pipeline = Channels.pipeline();

                pipeline.addLast("decoder", adapter.getDecoder());

                pipeline.addLast("encoder", adapter.getEncoder());

                pipeline.addLast("handler", nettyHandler);

                return pipeline;

            }

         //这里返回的ChannelPipelineChannelHandler只有三个,decoder负责解码,encoder负责编码,nettyHandler负责业务处理,其中nettyHander wrapper NettyServer->MultiMessageHandler->HeartbeatHandler->AllChannelHandler->DecodeHandler->HeaderExchangerHandler->requestHandler(真正的业务处理)

        });

        // bind

 

  channel = bootstrap.bind(getBindAddress());

分享到:
评论

相关推荐

    dubbo源码分析系列

    《Dubbo源码分析系列》是一份深入探讨Java开源...通过对《Dubbo源码分析系列》的学习,开发者不仅可以掌握Dubbo的基本使用,还能深入理解其设计思想,从而更好地在实际项目中应用和优化Dubbo,提高系统的稳定性和效率。

    dubbo源码解析2

    4. **Java RPC机制**:理解RPC(远程过程调用)的概念是学习Dubbo的关键之一。可以先从RMI、Hessian、Thrift等RPC框架入手,了解它们的工作原理及其与Dubbo之间的联系。 5. **Java其他内容**:除了以上提及的知识点...

    dubbo源码分析pdf.zip

    《Dubbo源码分析》是一套深入探讨Apache Dubbo这一著名Java开源框架的书籍,旨在帮助开发者更好地理解和应用Dubbo。Dubbo是一个高性能、轻量级的服务治理框架,广泛应用于微服务架构中,以实现服务的发布、发现、...

    dubbo入门学习框架源码

    通过深入学习和实践Dubbo源码,开发者不仅可以更好地理解Dubbo的工作原理,还能在实际项目中灵活运用,解决各种复杂的分布式服务问题。Dubbo的源码阅读也是一个不断提升自身技术深度的过程,有助于成长为更优秀的...

    dubbo源码解析

    本文对dubbo源码进行了深入的解析,涵盖了dubbo的架构、核心机制分析、扩展点加载流程、代理机制、远程调用流程、集群和容错处理、监控机制等多个方面。通过阅读和理解这些内容,可以更好地掌握dubbo的内部工作机制...

    dubbo-demo-consumer、dubbo-demo-provider、dubbo-simple-monitor

    本篇将详细讲解基于dubbo-demo-consumer、dubbo-demo-provider和dubbo-simple-monitor的实例服务,带你深入理解Dubbo的核心概念和操作流程。 首先,我们来看`dubbo-demo-consumer`,它是Dubbo服务的消费者。消费者...

    Dubbo源码分析之SPI

    总的来说,Dubbo的SPI机制是其强大功能背后的关键技术之一,它不仅提供了类似Java SPI的服务发现能力,还通过一系列的增强,使得服务的扩展和管理变得更加高效和便捷。在深入研究`dubbo-spi`和`java-spi`这两个...

    dubbo源码解析 1 pdf2.0

    通过源码的学习,开发者能够了解到RPC调用的整个流程,包括服务的注册、发现、调用、负载均衡等,这些都是分布式服务架构中不可或缺的部分。随着互联网技术的不断发展,掌握这些知识对于从事分布式系统开发的开发者...

    dubbo源码解析2.0.7z

    Dubbo作为Java领域最知名的分布式服务框架之一,其设计理念、实现原理以及在实际应用中的优化策略都是开发者们关注的焦点。这份解析文档旨在帮助读者理解Dubbo的工作流程,提升对分布式系统设计的理解,为实际开发...

    Dubbo 源码 阿里巴巴

    Dubbo 源码 阿里巴巴 这是最新的 源码大家学习一下!

    dubbo源码解析2.01.pdf

    - **Refer&export**:描述了服务引用和发布的完整流程,包括调用顺序、生成Invoker的过程、暴露服务等。 - **Registry**:注册中心的相关操作,包括创建注册中心、启动注册中心、发布服务和引用服务的过程。 - **...

    dubbo 源码

    总结,Dubbo的源码学习不仅可以帮助我们理解分布式服务治理的实现原理,还能提升我们的系统设计能力。通过深入分析`Provider`、`Consumer`、`Registry`、`Proxy`等核心组件,我们可以更好地运用Dubbo解决实际项目中...

    dubbo2.0源码解读

    了解Dubbo源码通常从其主要模块入手,如服务提供者(Provider)、服务消费者(Consumer)、注册中心(Registry)、协议层(Protocol)等。通过跟踪调用流程,理解服务发布、订阅、调用过程。 2. **Dubbo诞生的背景*...

    dubbo源码包

    Dubbo作为阿里巴巴开源的一款高性能、轻量级的服务治理框架,其源码的深入理解和分析对于Java开发者来说,具有极高的学习价值。本文将针对提供的dubbo-2.4.3-sources.jar等一系列源码包,逐一剖析其中的核心组件和...

    apache dubbo 3.0.7源码

    通过对Apache Dubbo 3.0.7源码的阅读和分析,开发者可以学习到如何设计高性能的RPC框架,理解服务治理的核心原理,以及如何通过SPI机制实现系统的高度可扩展性。这对于构建大型分布式系统或微服务架构具有极大的价值...

    dubbo-provider/dubbo-consumer

    标题中的“dubbo-provider”和“dubbo-consumer”指的是Dubbo框架中的两个核心组件,分别代表服务提供者和服务消费者。Dubbo是一个由阿里巴巴开源的高性能、轻量级的Java服务治理框架,它主要应用于分布式系统,实现...

    dubbo-Consumer,dubbo-provider

    综上所述,这个项目是一个基于Dubbo构建的服务架构,其中`dubbo-consumer`负责调用服务,`dubbo-provider`负责提供服务,两者通过Redis作为注册中心进行交互。整个项目是用Maven管理的,可以直接通过`main`方法运行...

Global site tag (gtag.js) - Google Analytics