1.configrators变更 服务提供者会重新export。但是只是dubboProtocol重新暴露,没有往zk注册新的url
实验过了,就是没注册新的providerUrl,这样怎么说呢,如果providerUrl是永久节点不改的话,可以理解成保留providerUrl的原始参数。但是providerUrl是临时节点,每次启动会重新刷新的,我觉得还是得保证他这次回话中参数的变化得实时反应….
2.dubbo本地缓存运用逻辑
首先AbstractRegistry启动时时会加载文件(没有就创建)。当zk有变化时会异步(这个代码里"save.file"看是可以配置的,但是从dubbo给的api中没找到可以设置的地方)保存到文件中。
当我们订阅时如果订阅失败,就会使用本地文件保存的先通知
com.alibaba.dubbo.registry.support.FailbackRegistry#subscribe
try {
// Sending a subscription request to the server side
doSubscribe(url, listener);
} catch (Exception e) {
Throwable t = e;
// ....
List<URL> urls = getCacheUrls(url);
// ....
notify(url, listener, urls);
addFailedSubscribed(url, listener);
}
|
细节:
假如zk断开连接,老的引用不动,新的引用走缓存。zk重新链接时怎么处理?因为提供者数据可能修改了,在ZookeeperRegistry中注册了状态监听器,监听重连状态,如果zk状态变为 RECONNECTED = 2 已重连,就将之前注册的监听器全部设置成失效,走FailbackRegistry重新监听FailbackRegistry的失败定时监听重新注册时间 “retry.period" 间隔是 DEFAULT_REGISTRY_RETRY_PERIOD = 5 * 1000;
ZookeeperRegistry.java
// 添加 StateListener 对象。该监听器,在重连时,调用恢复方法。
zkClient.addStateListener(new StateListener() {
public void stateChanged(int state) {
// 只除里重连状态
if (state == RECONNECTED) {
try {
recover();
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
}
}
});
|
3.消费者监听时,zk是把监听全部节点推送吗?
dubbo用的节点名做的。全量
4.版本号问题
这个根据经验知道 * 全匹配。 不写算一种版本("0.0.0") 、写算一种版本。
让我产生疑惑的地方:
之前讲过配置参数。configrators>consumer>provider 会存在一个覆盖关系。那消费端不配置版本,服务端配置版本。那样不就默认使用服务端版本号了?虽然这样听起来很合理的样子哈哈哈哈。
这个覆盖关系不包括version,具体代码见,即 在通知我们 到 处理之前就被过滤掉了
com.alibaba.dubbo.registry.support.AbstractRegistry#notify(URL, NotifyListener, java.util.List<URL>)
if (UrlUtils.isMatch(url, u)) //这行代码
5 还有个问题不知道是不是dubbo默认允许的,感觉怪怪得
我们知道配置存在一个configrators>consumer>provider 会存在一个覆盖关系,哪假如多个provider配置不一样呢?你怎么覆盖,dubbo代码里循环走下面代码,也就是按最后一个来,(和有多个注册中心走最后一个负载均衡逻辑一样…)
硬要理解就按一个注册中心中服务者代码是一样的服务者配置自然是一样的去理解。
假如搞事情单独去改zk排在最后一个提供者,我认为就是只改最后一个提供者就会在下一次通知把其他提供者配置覆盖,不是最后一个,就只会影响当前providerUrl
有时间试验下,或有有大佬可以直接给我解答
com.alibaba.dubbo.registry.integration.RegistryDirectory#toInvokers 循环{
com.alibaba.dubbo.registry.integration.RegistryDirectory#mergeUrl{
//这里有多个提供者参数不一致overrideDirectoryUrl不就有问题?只能记录最后一一个参数
this.overrideDirectoryUrl = this.overrideDirectoryUrl.addParametersIfAbsent(providerUrl.getParameters());
}
}