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

服务权重

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

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

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

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

相关推荐
wr20051422 分钟前
第二次作业,渗透
java·后端·spring
短剑重铸之日26 分钟前
《SpringCloud实用版》生产部署:Docker + Kubernetes + GraalVM 原生镜像 完整方案
后端·spring cloud·docker·kubernetes·graalvm
爬山算法1 小时前
Hibernate(67)如何在云环境中使用Hibernate?
java·后端·hibernate
奈斯ing1 小时前
【Oracle篇】基于OGG 21c全程图形化实现9TB数据从Oracle 11g到19c的不停机迁移(上):微服务架构详解与微服务部署,及同步问题总览(第一篇,总共三篇)
微服务·oracle·架构
Hernon1 小时前
微服务架构设计 - 架构取舍决策CAP
微服务·云原生·架构
女王大人万岁2 小时前
Go标准库 io与os库详解
服务器·开发语言·后端·golang
露天赏雪2 小时前
Java 高并发编程实战:从线程池到分布式锁,解决生产环境并发问题
java·开发语言·spring boot·分布式·后端·mysql
短剑重铸之日3 小时前
《SpringCloud实用版》 Seata 分布式事务实战:AT / TCC / Saga /XA
后端·spring·spring cloud·seata·分布式事务
FAFU_kyp3 小时前
RISC0_ZERO项目在macOs上生成链上证明避坑
开发语言·后端·学习·macos·rust
qq_12498707533 小时前
基于springboot的会议室预订系统设计与实现(源码+论文+部署+安装)
java·vue.js·spring boot·后端·信息可视化·毕业设计·计算机毕业设计