1. Nacos解决的问题
在微服务架构中,服务之间通常通过 HTTP 请求进行远程调用。如果直接在代码中写死被调用服务的地址(如 IP 和端口),会带来以下问题:
- 维护困难:一旦被调用服务的地址发生变化,就必须手动修改代码并重新部署,效率低下;
- 缺乏弹性:当被调用服务存在多个实例(即服务集群)时,若请求始终指向某一个固定地址,不仅会造成负载不均,还可能因该实例宕机而导致整个调用失败。
为了解决这些问题,可以引入 Nacos 注册中心。
Nacos 的核心作用是实现服务的自动注册与发现:
- 服务注册:每个微服务启动时,会将自己的信息(如服务名、IP 地址、端口等)注册到 Nacos 中,成为该服务的一个"实例"。
- 健康检查与剔除:Nacos 会持续监控各个实例的健康状态。一旦某个实例宕机或不可用,Nacos 会自动将其从可用实例列表中移除。
- 服务发现与负载均衡:当一个服务需要调用另一个服务时,它会向 Nacos 查询目标服务的可用实例列表,并通过内置的负载均衡策略(如轮询、随机等)选择一个健康的实例发起请求。
通过这种方式,服务之间的调用不再依赖硬编码的地址,而是动态、灵活且具备容错能力,大大提升了系统的可维护性和高可用性。
2. 部署步骤
以下部署是基于 docker 进行部署 Nacos 的流程
也可以参考官网部署步骤进行部署:
1. 创建数据库
Nacos
https://pan.baidu.com/s/1-LUU14pRCIE1kGYMkXtYYQ?pwd=m3pi 提取码: m3pi
可以使用上面百度网盘中的 sql 语句进行创建数据库
2. 设置自定义配置
custom.env配置文件内容如下:
PREFER_HOST_MODE=hostname
MODE=standalone
SPRING_DATASOURCE_PLATFORM=mysql
MYSQL_SERVICE_HOST=你的虚拟机地址
MYSQL_SERVICE_DB_NAME=nacos
MYSQL_SERVICE_PORT=3306
MYSQL_SERVICE_USER=数据库用户名
MYSQL_SERVICE_PASSWORD=数据库用户名密码
MYSQL_SERVICE_DB_PARAM=characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
其中需要替换虚拟机地址、数据库用户名、以及数据库密码等信息。修改完成后将其放置在nacos文件中,并上传虚拟机的 root 目录下:

3. 运行容器
执行以下命令运行容器:
docker run -d \
--name nacos \
--env-file ./nacos/custom.env \
-p 8848:8848 \
-p 9848:9848 \
-p 9849:9849 \
--restart=always \
nacos/nacos-server:v2.1.0-slim
可以使用上面网盘中的 tar 包。
4. 验证
访问:http://你的虚拟机地址:8848/nacos/,默认登录名和登录密码都为 nacos
3. 服务注册
接下就可以将自己的服务注册到Nacos:
1. 添加依赖
在需要注册的服务中添加一下依赖:
XML
<!--nacos 服务注册发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2. 配置Nacos
在服务的配置文件中添加一下内容:
XML
spring:
application:
name: xxx-service # 服务名称
cloud:
nacos:
server-addr: 你的nacos地址 # nacos地址
根据实际业务需求更改以上部分内容
3. 测试
现在启动服务,就可以查看 Nacos 控制台,查看是否存在启动的服务

4. 服务发现
注册服务的最终目的就是为了方面服务之间发起 HTTP 请求进行访问数据,接下来就是访问数据的流程:
1. 引入依赖
服务发现者也需要引入对应依赖:
XML
<!--nacos 服务注册发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2. 配置Nacos
XML
spring:
cloud:
nacos:
server-addr: 你的nacos地址:8848
服务发现者不需要进行服务注册,因此不需要 application.name 项
3. 发现并调用服务
java
// 服务发现用到一个工具: DiscoveryClient
private final DiscoveryClient discoveryClient;
java
List<ServiceInstance> instances = discoveryClient.getInstances("xxx-service");
// 判断是否存在
if (CollUtils.isEmpty(instances)) {
return;
}
// 采用负载均衡(随机),获取一个服务
ServiceInstance instance = instances.get(RandomUtil.randomInt(instances.size()));
// 发起请求获取信息
ResponseEntity<对应接口的返回值类型> response = restTemplate.exchange(
instance.getUri() +"/ID?ids={ids}", // 路径请求参数 ID
HttpMethod.GET,
null, // get 请求没有请求体
new ParameterizedTypeReference<对应接口的返回值类型>() {
},
Map.of("ids", CollUtil.join(Ids, ",")) // 拼接路径请求参数
);
// 判断是否响应成功
if(!response.getStatusCode().is2xxSuccessful()){
return ;
}
// 解析数据
response.getBody();