Spring Boot 与 Spring Cloud 接入 Nacos,可以参考官方教程:Nacos 融合 Spring Boot,成为注册配置中心Nacos 融合 Spring Cloud,成为注册配置中心。这里主要记录一下接入时遇到的一些问题。

版本兼容

Spring Boot 的版本兼容有说明:

注意:版本 0.2.x.RELEASE 对应的是 Spring Boot 2.x 版本,版本 0.1.x.RELEASE 对应的是 Spring Boot 1.x 版本。

所以 Spring Boot 2.7.18 对应的是 0.2.x.RELEASEmaven 中央库 中,最新的就是 0.2.12,更新时间:Jul 21, 2022。还有一个 0.3.0-RC 对应的是 2.6.3,更新时间:Dec 07, 2023

添加以下配置项

nacos:
  discovery:
    server-addr: 127.0.0.1:8848
    username: nacos
    password: nacos
  config:
    server-addr: 127.0.0.1:8848
    group: DEFAULT_GROUP
    file-extension: yml
    username: nacos
    password: nacos

启动正常。

Spring Cloud 的就比较复杂了。注意,Spring Boot 与 Spring Cloud 引入的依赖是不一样的,虽然我也分不清 Spring Boot 与 Spring Cloud 有什么区别。Spring Cloud 直接给了一个版本对应的 wiki:

版本说明 - alibaba/spring-cloud-alibaba

Spring Boot 2.7~2.4 和 2.4 以下版本对应关系

里面提到 Spring Boot 3.0,Spring Boot 2.7~2.4 和 2.4 以下版本之间变化较大,所以按照这三个版本区间做对应说明。但有一个问题就是没有对应 Spring Boot 2.7.* 的版本,最高到 2.6.13

以下为测试兼容情况:

Spring Bootnacos结果
2.2.5.RELEASE2.2.1.RELEASEOK
2.4.22021.1OK
2.7.182021.0.6.0(原对应 2.6.13)OK

配置文件使用 bootstrap.yml 还是 application.yml

看到项目中 Spring Cloud 微服务项目使用的配置文件为 bootstrap.yml,而测试创建的项目因为基于 Spring Boot,所以配置文件为 application.yml

百度了一下两个配置文件的区别,提到 bootstrap.yml 的加载时间在 application.yml 之前,通常用于微服务框架,加载一些公共配置。

前面的测试,2.4.2 以及 2.7.18 都存在获取不到 bootstrap.yml 配置的情况。将配置修改到 application.yml 能够正常生效。而 2.2.5.RELEASE 就没有这种情况,可以直接读取 bootstrap.yml 中的配置。猜测这也与前面提到的 2.7~2.42.4以下 这个分界点有关系,Spring Boot 的加载配置文件的方式发生了重大变化。

百度 bootstrap.yml 配置文件不生效的问题,得到一个比较合理的解释:

Spring Boot 2.4 版本开始,配置文件加载方式进行了重构,只会识别 application.* 配置文件,并不会自动识别bootstrap.yml

来自 Springboot 项目 bootstrap.yml 不生效问题 - CSDN

其中提到了三个解决方案,一是降低 Spring Boot 版本到 2.4 以下,二是将配置移到 application.yml 中,三是引入 Spring Cloud 依赖,将项目标记为 Spring Cloud 项目。

其中第三点引入的依赖是:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bootstrap</artifactId>
    <version>3.0.1</version>
</dependency>

v3.0.1 在中央库里按照它依赖的 spring-cloud-starter 下的 spring-boot-starter2.4.2,但测试 Spring Boot 2.7.18 版本也是支持的。

报错 Param 'serviceName' is illegal, serviceName is blank

测试中间报过一个 Param 'serviceName' is illegal, serviceName is blank,现在已经不记得如何复现了,但印象中就是配置文件的问题,按照上面的调整兼容版本,设置好对应的配置文件就可以解决。

Nacos 配置管理和服务发现的用户名、密码

Nacos 服务器开启了鉴权之后,需要配置连接的用户名和密码。如上面的配置一样,分别添加 usernamepassword 参数即可,默认都是 nacos。但我发现,原项目中使用的配置里并没有添加这个用户名和密码,全项目搜索了也没有发现。项目版本 Spring Boot 2.2.5.RELEASENacos 2.2.1.RELEASE。Nacos 服务本地安装的是 v2.3.1,而服务器上版本为 v2.1.0

将测试项目版本调整一致,复制原项目的连接配置,启动成功,但有报错提示 logback-spring.xml 文件不存在。复制问题过来,再次启动成功!

所以是 Nacos 低版本存在不需要鉴权即可连接的问题,推荐使用最新的版本,安全性更高一些。另外,如上篇 Nacos 2.3.1 安装使用初体验 提到的 内部系统,不可暴露到公网,Nacos 简单鉴权版本最好将其安装到内网,不添加外网访问,否则会有安全隐患。