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.3k stars 12.84k forks source link

public名称空间下发布配置到配置中心问题 #6853

Closed winer77444 closed 3 years ago

winer77444 commented 3 years ago

使用ConfigService类,configService.publishConfig发布配置到配置中心返回200 但是配置中心文件并没有写入新内容

个人排查思路: 编译nacos Server源码,debug模式下发现jdbc模板执行execute返回true,但是配置文件还是没有写入成功

解决方案: 自定义名称空间,不是默认public名称空间是可以成功写入或者更新配置文件成功

需要解决: 为什么public名称空间下写入存在问题,明明执行数据库写操作返回true,但是配置文件还是没有写入成功

li-xiao-shuang commented 3 years ago

麻烦提供一下nacos版本、单机模式还是集群、使用的内嵌数据库还是mysql?

winer77444 commented 3 years ago

maven 依赖版本如下: spring-cloud-starter-alibaba-nacos-config 2.2.5.RELEASE
spring-cloud-starter-alibaba-nacos-discovery 2.2.5.RELEASE nacos server版本1.4.1 单机模式 使用内嵌和mysql都出现上述的问题, 代码如下:

@MethodDefine(title = "发布路由", path = "/publish", method = HttpMethodConstants.POST, params = {@ParamDefine(title = "路由参数", varName = "jsonObject")}) @ApiOperation(value = "发布路由") @AuditLog(operation = "发布路由") @PostMapping(value = "publish") public void publish(@RequestBody JSONObject jsonObject) throws NacosException { String config=jsonObject.getString("config"); LogContext.put(Audit.DETAIL,"将路由发布到nacos:"+config); configService.publishConfig(JPAAS_CONFIG, DEFAULT_GROUP, config); }

li-xiao-shuang commented 3 years ago

maven 依赖版本如下: spring-cloud-starter-alibaba-nacos-config 2.2.5.RELEASE spring-cloud-starter-alibaba-nacos-discovery 2.2.5.RELEASE nacos server版本1.4.1 单机模式 使用内嵌和mysql都出现上述的问题, 代码如下:

@MethodDefine(title = "发布路由", path = "/publish", method = HttpMethodConstants.POST, params = {@ParamDefine(title = "路由参数", varName = "jsonObject")}) @ApiOperation(value = "发布路由") @auditlog(operation = "发布路由") @PostMapping(value = "publish") public void publish(@requestbody JSONObject jsonObject) throws NacosException { String config=jsonObject.getString("config"); LogContext.put(Audit.DETAIL,"将路由发布到nacos:"+config); configService.publishConfig(JPAAS_CONFIG, DEFAULT_GROUP, config); }

我通过依赖spring-cloud-starter-alibaba-nacos-config 2.2.5.RELEASE 并没有复现出来,内嵌数据和mysql都可以正常发布,请仔细检查下配置,如果还有问题 提供复现步骤和源代码

winer77444 commented 3 years ago

详细的复现步骤我都整理了图和文字

https://www.yuque.com/docs/share/1949fea5-d8fd-45a0-8c55-439a6c88b13b?# 《nacos config 问题复现》

li-xiao-shuang commented 3 years ago

详细的复现步骤我都整理了图和文字

https://www.yuque.com/docs/share/1949fea5-d8fd-45a0-8c55-439a6c88b13b?# 《nacos config 问题复现》

你这个是springcloud的接入方式嘛? 可以查看下config_info表中tenant_id是什么? 我的理解是public是默认的命名控制,是不需要指定的

li-xiao-shuang commented 3 years ago

详细的复现步骤我都整理了图和文字

https://www.yuque.com/docs/share/1949fea5-d8fd-45a0-8c55-439a6c88b13b?# 《nacos config 问题复现》

nacos 不配置命名空间默认就是public,但是在默认的情况下发布配置config_info的tenant_id存储是为空"", 如果此时指定命名空间为public在发布相同的dataId就会在产生一条数据tenant_id 为 public,相当于在不同的空间下 ,所以当你去修改的时候其实修改是public这个空间下的数据,但是查询的时候默认还是查的tenant_id为空的"", 建议使用默认命名空间的时候不要指定名称

image

li-xiao-shuang commented 3 years ago

@KomachiSion 这个需不需要兼容一下?

winer77444 commented 3 years ago

抱歉,刚才在做复现的代码,您可以拉下代码,通过简单切换名称空间就可以复现如上bug https://gitee.com/zhaojiaxu123/nacos-config-pulish-ex.git

winer77444 commented 3 years ago

问题唯一就是如果tenant_id我们用自定义的那么它是有值的,但是public默认是无值得,是不是问题出在tenant_id上,但是数据库更新都是返回true的

li-xiao-shuang commented 3 years ago

问题唯一就是如果tenant_id我们用自定义的那么它是有值的,但是public默认是无值得,是不是问题出在tenant_id上,但是数据库更新都是返回true的

这里貌似是有点小问题的,如果不指定namespace,默认就是public,数据库存储tenant_id为"", 如果指定为public,存储就是public

winer77444 commented 3 years ago

是有点小问题的,不知道为什么public下写有问题

winer77444 commented 3 years ago

因为我们项目是用指定的名称空间来获取配置中心配置,来加载初始化多数据源等,如果是public,tenant_id就会是public,但是实际是应该为null的,数据库创建出了一个额外的配置信息,就跟幽灵一样配置中心中不显示,但是数据库真实存在,最新的2.0.4nacos server也始终存在这个问题,这个bug能否在后续的版本中修复一下 image

li-xiao-shuang commented 3 years ago

因为我们项目是用指定的名称空间来获取配置中心配置,来加载初始化多数据源等,如果是public,tenant_id就会是public,但是实际是应该为null的,数据库创建出了一个额外的配置信息,就跟幽灵一样配置中心中不显示,但是数据库真实存在,最新的2.0.4nacos server也始终存在这个问题,这个bug能否在后续的版本中修复一下 image

我确认一下吧

winer77444 commented 3 years ago

好的,目前我测了最新版本和1.4.1都存在这个问题

li-xiao-shuang commented 3 years ago

好的,目前我测了最新版本和1.4.1都存在这个问题

我确认了一下,这个不属于问题。nacos官方定义默认的命名空间是public,也就是在实际的存储中对应的""。所以在使用的过程中public命名空间下发布配置和获取配置是不需要指定命名空间的名称的。只有自定义命名空间使用的时候才需要指定对应的命名空间的ID

KomachiSion commented 3 years ago

public是默认命名空间的名字, 其id就是""。 因此如果您配置的时候不指定,默认给予的命名空间是:public("")。

但是你手动添加了命名空间id:public。 nacos就会认为你需要操作一个id是public的命名空间,因此就会插入一个tenantid=public的记录。

您可以创建一些别的命名空间,默认会创建一个uuid作为id。

image

winer77444 commented 3 years ago

您可以拉下上面复现的代码,现在问题是,我配置文件指定去发布public 哪个dataID 哪个组的配置文件的时候,有一些小问题,这个您提到的可以建个自定义名称空间确实可以解决,但是现在问题是如果指定public发布,会出现一个小bug image

winer77444 commented 3 years ago

像您说的一样默认是tenand_id为"",但是如果我指定了tenand_id就会为public

winer77444 commented 3 years ago

如果不属于问题的话,那就是我要默认不指定public是这样子么

li-xiao-shuang commented 3 years ago

如果不属于问题的话,那就是我要默认不指定public是这样子么

是的 默认的就不需要指定