Spring Cloud - Nacos 服务发现

微服务架构 —— Nacos 服务发现

1. 核心理论:什么是 Nacos?

Nacos 是阿里巴巴开源的一个更现代化的服务发现、配置管理和服务管理平台。它旨在帮助我们更轻松地构建云原生应用和微服务平台。

  • 核心功能: Nacos = 服务注册中心 + 配置中心。它一个组件就同时实现了 Eureka 和 Spring Cloud Config 的功能。

  • 生活比喻:

    • Eureka: 是一个单纯的“手机通讯录”,只负责记录谁的电话号码是多少。
    • Nacos: 是一个“智能云端生活助手”。它不仅有“通讯录”(服务发现)功能,还有一个“公告板”(配置中心)功能。管理员可以在公告板上发布通知(修改配置),所有人的手机(所有微服务)都能立刻收到并应用最新的通知,无需重启。

Nacos vs. Eureka 核心区别

1. 功能集成度更高 (服务发现 + 配置管理):                                                                                                                         
   * Eureka 专注于服务发现,是一个纯粹的服务注册中心。                                                                                                           
   * Nacos 则是一个集服务注册中心和配置中心于一体的平台。一个 Nacos 组件就能替代 Eureka + Spring Cloud Config,大大简化了微服务治理的技术栈和部署复杂度。

2. 服务发现实时性更高 (推拉结合):
    * Eureka 主要采用客户端拉 (Pull) 模式。客户端定期从服务端拉取服务列表,实时性稍差。
    * Nacos 采用服务端推 (Push) + 客户端拉 (Pull) 相结合的模式。当服务状态变更时,Nacos Server 会主动推送给客户端,极大地提高了服务发现的实时性。

3. 支持数据一致性协议可切换 (AP/CP):
    * Eureka 优先保证服务的高可用性 (AP),当网络分区发生时,依然允许服务注册和发现,但可能返回不准确的服务信息。
    * Nacos 允许用户在 AP 和 CP (强一致性) 模式之间进行切换,默认是 AP 模式。这使得它能适应更多场景的需求。

4. 更精准的健康检查机制:
    * Eureka 主要依赖客户端的被动心跳续约。
    * Nacos 结合了客户端心跳和服务器端主动探测。它不仅接收客户端的心跳,还会主动向服务实例发送健康检查请求,能更及时、更精准地感知服务实例的真实健康状况。

5. 社区活跃度更高:
    * Eureka 官方已宣布进入维护模式 (Netflix Eureka 2.x 已停止开源)。
    * Nacos 作为一个持续演进中的项目,社区高度活跃,由阿里巴巴和社区共同维护,拥有更强的生命力和发展潜力。
  • 推/拉模式解释:
    • 拉模式 (Pull): 客户端主动、定期地向注册中心拉取最新的服务列表。实时性稍差,但对注册中心压力小。Eureka 是典型的拉模式。
    • 推模式 (Push): 注册中心在服务列表发生变更时,主动将变更信息推送给所有订阅的客户端。实时性好,但对注册中心有一定性能要求。Nacos 采用的是拉+推结合的模式,兼具了实时性和可靠性。

2. 准备工作:启动 Nacos Server

与 Eureka 不同,Nacos Server 通常是作为一个独立的应用来运行的,而不是内嵌在我们的项目里。

  1. 下载: 从 Nacos 的 GitHub Releases 页面下载最新的稳定版本(例如 nacos-server-x.x.x.zip)。
  2. 解压: 解压下载的文件。
  3. 启动: 进入 nacos/bin 目录,执行启动命令。
    • Windows: cmd startup.cmd -m standalone (以单机模式启动)
    • Linux/macOS: sh startup.sh -m standalone
  4. 访问: 启动成功后,访问 http://localhost:8848/nacos。默认的用户名和密码都是 nacos

3. 代码示例:将服务注册到 Nacos

3.1 添加依赖 (pom.xml)

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

3.2 编写主启动类

package com.study.nacosdiscovery;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient // 开启服务注册与发现功能
public class NacosClientApplication {
    public static void main(String[] args) {
        SpringApplication.run(NacosClientApplication.class, args);
    }
}

注意: 与 Eureka 类似,@EnableDiscoveryClient 在较新的 Spring Cloud 版本中也是可选的,但建议保留以增强代码可读性。

3.3 编写配置文件 (application.yml)

这是配置 Nacos Client 的关键。

server:
  port: 8081 # 为该服务指定一个端口

spring:
  application:
    name: product-service # 指定一个新的服务名称
  cloud:
    nacos:
      discovery:
        # 指定 Nacos Server 的地址和端口
        server-addr: 127.0.0.1:8848

3.4 创建一个测试 Controller

package com.study.nacosdiscovery;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ProductController {
    @GetMapping("/product")
    public String getProduct() {
        return "Hello from Product Service!";
    }
}

4. 运行与验证

  1. 先确保 Nacos Server 正在运行
  2. 再启动 NacosClientApplication
  3. 访问 Nacos 的管理界面 (http://localhost:8848/nacos),点击左侧菜单的 “服务管理” -> “服务列表”。
  4. 你应该能看到我们刚刚启动的 product-service,并且实例数显示为 1。
  • 效果: 这表明我们的 product-service 微服务已经成功地将自己注册到了 Nacos 服务注册中心。至此,我们已经掌握了使用 Nacos 替代 Eureka 进行服务治理的基本方法。
posted @ 2026-01-21 16:26  我是刘瘦瘦  阅读(1)  评论(0)    收藏  举报