使用dubbo-admin 0.3.0时显示无元数据信息,可关于config-center的配置已经按官网那样配置了。
集群中存在dubbo-go作为xxx服务的consumer时,会注册到dubbo-admin上,dubbo-admin却认为它是provider,点击对应的服务测试后,真正的provider信息被覆盖,服务不能再被调用
消费者语言为go,用的是dubbo-go,从url中看到registry url 中 protocol和side均为consumer
consumer//com.xxx.service.api.CustomerApi?app.version=1.0.0&application=xxx&async=false&bean.name=ServiceBean:com.xxx.service.api.CustomerApi:1.0.0&check=false&cluster=failover&environment=environment&generic=false&group=group&interface=com.xxx.service.api.CustomerApi&ip=10.46.19.116&loadbalance=loadbalance&methods.findCustomerByTeamUid.loadbalance=methods.findCustomerByTeamUid.loadbalance&methods.findCustomerByTeamUid.retries=1&methods.findCustomerByTeamUid.sticky=false&methods.getPrimaryServiceGroupByCustomerUid.loadbalance=methods.getPrimaryServiceGroupByCustomerUid.loadbalance&methods.getPrimaryServiceGroupByCustomerUid.retries=1&methods.getPrimaryServiceGroupByCustomerUid.sticky=false&module=dubbo-go client&name=xxx&organization=dubbo.io&owner=owner&protocol=rest&provided-by=provided-by&reference.filter=cshutdown®istry.role=0&release=dubbo-golang-1.5.6&retries=retries&side=consumer&sticky=false&version=1.0.0
查看源码发现:第一次invoke方法后,dubbo-admin的RegistryServerSync.notify方法会收到zk发来的消息
public void notify(List<URL> urls) {
if (urls == null || urls.isEmpty()) {
return;
}
// Map>>
final Map<String, Map<String, Map<String, URL>>> categories = new HashMap<>();
String interfaceName = null;
for (URL url : urls) {
String category = url.getUrlParam().getParameter(Constants.CATEGORY_KEY);
// 注意这里,category如果为null则默认是providers,而上面的url中是不存在category这个key的
if (category == null) {
category = Constants.PROVIDERS_CATEGORY;
}
// 省略无关代码
......
增加逻辑:如果 side是consumer 或者 protocol是consumer时,category是consumers
for (URL url : urls) {
String category = url.getUrlParam().getParameter(Constants.CATEGORY_KEY);
if (category == null) {
// 增加逻辑,如果side是consumer 或者 side为null,protocol是consumer时 category是consumers
if ("consumer".equals(url.getSide()) || "consumer".equals(url.getProtocol())) {
category = Constants.CONSUMERS_CATEGORY;
} else {
category = Constants.PROVIDERS_CATEGORY;
}
}