一、框架设计
二、启动解析、加载配置信息
dubbo的配置是如果是以spring boot的方式启动,则,使用spring boot的加载方式启动,spring boot解析配置文件,有一个总接口BeanDefinitionParser,而Dobbo的解析器是使用的DubboBeanDefinitionParser类的parse方法,每个标签解析,都会调用一次parse方法,进行解析,解析时,也会相对应的传入标签类型的config class
dubbo的构造器前一层是DoubboNamespaceHandler,dubbo的命名空间解析处理器,根据标签名,去匹配对应的config class,然后传给parse方法,service的bean会解析成对应的serviceBean
serviceBean实现了两个重要的机制
1:InitializingBean
spring boot的一个bean
当组件创建完这个bean之后,会调用InitializingBean里面的afterPropertiesSet()方法
2:ApplicationListener
应用的监听器,会回调ApplicationListener的onApplicationEvent方法,事件类型为ContextRefreshedEvent类,ServiceBean重写了onApplicationEvent方法,判读服务正常的情况下调用export方法,export就是暴露服务方法,里面会调用doExport
三、服务暴露
doExport方法里面有一个doExportUrls()方法,加载注册中心的信息,dubbo可以有多个注册中心,会循环调用doExportUrlsFor1Protocol方法,
doExportUrlsFor1Protocol里面利用proxyFactory获取到Invoker,获取实现类跟接口的的执行着,invoker
然后使用protocol.export暴露invoker
protocol获取方式是ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptive()基于java的spi机制,由于是使用的dubbo协议,就使用dubboProtocol,包括要注册的注册中心Protocol(RegistryProtocol)
RegistyProtocol的export会传一个originInvoker原生的执行者,里面封装了服务的实现,服务的接口,服务的url等接口信息,
1:doLocalExport服务本地的暴露
doLocalExport,拿到要暴露的执行者,掉用protocol(DoubleProtocol).export方法,
先拿到invoker的Url地址,要在注册中心调用的地址,包装成dubbo的
2:ProviderConsumerRegTable.registerProvider方法
提供者和消费者的注册表registerProviderf方法把注册中心(originInvoker)传进来,注册的地址(registryUrl)提供者的url地址(registedProviderUrl)包装成dubbo的export(DubboExporter)暴露器,创建一个信息交换的服务,调用creeateServer的方法,调用Exchangers.bind(url,requestHandler),绑定服务器,并绑定对应的处理器
bin绑定了一个url地址获取exchanger(getExchange)交换器的bind里面使用了Transporters.bin传输器的bind,,里面创建了netty服务器,监听对应的端口
接下来就注册服务者ProviderConsume的registerProvider方法providerInvokers服务执行者ConcurrentHash<String,Set
>providerInvokers url的地址,相关的服务实现
四、服务引用
ReferenceBean实现了FactoryBean工厂bean,获取工程bean的时候就会调用Facotry的getObject方法,返回值,就是标签对应的返回值调用get方法,调用init方法,createProxy(map)创建代理对象,里面由注册中心的地址,调用的方法,调用的接口等,
createProxy方法里面有一个refproTocol.refer,远程引用接口,采用spi加载protocol,使用了dubboProtocol的refer方法,先根据注册中心地址,得到注册中心信息,调用doFRefer
directory.subccribe根据注册中心来订阅,订阅提供服务者,提供的服务订阅服务会进入DubboProtocol的远程引用最终返回真正的执行者,调用远程连接的时候获取客户端getClient(url)根据连接数创建客户端,getSharedClient(rul)获取共享的客户端
initClient(url)初始化客户端Exchanges.connet()进行连接,使用getExchanger(url)进行连接
conent调用Transporters.conent方法连接传输器连接创建netty连接,监听这个连接返回对应的invoker
给ProviderConsumer注册表里面注册订阅的url往ConcurrentHash<String,Set
> consumerInvokers里面存放
五、服务调用
通过proxy代理对象执行方法,执行service方法是会进入InvokerInvocationHandler.invoker方法。invoker的invoker,会进入MockClusterInvoker.invoker里面使用FailoverClusterInvoker.invoker集群容错的invoker,AbstractClusterInvoker的invoker方法获取invoker集合,然后获取负载均衡机制select()根据当前的负载均衡策略,进行获取一个invoker,通过filter后,最后进入DubboInvoker先获取客户端,currentClient.request发取请求,得到结果封装