[apache/dubbo]url合并时移除provider的monitor参数

2024-07-31 751 views
4

消费者订阅做url合并时移除provider url上monitor参数

在实际使用中配置了provider的monitor参数,通过MonitorFilter采集性能数据并上报。 测试发现consumer层同样上报了数据,发现provider url在被订阅合并url时保留了monitor参数。

回答

4

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;
    }
3

这样写会删除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;
    }
6

能把你的配置文件贴一下吗?同时配置了<dubbo:provider monitor="" /><dubbo:monitor address="" protocol=""/>吗?

provider上的monitor配置项是一个遗留配置项,用来指定监控服务的group和version的,我觉得在2.5.7版本应该要废弃掉了,如果你确实用到了改用以下配置吧:

<dubbo:monitor address="" protocol="" group="" version=""/>
4

我准备删除 除元素外的素有monitor配置项

4
<dubbo:monitor address="zabbix://" />

这样配置测试发现没有在invoke url上增加monitor参数,所以主动在provider增加monitor参数。

    <dubbo:provider timeout="15000" filter="providerTrace">
        <dubbo:parameter key="monitor" value="zabbix://"/>
    </dubbo:provider>
3

看了代码,是本地远程同时暴露了服务,测试时使用injvm协议。

  • injvm为什么没有增加monitor参数
  • 对monitor参数没有处理完全,比如default.monitor参数
7

监控地址是address="zabbix://",首先要确保你有做zabbix协议的扩展?

8

这个已经完成了,就像上面说的,问题是本地调用<dubbo:monitor address="zabbix://" />没生效,所以我才主动在<dubbo:provider timeout="15000" filter="providerTrace">上追加<dubbo:parameter key="monitor" value="zabbix://"/>,才有了consumer url 中包含default.monitor,导致consumer同样上报数据的问题。

5

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不好测试。