`

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());

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics