dubbo服务端启动流程
dubbo版本:2.6.1
启动dubbo服务层的时候,如果剥离了Spring,则使用dubbo自带的硬编码的方式编写启动配置文件.代码如下:
public static void main(String[] args) throws InterruptedException { /*接口实现*/ GreetingService greetingService = new GreetingServiceImpl(); /*application配置*/ ApplicationConfig applicationConfig = new ApplicationConfig(); applicationConfig.setName("dubbo-demo-provider"); /*注册中心配置,对应于consumer层*/ RegistryConfig registryConfig = new RegistryConfig(); registryConfig.setProtocol("zookeeper"); registryConfig.setAddress("127.0.0.1:2181"); registryConfig.setClient("zkclient"); /*服务层配置,提供服务的协议信息*/ ProtocolConfig protocolConfig = new ProtocolConfig(); protocolConfig.setName("dubbo"); protocolConfig.setPort(20880); protocolConfig.setThreadpool("cached"); protocolConfig.setThreads(100); /*provider的接口配置,聚合各种配置信息,同样ServiceConfig也是重对象*/ ServiceConfig<GreetingService> serviceConfig = new ServiceConfig<GreetingService>(); serviceConfig.setApplication(applicationConfig); serviceConfig.setRegistry(registryConfig); serviceConfig.setProtocol(protocolConfig); serviceConfig.setInterface(GreetingService.class); serviceConfig.setRef(greetingService); serviceConfig.setVersion("1.0.0"); serviceConfig.setGroup("dubbo"); /*暴露以及注册服务*/ serviceConfig.export(); //挂起当前线程 Thread.currentThread().join();
通过调用export方法完成服务的注册.
首先进入ServiceConfig export()方法,如果没有设置延迟则直接调用doExport() 方法.
在doExport()方法中会进行一系列的判断和赋值.
接着进入:
doExportUrls() 方法
获取注册服务的url集合
下面进入:
doExportUrlsFor1Protocol(protocolConfig, registryURLs);
这里如果没有设置协议则默认会用dubbo协议.
接着进入:
exportLocal(url);
下面就该proxyFactory登场了:
默认使用JavassistProxyFactory调用其
getInvoker(T proxy, Class<T> type, URL url)
方法.里面重写了doInvoke方法
Export方法在进入到DubboProtocol前需要经过装饰器模式包装过的ProtocolFilterWrapper->ProtocolListenerWrapper->RegistryProtocol.
在RegistryProtocol中注册服务,将serviceUrl注册到注册中心,供客户端订阅.可以看出经常实现单例模式中的加锁机制实现:
最后走到:
DubboProtocol的export(Invoker<T> invoker)
调用:
openServer(url);
在通信对象中ExchangeServer绑定ExchangeHandler获取exporterMap中的Exporter调用服务.
通过循环将所有的注册信息加入exporters中.
通过这几个步骤完成服务端的初始化.
总体流程图: