Arthas线上排障
场景1. Nacos Client访问不到配置中心
Nacos-Server/Nacos-Client: v2.0.4
背景
Nacos-Server因安全需要需要开启鉴权, 所有Client访问配置中心都需要提供控制台账户和密码.
- Server配置
nacos.core.auth.enabled=true
nacos.core.auth.enable.userAgentAuthWhite=false
nacos.core.auth.server.identity.key=serverAuthKey
nacos.core.auth.server.identity.value=serverAuthValue
- Client配置
java -jar app.jar -Dnacos.username=nacos -Dnacos.password=大写密码
现象
服务启动后,日志一直报403 unknow user!!
, 滚动一段时间后, 应用退出。
使用Client启动命令中配置的用户名密码能够正常登录nacos-server
控制台。
过程
- 能正常登录控制台,证明密码没问题。
- 本次部署是初次部署,考虑到配置可能有误,拷贝测试环境的
nacos-server
配置到部署环境,重新部署,问题依旧存在。 - 根据错误信息,定位
nacos-server
源码com.alibaba.nacos.console.security.nacos.NacosAuthManager#resolveTokenFromUser
是执行校验的主要方法,用户名和密码通过参数传入。 - 使用Arthas监听该方法,看Client传过来的到底是个什么玩意
watch com.alibaba.nacos.console.security.nacos.NacosAuthManager resolveTokenFromUser '{params,returnObj,throwExp}' -x 3
- 启动Client后,Client发送过来的请求中,初次携带的鉴权信息是正确的,第二次及以后的密码变成了小写。
- 去官方issue列表查询,未发现类似问题,源码也没发现有改变配置大小写的地方,从上一步可知Client启动后有一次请求的鉴权信息是正确的, 这次访问配置中心是成功的, 而后续鉴权信息就发生变更了, 可能是来自配置中心的配置覆盖了本地配置, 经排查, Client依赖的配置文件内, 确实存在同名的配置
nacos:
username: nacos
password: 小写密码
- 去除该配置后, Client启动正常