消费者订阅做url合并时移除provider url上monitor参数
在实际使用中配置了provider的monitor参数,通过MonitorFilter采集性能数据并上报。 测试发现consumer层同样上报了数据,发现provider url在被订阅合并url时保留了monitor参数。
消费者订阅做url合并时移除provider url上monitor参数
在实际使用中配置了provider的monitor参数,通过MonitorFilter采集性能数据并上报。 测试发现consumer层同样上报了数据,发现provider url在被订阅合并url时保留了monitor参数。
provider端配置的monitor不会传递到consumer端,会不会是你配置有问题
private URL getRegistedProviderUrl(final Invoker<?> originInvoker) {
URL providerUrl = getProviderUrl(originInvoker);
//注册中心看到的地址
final URL registedProviderUrl = providerUrl.removeParameters(getFilteredKeys(providerUrl)).removeParameter(Constants.MONITOR_KEY);
return registedProviderUrl;
}
这样写会删除dubbo:service上配置的parameter,但是我的monitor参数是配置在dubbo:provider上。
MonitorFilter
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
if (invoker.getUrl().hasParameter(Constants.MONITOR_KEY)) {
RpcContext context = RpcContext.getContext(); // 提供方必须在invoke()之前获取context信息
URL
public String getParameter(String key) {
String value = parameters.get(key);
if (value == null || value.length() == 0) {
value = parameters.get(Constants.DEFAULT_KEY_PREFIX + key);
}
return value;
}
能把你的配置文件贴一下吗?同时配置了<dubbo:provider monitor="" />
和<dubbo:monitor address="" protocol=""/>
吗?
provider上的monitor配置项是一个遗留配置项,用来指定监控服务的group和version的,我觉得在2.5.7版本应该要废弃掉了,如果你确实用到了改用以下配置吧:
<dubbo:monitor address="" protocol="" group="" version=""/>
我准备删除 除
<dubbo:monitor address="zabbix://" />
这样配置测试发现没有在invoke url上增加monitor参数,所以主动在provider增加monitor参数。
<dubbo:provider timeout="15000" filter="providerTrace">
<dubbo:parameter key="monitor" value="zabbix://"/>
</dubbo:provider>
看了代码,是本地远程同时暴露了服务,测试时使用injvm协议。
default.monitor
参数监控地址是address="zabbix://",首先要确保你有做zabbix协议的扩展?
这个已经完成了,就像上面说的,问题是本地调用<dubbo:monitor address="zabbix://" />
没生效,所以我才主动在<dubbo:provider timeout="15000" filter="providerTrace">
上追加<dubbo:parameter key="monitor" value="zabbix://"/>
,才有了consumer url 中包含default.monitor,导致consumer同样上报数据的问题。
serviceConfig.doExportUrlsFor1Protocol
//配置为none不暴露
if (!Constants.SCOPE_NONE.toString().equalsIgnoreCase(scope)) {
//配置不是remote的情况下做本地暴露 (配置为remote,则表示只暴露远程服务)
if (!Constants.SCOPE_REMOTE.toString().equalsIgnoreCase(scope)) {
exportLocal(url);
}
//如果配置不是local则暴露为远程服务.(配置为local,则表示只暴露本地服务)
if (!Constants.SCOPE_LOCAL.toString().equalsIgnoreCase(scope)) {
if (logger.isInfoEnabled()) {
logger.info("Export dubbo service " + interfaceClass.getName() + " to url " + url);
}
if (registryURLs != null && registryURLs.size() > 0
&& url.getParameter("register", true)) {
for (URL registryURL : registryURLs) {
url = url.addParameterIfAbsent("dynamic", registryURL.getParameter("dynamic"));
URL monitorUrl = loadMonitor(registryURL);
if (monitorUrl != null) {
url = url.addParameterAndEncoded(Constants.MONITOR_KEY, monitorUrl.toFullString());
}
if (logger.isInfoEnabled()) {
logger.info("Register dubbo service " + interfaceClass.getName() + " url " + url + " to registry " + registryURL);
}
Invoker<?> invoker = proxyFactory.getInvoker(ref, (Class) interfaceClass, registryURL.addParameterAndEncoded(Constants.EXPORT_KEY, url.toFullString()));
Exporter<?> exporter = protocol.export(invoker);
exporters.add(exporter);
}
} else {
Invoker<?> invoker = proxyFactory.getInvoker(ref, (Class) interfaceClass, url);
Exporter<?> exporter = protocol.export(invoker);
exporters.add(exporter);
}
}
}
可以看到,只有在注册远程协议时才会处理monitor,在没有配置scop的时候,monitor不好测试。