Nacos 入门实战:部署、服务注册与发现全指南

1. Nacos解决的问题

在微服务架构中,服务之间通常通过 HTTP 请求进行远程调用。如果直接在代码中写死被调用服务的地址(如 IP 和端口),会带来以下问题:

  • 维护困难:一旦被调用服务的地址发生变化,就必须手动修改代码并重新部署,效率低下;
  • 缺乏弹性:当被调用服务存在多个实例(即服务集群)时,若请求始终指向某一个固定地址,不仅会造成负载不均,还可能因该实例宕机而导致整个调用失败。

为了解决这些问题,可以引入 Nacos 注册中心

Nacos 的核心作用是实现服务的自动注册与发现:

  1. 服务注册:每个微服务启动时,会将自己的信息(如服务名、IP 地址、端口等)注册到 Nacos 中,成为该服务的一个"实例"。
  2. 健康检查与剔除:Nacos 会持续监控各个实例的健康状态。一旦某个实例宕机或不可用,Nacos 会自动将其从可用实例列表中移除。
  3. 服务发现与负载均衡:当一个服务需要调用另一个服务时,它会向 Nacos 查询目标服务的可用实例列表,并通过内置的负载均衡策略(如轮询、随机等)选择一个健康的实例发起请求。

通过这种方式,服务之间的调用不再依赖硬编码的地址,而是动态、灵活且具备容错能力,大大提升了系统的可维护性和高可用性。

2. 部署步骤

以下部署是基于 docker 进行部署 Nacos 的流程

也可以参考官网部署步骤进行部署:

Nacoshttps://nacos.io/

1. 创建数据库

Nacoshttps://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();
相关推荐
可观测性用观测云2 小时前
Pyroscope Java 接入最佳实践
java
气π3 小时前
【JavaWeb】——(若依 + AI)-基础学习笔记
java·spring boot·笔记·学习·java-ee·mybatis·ruoyi
阿里云云原生3 小时前
AgentScope Java 1.0:从模型到应用,AI Agent 全生命周期管理利器!
java·云原生
一苓二肆3 小时前
代码常用工具使用
git·vscode·docker·github·vim
running up3 小时前
Maven依赖管理和项目构建工具
java·maven
YDS8294 小时前
SpringCould —— 网关详解
后端·spring·spring cloud
weixin_521431124 小时前
Docker容器技术
运维·docker·容器
老华带你飞4 小时前
列车售票|基于springboot 列车售票系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·学习·spring
java_logo4 小时前
LinuxServer.io LibreOffice 容器化部署指南
java·开发语言·docker·dubbo·openoffice·libreoffice·opensource
qq_589568104 小时前
@NotBlank与@NotEmpty注解无法导入
java·开发语言