alibaba / nacos

an easy-to-use dynamic service discovery, configuration and service management platform for building cloud native applications.
https://nacos.io
Apache License 2.0
30.07k stars 12.81k forks source link

nacos-client的NacosConfigService类出现bug,将命名空间namespace当成tenant,去做接口请求,导致参数查询不到希望最新版本的jar包能修正这个bug #2275

Closed aaroncgt90 closed 4 years ago

aaroncgt90 commented 4 years ago

Issue Description

Type: bug report or feature request

Describe what happened (or what feature you want)

Describe what you expected to happen

How to reproduce it (as minimally and precisely as possible)

Tell us your environment

Anything else we need to know?

KeRan213539 commented 4 years ago

额.其实namespace就是tenant,不知道是历史原因还是什么,namespace的表名,相关操作的部分接口名,参数都是叫 tenant, 所以请求的接口应该是对的. 具体是请求什么接口?出什么错?如何重现?

aaroncgt90 commented 4 years ago

出现bug的版本在nacos-client1.4的NacosConfigService将namespace封装成这tenant字段去做请求, 请求接口是/nacos/v1/cs/configs,重现结果很简单,直接在浏览器或者配置seata都是报找不到结果,具体请求可以是 http://localhost:8848/nacos/v1/cs/configs?dataId=service.vgroup_mapping.gtkq-system-seata-service-group&group=SEATA_GROUP&namespace=public (结果返回正常) http://localhost:8848/nacos/v1/cs/configs?dataId=service.vgroup_mapping.gtkq-system-seata-service-group&group=SEATA_GROUP (结果返回正常) http://localhost:8848/nacos/v1/cs/configs?dataId=service.vgroup_mapping.gtkq-system-seata-service-group&group=SEATA_GROUP&tenant=public (结果返回错误) 而偏偏seata配置文件刚好会读取namespace,刚好又是这个类去封装http接口请求参数,导致接口查询返回结果为config data not exist 目前使用的nacos版本为1.1.3,项目框架使用springcloud,只要seata配置了namespance不为空,就如:public,或者其他,就会出现bug,该bug会影响其他应用做namespace区分,并读取相应的配置文件,希望好好查看一下具体是什么问题

KeRan213539 commented 4 years ago

大概清楚您的意思了: 参数名用 namespace 没问题,, 参数名用 tenant 就返回错误. 而 client使用的参数名是 tenant, 是这样子吗? 然后问题是出在 1.1.4, 而 1.1.3 没问题?

aaroncgt90 commented 4 years ago

大概清楚您的意思了: 参数名用 namespace 没问题,, 参数名用 tenant 就返回错误. 而 client使用的参数名是 tenant, 是这样子吗? 然后问题是出在 1.1.4, 而 1.1.3 没问题?

第一个问题:是的,参数名为tenant则返回错误, 第二个问题:不,事实上client1.1.3版本也出现这个问题,我就是试着升级到1.1.4看看相应的问题是否已经解决,结果也是相同的,并没有解决,如果client的jar包不修改的情况下,相应的查询语句就应该修改了,例如 nacos-server就要修改了

KeRan213539 commented 4 years ago

OK,知道原因了...参数名用 namespace 没问题是因为根本没有这个参数, 正确的参数名就是 tenant. 问题原因在于没有对 public 这个值做处理,放在 public 空间中的配制,在数据库中对应字段的值是空,而没有对 public 做处理, public 被带到查询中了,所以查不到数据. 只要在 接口处加个判断,如果值为 public 就置空就行. 你愿意来修改这个问题吗?

KeRan213539 commented 4 years ago

这样处理就行,在子项目 config 的 com.alibaba.nacos.config.server.controller.ConfigController的 getConfig 方法中

if (NAMESPACE_PUBLIC_KEY.equalsIgnoreCase(namespace)) {
     namespace = "";
}

exportConfig 方法里也会有这个问题

aaroncgt90 commented 4 years ago

这样处理就行,在子项目 config 的 com.alibaba.nacos.config.server.controller.ConfigController的 getConfig 方法中

if (NAMESPACE_PUBLIC_KEY.equalsIgnoreCase(namespace)) {
     namespace = "";
}

exportConfig 方法里也会有这个问题

另外这边还由此发现一个问题,命名空间本身在页面就拦截了就不可以设置为重复,结果用命名空间名称去请求,反而查不到数据,需要用命名空间所属id才可以访问,是否能优化这个查询呢?

KeRan213539 commented 4 years ago

这个目前不好处理,命名空间名称是可以重复的,只有ID是唯一的. 我已经提了一个在创建命名空间时可以自定义命名空间ID的PR并且已经合并了,下个版本更新就会有了

KeRan213539 commented 4 years ago

我来改上面的问题吧...