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();
相关推荐
怒放吧德德44 分钟前
RocketMQ从实战到源码:初识RocketMQ
java·后端·rocketmq
**AE86**1 小时前
redis6.2docker镜像构建
docker·容器
怎么就重名了1 小时前
Kivy的属性系统
java·前端·数据库
daidaidaiyu1 小时前
一文入门 Spring Security with 单点登录(jasig)
java·spring
哈哈老师啊1 小时前
Springboot就业管理系统bk5uv(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
java·spring boot·spring
chao1898441 小时前
基于C#实现Modbus通信及CRC校验
java·开发语言·c#
hunjinYang1 小时前
源码配置——基于Gradle搭建spring-framework-6.2.15版本阅读环境
java·后端·spring
编程饭碗1 小时前
【Spring全局异常处理 早抛晚捕】
java·数据库·spring
咸鱼2.01 小时前
【java入门到放弃】Elasticsearch概念
java·elasticsearch·jenkins
毕设源码-邱学长2 小时前
【开题答辩全过程】以 基于JSP论坛系统设计与实现为例,包含答辩的问题和答案
java·开发语言