Dubbo服务注册与发现
Dubbo服务发现
Dubbo默认是Zookeeper注册服务中心。
- Dubbo通过ZookeeperRegistry类来注册和订阅服务,通过zookeeper事件监听服务变更,一旦服务变更,消费端收到通知,然后主动去zookeeper拉取该服务的提供者子目录,这些提供者子目录记录了注册该服务的URL信息。
- RegistryDirectory类封装服务提供者,映射成RegistryDirectory.methodInvokerMap的map类型的属性。
- 客户端端调用服务的方法时,会从RegistryDirectory.methodInvokerMap中取对应的方法的服务提供者URL信息进行RPC调用。
Dubbo服务注册
服务暴露,其实也是创建了服务端的存根 Invoker(代理),并且将存根(Invoker)放入了一个 exporter 中。
ServiceBean
ServiceBean 实现了 ApplicationListener 接口会接收来自 SimpleApplicationEventMulticaster
的广播事件。
接收到事件后执行 onApplicationEvent
方法。从而进行 Dubbo 服务暴露。
SimpleApplicationEventMulticaster 的 multicastEvent 广播事件遍历所有的监听器:
protected void invokeListener(ApplicationListener listener, ApplicationEvent event) {
ErrorHandler errorHandler = getErrorHandler();
if (errorHandler != null) {
try {
listener.onApplicationEvent(event);
}
catch (Throwable err) {
errorHandler.handleError(err);
}
}
else {
listener.onApplicationEvent(event);
}
}
ServiceBean 服务暴露:
public void onApplicationEvent(ContextRefreshedEvent event) {
if (isDelay() && !isExported() && !isUnexported()) {
if (logger.isInfoEnabled()) {
logger.info("The service ready on spring started. service: " + getInterface());
}
export();
}
}
protocol.export() 主要三件事:
- netty bind(url) 暴露服务
- ZooKeeper 注册 provider,并创建 configurator 配置信息目录
- 通知该服务相关订阅者
还没有评论,来说两句吧...