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 通常是作为一个独立的应用来运行的,而不是内嵌在我们的项目里。
- 下载: 从 Nacos 的 GitHub Releases 页面下载最新的稳定版本(例如
nacos-server-x.x.x.zip)。 - 解压: 解压下载的文件。
- 启动: 进入
nacos/bin目录,执行启动命令。- Windows:
cmd startup.cmd -m standalone(以单机模式启动) - Linux/macOS:
sh startup.sh -m standalone
- Windows:
- 访问: 启动成功后,访问
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. 运行与验证
- 先确保 Nacos Server 正在运行。
- 再启动 NacosClientApplication。
- 访问 Nacos 的管理界面 (
http://localhost:8848/nacos),点击左侧菜单的 “服务管理” -> “服务列表”。 - 你应该能看到我们刚刚启动的
product-service,并且实例数显示为 1。
- 效果: 这表明我们的
product-service微服务已经成功地将自己注册到了 Nacos 服务注册中心。至此,我们已经掌握了使用 Nacos 替代 Eureka 进行服务治理的基本方法。

浙公网安备 33010602011771号