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();
相关推荐
朦胧之3 小时前
AI 编程-老项目改造篇
java·前端·后端
程序猿大帅7 小时前
别再只当调包侠了:用 Spring AI 落地 Function Calling,我被大模型硬生生砸出了三个大坑
java
程序员晓琪8 小时前
约定大于配置:基于 Java 包名自动生成 API 版本路由的最佳实践
java·spring boot·后端
Flittly8 小时前
【AgentScope Java新手村系列】(11)中断与恢复
java·spring boot·spring
众少成多积小致巨9 小时前
JNI (Java Native Interface) 技术手册中文参考指南
android·java·c++
东坡白菜9 小时前
破局全栈:前端开发的Java入门实战记录—JPA(2)
java·后端
曲幽14 小时前
别再用网页翻译看源码了!你的私人翻译神器LibreTranslate,部署避坑指南来了
python·docker·web·pot·translate·libretranslate·arogstranslate
SimonKing15 小时前
艹,维护AI写的代码,我心态崩了......
java·后端·程序员
用户2986985301416 小时前
Java Word 文档样式进阶:段落与文本背景色设置完全指南
java·后端
小bo波1 天前
从"任意文件复制"深挖Java I/O:字符流与字节流的本质抉择
java·nio·io流·后端开发·文件复制