1.1-服务提供者启动流程

2018-12-26  本文已影响0人  xhrg

一:入口

public class DubboNamespaceHandler extends NamespaceHandlerSupport {
    static {
        Version.checkDuplicate(DubboNamespaceHandler.class);
    }
     // 这个类DubboNamespaceHandler 会把xml中配置的一些标签注册为bean解析器,比如说遇到provider这个字符串就会用下面对应的Parser去解析,所以下面的字符串application,module,registry都会对应到不同的Parse实例。
    public void init() {
        registerBeanDefinitionParser("application", new DubboBeanDefinitionParser(ApplicationConfig.class, true));
        registerBeanDefinitionParser("module", new DubboBeanDefinitionParser(ModuleConfig.class, true));
        registerBeanDefinitionParser("registry", new DubboBeanDefinitionParser(RegistryConfig.class, true));
        registerBeanDefinitionParser("monitor", new DubboBeanDefinitionParser(MonitorConfig.class, true));
        registerBeanDefinitionParser("provider", new DubboBeanDefinitionParser(ProviderConfig.class, true));
        registerBeanDefinitionParser("consumer", new DubboBeanDefinitionParser(ConsumerConfig.class, true));
        registerBeanDefinitionParser("protocol", new DubboBeanDefinitionParser(ProtocolConfig.class, true));
        //比如说配置了<dubbo:service ref="personService" interface="com.wang.dubbo.api.PersonService" protocol="dubbo" />
        //这个时候就会用DubboBeanDefinitionParser去解析这个标记,然后组装ServiceBean对象。
        registerBeanDefinitionParser("service", new DubboBeanDefinitionParser(ServiceBean.class, true));
        registerBeanDefinitionParser("reference", new DubboBeanDefinitionParser(ReferenceBean.class, false));
        registerBeanDefinitionParser("annotation", new DubboBeanDefinitionParser(AnnotationBean.class, true));
    }

}

如果遇到<dubbo:service ref="personService" interface="com.wang.dubbo.api.PersonService" protocol="dubbo" />,解析代码是在DubboBeanDefinitionParser的parse方法中,dubbo-2.5.3.jar的231行。

beanDefinition.getPropertyValues().addPropertyValue(property, reference);

这里的beanDefinition指的是RootBeanDefinition实例,内部的BeanClass是com.alibaba.dubbo.config.spring.ServiceBean,
这里的property, reference分别是interface和com.wang.dubbo.api.PersonService。到此已经可以看到,解析成功,组装了ServiceBean。

二:ServiceBean的启动

2.1 afterPropertiesSet

第一步,设置属性,包括:

2.2 onApplicationEvent

该方法会调用export(); 实现真实的服务启动发布

三:export方法

export先做属性等的设置,然后做检查,最后调用doExportUrls。

dubbo://192.168.122.23:20880/com.wang.dubbo.api.PersonService?anyhost=true&application=Dubbo_HelloWorld&dubbo=2.5.3&interface=com.wang.dubbo.api.PersonService&methods=say&pid=59448&side=provider&timestamp=1545891510122

三:protocol.export(invoker) 方法

四:doLocalExport(RegistryProtocol|exporth)

该方法调用到底层会调用到DubboProtocol的export,该方法内部会openServer。 openServer 会启动netty监听端口。
大致的调用链如下(笔记的写法和eclipse的显示上下相反)

当client调用的时候,拿到请求数据,会解析成Request,然后处理后返回,核心代码在HeaderExchangeHandler中

Response response = handleRequest(exchangeChannel, request);

AbstractProtocol的exporterMap会缓存Exporter,其中key是接口名+端口,比如说com.wang.dubbo.api.PersonService:20880,
然后从Exporter中拿到invoker,invoker.invoke(Invocation inv);返回结果invoke到实际类调用中间会经过非常多的Filter。

最后

dubbo服务者发布过程中的很多信息,都会记录在该ServiceBean的属性中。

上一篇下一篇

猜你喜欢

热点阅读