Issue 1:
I have searched the issues of this repository and believe that this is not a duplicate.

I have checked the FAQ of this repository and believe that this is not a duplicate.

Environment

Dubbo version: 2.7.2

Operating System version: Mac OS

Java version: 1.8

Steps to reproduce this issue

Infos:

IP
SIDE
ENV
STATIC TAG
DYNAMIC TAG

192.168.1.5
Consumer
DEV
DEV
hello

192.168.1.6
Provider
QA
QA

192.168.1.7
Provider
STABLE

When I config TagRouter like this (in Dubbo admin):

---
force: false
runtime: true
enabled: true
priority: 1
key: hello-service
tags:
- name: hello
addresses: ["192.168.1.8","192.168.1.9"]
...

when without match dynamic tag and static tag

Hope Result:

192.168.1.5(DEV) => 192.168.1.7(STABLE)

Actual Result:

192.168.1.5(DEV) => [NO PROVIDER]

原因:

消费方初始化refer时，在ReferenceConfig中会将consumer的配置参数放入一个map(具体参考ReferenceConfig类中第303行appendParameters(map, consumer))，然后在创建代理的时候会合并消费方和提供方的配置参数(参考ReferenceConfig类中第371行urls.add(ClusterUtils.mergeUrl(url, map));)，之后在ClusterUtils中尽管会保留提供方的配置，参数，但是在消费方设置了dubbo.tag参数，而提供方未设置dubbo.tag的情况下，导致加了消费方默认的dubbo.tag;

然后在进行标签路由时，由于设置了动态标签路由，但是又没有匹配的提供方实例，最后会获取动态标签中不存在，且动态标签为空的实例（参考TagRouter类中第125~127行，如下）

// FAILOVER: return all Providers without any tags.
else {
List<Invoker<T>> tmp = filterInvoker(invokers, invoker -> addressNotMatches(invoker.getUrl(),
tagRouterRuleCopy.getAddresses()));
return filterInvoker(tmp, invoker -> StringUtils.isEmpty(invoker.getUrl().getParameter(Constants.TAG_KEY)));
}

但是由于之前在refer的时候合并了参数，这边尽管Stable下的实例192.168.1.7的ProviderConfig URL中不带Dubbo TAG，这里还是会获取到消费方的默认标签DEV。

解决:

修改判断条件：

return filterInvoker(tmp, invoker -> StringUtils.isEmpty(url.getParameter(Constants.TAG_KEY)? StringUtils.isEmpty(invoker.getUrl().getParameter(Constants.TAG_KEY)) : invoker.getUrl().getParameter(Constants.TAG_KEY).equals(url.getParameter(Constants.TAG_KEY)) );

另外，发现标签路由的常量跟官方文档中不一致，实际上是:

org.apache.dubbo.rpc.cluster.TAG_KEY
org.apache.dubbo.rpc.FORCE_USE_TAG

能够统一修正为:

org.apache.dubbo.rpc.cluster.TAG_KEY
org.apache.dubbo.rpc.cluster.FORCE_KEY

Issue 2:
I have searched the issues of this repository and believe that this is not a duplicate.

I have checked the FAQ of this repository and believe that this is not a duplicate.

Environment

Dubbo version: 2.7.6

Operating System version: mac 10.15

Java version: 1.8.0.231

Steps to reproduce this issue

spring boot应用中自定义ExportListener SPI扩展，记为X

在dubbo:service中设置listener为XXX

启动spring boot应用

Pls. provide [GitHub address] to reproduce this issue.

Expected Result

What do you expected from the above steps？

应用正常启动

Actual Result

What actually happens?

异常堆栈如下，我跟踪了一下代码执行，问题出在org.apache.dubbo.config.utils.ConfigValidationUtils#validateServiceConfig方法中，先校验了一次ExporterListener.class的扩展点，而后在validateAbstractInterfaceConfig(config)中，针对同一个ServiceConfig校验了一次 InvokerListener.class的扩展。这个地方我感觉有问题，因为我是针对dubbo:service设置的ExporterListener，而InvokerListener因为是针对dubbo:reference的，为何针对dubbo:service也去校验InvokerListener扩展呢？

java.lang.IllegalStateException: No such extension XXX for listener/org.apache.dubbo.rpc.InvokerListener

at org.apache.dubbo.config.utils.ConfigValidationUtils.checkMultiExtension(ConfigValidationUtils.java:531)

at org.apache.dubbo.config.utils.ConfigValidationUtils.validateAbstractInterfaceConfig(ConfigValidationUtils.java:299)

at org.apache.dubbo.config.utils.ConfigValidationUtils.validateServiceConfig(ConfigValidationUtils.java:316)

at org.apache.dubbo.config.ServiceConfig.checkAndUpdateSubConfigs(ServiceConfig.java:283)

at org.apache.dubbo.config.ServiceConfig.export(ServiceConfig.java:193)

at org.apache.dubbo.config.bootstrap.DubboBootstrap.lambda$exportServices$15(DubboBootstrap.java:917)

at java.util.HashMap$Values.forEach(HashMap.java:981)

at org.apache.dubbo.config.bootstrap.DubboBootstrap.exportServices(DubboBootstrap.java:905)

at org.apache.dubbo.config.bootstrap.DubboBootstrap.start(DubboBootstrap.java:745)

at org.apache.dubbo.config.spring.context.DubboBootstrapApplicationListener.onContextRefreshedEvent(DubboBootstrapApplicationListener.java:59)

at org.apache.dubbo.config.spring.context.DubboBootstrapApplicationListener.onApplicationContextEvent(DubboBootstrapApplicationListener.java:52)

at org.apache.dubbo.config.spring.context.OneTimeExecutionApplicationContextEventListener.onApplicationEvent(OneTimeExecutionApplicationContextEventListener.java:40)

at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172)

at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165)

at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139)

at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:403)

at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:360)

at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:897)

at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.finishRefresh(ServletWebServerApplicationContext.java:162)

at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:553)

at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141)

at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:747)

at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397)

at org.springframework.boot.SpringApplication.run(SpringApplication.java:315)

at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226)

at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215)

at cn.edu.bupt.Starter.main(Starter.java:18)

If there is an exception, please attach the exception trace:

Just put your stack trace here!