Spring Boot 2.7.18 与 Spring Cloud 接入连接 Nacos
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.RELEASE
。maven 中央库 中,最新的就是 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 3.0,Spring Boot 2.7~2.4 和 2.4 以下版本之间变化较大,所以按照这三个版本区间做对应说明。但有一个问题就是没有对应 Spring Boot 2.7.* 的版本,最高到 2.6.13
。
以下为测试兼容情况:
Spring Boot | nacos | 结果 |
---|---|---|
2.2.5.RELEASE | 2.2.1.RELEASE | OK |
2.4.2 | 2021.1 | OK |
2.7.18 | 2021.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.4
和 2.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-starter
为 2.4.2
,但测试 Spring Boot 2.7.18
版本也是支持的。
报错 Param 'serviceName' is illegal, serviceName is blank
测试中间报过一个 Param 'serviceName' is illegal, serviceName is blank
,现在已经不记得如何复现了,但印象中就是配置文件的问题,按照上面的调整兼容版本,设置好对应的配置文件就可以解决。
Nacos 配置管理和服务发现的用户名、密码
Nacos 服务器开启了鉴权之后,需要配置连接的用户名和密码。如上面的配置一样,分别添加 username
、password
参数即可,默认都是 nacos
。但我发现,原项目中使用的配置里并没有添加这个用户名和密码,全项目搜索了也没有发现。项目版本 Spring Boot 2.2.5.RELEASE
,Nacos 2.2.1.RELEASE
。Nacos 服务本地安装的是 v2.3.1
,而服务器上版本为 v2.1.0
。
将测试项目版本调整一致,复制原项目的连接配置,启动成功,但有报错提示 logback-spring.xml
文件不存在。复制问题过来,再次启动成功!
所以是 Nacos 低版本存在不需要鉴权即可连接的问题,推荐使用最新的版本,安全性更高一些。另外,如上篇 Nacos 2.3.1 安装使用初体验 提到的 内部系统,不可暴露到公网
,Nacos 简单鉴权版本最好将其安装到内网,不添加外网访问,否则会有安全隐患。