微服务项目相同nacos地址导致的问题

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}

服务权重

在服务管理-服务列表,进入服务详情:

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

我们可以看到编辑旁边是下线,你也可以不管三七二十一直接让别人的服务下线。

这种方式无法实现服务注册和发现的隔离,不推荐使用。

相关推荐
皮皮高21 分钟前
itvbox绿豆影视tvbox手机版影视APP源码分享搭建教程
android·前端·后端·开源·tv
弱冠少年25 分钟前
golang入门
开发语言·后端·golang
Humbunklung28 分钟前
Rust 函数
开发语言·后端·rust
喜欢踢足球的老罗34 分钟前
在Spring Boot 3.3中使用Druid数据源及其监控功能
java·spring boot·后端·druid
jakeswang1 小时前
StarRocks
后端·架构
龙云飞谷1 小时前
从原理到调参,小白也能读懂的大模型微调算法Lora
后端
荣江1 小时前
【实战】基于 Tauri 和 Rust 实现基于无头浏览器的高可用网页抓取
后端·rust
寻月隐君1 小时前
Web3实战:Solana CPI全解析,从Anchor封装到PDA转账
后端·web3·github
程序员小假1 小时前
说一说 SpringBoot 中 CommandLineRunner
java·后端
sky_ph1 小时前
JAVA-GC浅析(一)
java·后端