nacos版本:2.0.4
问题描述
有一天,你打开ruoyi-cloud,发现登陆、登出的时候总是出现如下现象,第一次操作正常,第二次操作超时,第三次操作正常,第四次又超时......
怎么能这么有规律性呢?到底是什么原因导致的呢?
问题分析
我们来看一下ruoyi-cloud的登入登出逻辑,发现它们有一个共同部分:
ini
// 查询用户信息
R<LoginUser> userResult = remoteUserService.getUserInfo(username, SecurityConstants.INNER);
登入登出在auth模块,而这段代码是去system模块通过feign远程调用查询了用户信息,而我们的超时也发生在这个位置。那么问题显然就发生在feign远程调用上。
但是我们的代码是在本地运行的,怎么会发生这种现象呢?使用postman录入登录接口的信息,尝试调用:
lua
-- 请求路径
http://localhost:8080/auth/login
-- 请求方式
post
-- json参数
{
"username": "admin",
"password": "admin123"
}
尝试在登录方法上加断点,并反复调用,发现相同的现象:第一次调用断到了、第二次断不到,第三次又断到了......
那么不调本地的服务,调哪了?下面是出现这个问题时的nacos截图:
- gateway、auth、system各有两个实例;
- 另一个业务模块只有一个实例。

这是因为项目组的两个研发,在启动项目时连接到了相同的nacos地址,并都注册到了默认的public命名空间。根据nacos默认的轮询策略,按照顺序进行服务发现,所以第一次调用是你本机的,第二次就是另一个研发的,如此就引发了这个问题。
问题解决
以上问题的解决其实也很简单,不要把实例注册到一个地方。你可以在本机部署一个nacos,把配置文件导入进去;或者还是使用相同的nacos,但是采用以下几种方式进行服务注册和发现的隔离。
命名空间
我们可以添加一个命名空间,服务的注册和发现都在这个命名空间上,这样就和别人没有冲突了。
找到nacos的命名空间-新建命名空间:

录入信息创建一个命名空间:

我们需要记录一下命名空间ID:

然后前往配置管理-配置列表,将public命名空间的配置文件全部导出,然后再导入到新建的命名空间:

在bootstrap.yml,指定一下命名空间的id,重启服务即可:
yaml
spring:
cloud:
nacos:
discovery:
# 服务注册地址
server-addr: 192.168.81.100:8848
# 命名空间
namespace: ee3fd2ca-67d0-440e-a59f-70736d7e87cc
config:
# 配置中心地址
server-addr: 192.168.81.100:8848
# 命名空间
namespace: ee3fd2ca-67d0-440e-a59f-70736d7e87cc
# 配置文件格式
file-extension: yml
# 共享配置
shared-configs:
- application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
注意,你自己的命名空间还是留在本地比较好,就不要提交代码了。
分组
当然,除了命名空间外,我们也可以配置分组。在配置管理-配置列表,勾选配置文件后,点击克隆:

这里的分组名可以自定义编写,也可以选择命名空间。
后端指定一下分组名称即可:
yaml
spring:
cloud:
nacos:
discovery:
# 服务注册地址
server-addr: 192.168.81.100:8848
# 分组
group: TEST_GROUP
config:
# 配置中心地址
server-addr: 192.168.81.100:8848
# 分组
group: TEST_GROUP
# 配置文件格式
file-extension: yml
# 共享配置
shared-configs:
- application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
服务权重
在服务管理-服务列表,进入服务详情:

点击编辑,提高本机服务的权重:

我们可以看到编辑旁边是下线,你也可以不管三七二十一直接让别人的服务下线。
这种方式无法实现服务注册和发现的隔离,不推荐使用。