服务注册流程
RegistryProtocol
在dubbo服务发布流程已经分析了发布服务流程还有服务注册流程
export
在RegistryProtocol#export
继续服务注册流程
// 根据invoker中的url获取Registry实例: zookeeperRegistry
// ListenerRegistryWrapper(ZookeeperRegistry) 后面注册服务阐述
final Registry registry = getRegistry(originInvoker);
// 获取要注册的到注册中心的URL: dubbo://ip:port
final URL registeredProviderUrl = getUrlToRegistry(providerUrl, registryUrl);
// decide if we need to delay publish
boolean register = providerUrl.getParameter(REGISTER_KEY, true);
// 是否配置了注册中心,如果是,则需要注册
if (register) {
// 将ProviderURL注册到注册中心
register(registryUrl, registeredProviderUrl);
}
getRegistry
protected Registry getRegistry(final Invoker<?> originInvoker) {
// 把 url 转化为对应配置的注册中心的具体协议 如:zookeeper://ip:port
URL registryUrl = getRegistryUrl(originInvoker);
// 根据具体协议从registryFactory获取指定的注册中心实现 ZookeeperRegistry
return registryFactory.getRegistry(registryUrl);
}
RegistryProtocol#register
public void register(URL registryUrl, URL registeredProviderUrl) {
// registryFactory是一个扩展点RegistryFactory$Adaptive
// 并且这个扩展点有一个包装类 RegistryFactoryWrapper
// 最终获取的的registryFactory是RegistryFactoryWrapper(ZookeeperRegistryFactory)
// 这里获得的registry的是 ListenerRegistryWrapper(ZookeeperRegistry)
Registry registry = registryFactory.getRegistry(registryUrl);
registry.register(registeredProviderUrl);
ProviderModel model = ApplicationModel.getProviderModel(registeredProviderUrl.getServiceKey());
model.addStatedUrl(new ProviderModel.RegisterStatedURL(
registeredProviderUrl,
registryUrl,
true
));
}
RegistryFactory
方法级别自适应扩展点在RegistryProtocol
通过set依赖注入
@SPI("dubbo")
public interface RegistryFactory {
@Adaptive({
"protocol"})
Registry getRegistry(URL url);
}
RegistryFactory
扩展点的配置文件META-INF\dubbo\internal\org.apache.dubbo.registry.RegistryFactory
service-discovery-registry=org.apache.dubbo.registry.client.ServiceDiscoveryRegistryFactory
wrapper=org.apache.dubbo.registry.RegistryFactoryWrapper
dubbo=org.apache.dubbo.registry.dubbo.DubboRegistryFactory
multicast=org.apache.dubbo.registry.multicast.MulticastRegistryFactory
zookeeper=org.apache.dubbo.registry.zookeeper.ZookeeperRegistryFactory
redis=org.apache.dubbo.registry.redis.RedisRegistryFactory
consul=org.apache.dubbo.registry.consul.ConsulRegistryFactory
etcd3=org.apache.dubbo.registry.etcd.EtcdRegistryFactory
nacos=org