dubbo服务导出和引用
2021-04-10 22:17:40 0 举报
dubbo服务导出和引用过程源码分析
作者其他创作
大纲/内容
while(true)
serviceChanged
peer-to-peer
shouldDelay()是否延时导出
urls.size() == 1
register
PushReceiver task会while(true) receive 接受注册中心消息
StubProxyFactoryWrappergetInvoker()
DubboBootstrapApplicationListener
否
...
openServer(url)createServer(url)
ScheduledExecutorService submit()
DubboAutoConfiguration
List<URL> urls
DubboInvoker
DubboProtocol#refer
再远程注册
ContextRefreshedEvent
通知更新
NamingService
创建代理对象
dubbo spi机制 根据url调用具体的注册中心工厂创建Registry,此处以 NacosRegistryFactory 为例,得到一个NacosRegistry注册中心客户端对象,持有 NamingService 实例。(NamingService用来操作远程nacos服务器注册、获取、删除、订阅具体服务实例)
ExecutorService#.execute(new Notifier())
NamingEvent
单个注册中心或服务提供者,调用 RegistryProtocol 的 refer 构建 Invoker 实例
dubbo @Service 注解标识的类添加到spring容器
@Bean
providerUrl
for invokers add
doExport
消费端订阅服务发生变更
PushReceiver
循环每10s主动查询注册中心一次,根据结果决定是否更新可用服务列表
invoker = CLUSTER.join(new StaticDirectory(invokers));
RegistryDirectory#notify
构造map参数
解析@Reference
订阅指定URL的服务RegistryDirectory#subscribe
Exporter Protocol.export(Invoker)
protocolBindingRefer
nacos-client
@Service 对应 ServiceBean extends ServiceConfig 对象添加到spring容器
EventDispatcher
注释
调用方式
ContextClosedEvent
构造方法初始化Notifier
DelegateProviderMetaDataInvoker 承载Invoker和当前服务的ServiceConfig metadata信息
添加BlockingQueue
private DubboBootstrap() { configManager = ApplicationModel.getConfigManager(); environment = ApplicationModel.getEnvironment(); DubboShutdownHook.getDubboShutdownHook().register(); ShutdownHookCallbacks.INSTANCE.addCallback( new ShutdownHookCallback() { @Override public void callback() throws Throwable { DubboBootstrap.this.destroy(); } }); }
ack 回复确认变更发生消息
ReferenceAnnotationBeanPostProcessor
是
创建 StaticDirectory 实例,并由 Cluster 对多个 Invoker 进行合并
RegistryProtocol#export(invoker)
doRefer
DubboBootstrap.getInstance()
先本地
changedServices.add(serviceInfo);
doExportUrls
ProtocolFilterWrapper
getObject
dubbo service默认是在容器启动的时候暴露的,一旦暴露,consumer端就可以发现这个service并且调用到这个provider。所谓延迟暴露即在启动之后延迟一定时间再暴露,比如延迟3s。
POST/nacos/v1/ns/instance
reqAPIGET/nacos/v1/instance/list
DubboClassPathBeanDefinitionScanner
多个注册中心或多个服务提供者,或者两者混合
DubboProtocol#export(invoker)
nacos注册中心
ApplicationModel.getConfigManager().addConfig(this);
本地缓存注册服务
doExportUrlsFor1Protocol
init
注册中心
ReferenceBean
font color=\"#ff0000\
DatagramPacket UDP协议传输
检查BlockQueue
exportLocal(url)
reqAPI
RegistryFactory#getRegistry(url)
registryFactory.getRegistry(registryUrl)
RegistryProtocol#refer
JavassistProxyFactorygetInvoker()
含当前dubbo服务的配置信息,服务 export 和 unexport 都在此类中完成,此类持有服务具体实现类的引用,spring创建完服务配置对象后,添加到全局的 ConfigManager 中,以备容器启动之后进行dubbo服务导出等工作。
NacosRegistry
UpdateTask
创建并开启对应协议的ProtocolServer
先本地导出
Notifier
再远程导出
ReferenceConfig
将当前服务注册到远程注册中心,根据URL获取具体的注册中心实现类,进而调用具体的注册中心客户端,进行服务注册
InjvmProtocol#export(invoker)
dubbo的启动是由start方法完成的,start方法的执行成功,意味着dubbo的启动结束。服务端服务的暴露就是在start方法中完成的。
ServiceConfig
refreshOverrideAndInvoker(urls)
创建RegistryDirectory服务目录对象
注册Consumer服务
registryUrl
jvmRefer 本地调用
listeners#onEvent
scan
父类 @PostConstruct addIntoConfigManager
DubboBootstrap..start()
initialize() 初始化方法
DubboBootstrap.stop()
将当前服务进行本地导出暴露
ServiceAnnotationBeanPostProcessor
RegistryDirectory 服务目录在获取注册中心的服务配置信息后,会为每条配置信息生成一个 Invoker 对象,并把这个 Invoker 对象存储起来.通过服务目录,服务消费者可获取到服务提供者的信息,比如 ip、端口、服务协议等。通过这些信息,服务消费者就可通过 Netty 等客户端进行远程调用。
exportAsync是否异步导出
循环遍历指定直连地址转换成URL
getClients(url)
ProtocolListenerWrapper
NacosRegistry#register
遍历所有registryURLs,将当前服务依次进行远程注册
ScheduledExecutorService schedule()
{ \"type\":\"push-ack\
configManager.getServices()ServiceConfig.export()
Invoker ProxyFactory.getInvoker
exportServices() 导出dubbo服务
ApplicationModel.initFrameworkExts(); // 初始化FrameworkExt实现类,如:EnvironmentstartConfigCenter();// 该方法从ConfigManager中获得的所有的ConfigCenterConfig对象。然后访问配置中心的配置(htp请求),将这些配置保存到Environment对象,最后使用这些配置更新ApplicationConfig、MonitorConfig、ModuleConfig等对象的属性。useRegistryAsConfigCenterIfNecessary(); 检查是否需要注册中心作为默认的配置中心loadRemoteConfigs();checkGlobalConfigs(); // 检查各个配置对象的各个属性设置的值是否合法initMetadataService(); // initEventListener();
exporters.add(exporter);添加到当前ServiceConfig的已被导出服务集合中
0 条评论
下一页