微服务项目相同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}

服务权重

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

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

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

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

相关推荐
Absinthe_苦艾酒3 分钟前
SpringCloud之Eureka基础认识-服务注册中心
分布式·微服务·eureka
caihuayuan55 小时前
升级element-ui步骤
java·大数据·spring boot·后端·课程设计
佩奇的技术笔记6 小时前
Java学习手册:单体架构到微服务演进
java·微服务·架构
Kookoos6 小时前
ABP vNext + EF Core 实战性能调优指南
数据库·后端·c#·.net·.netcore
揣晓丹7 小时前
JAVA实战开源项目:健身房管理系统 (Vue+SpringBoot) 附源码
java·vue.js·spring boot·后端·开源
豌豆花下猫9 小时前
Python 3.14 新特性盘点,更新了些什么?
后端·python·ai
caihuayuan59 小时前
Vue生命周期&脚手架工程&Element-UI
java·大数据·spring boot·后端·课程设计
明月与玄武12 小时前
Spring Boot中的拦截器!
java·spring boot·后端
菲兹园长12 小时前
SpringBoot统一功能处理
java·spring boot·后端
muxue17813 小时前
go语言封装、继承与多态:
开发语言·后端·golang