Spring Cloud 中国实践与一致性协议
基于 Spring Cloud Alibaba 2023.x / Nacos 2.x · 核于 2026-08
速查
- Spring Cloud Alibaba:阿里开源的 Spring Cloud 实现,核心是 Nacos(发现+配置)+ Sentinel(熔断限流)+ Seata(分布式事务)+ RocketMQ(消息)。Nacos 是其注册中心与配置中心的默认实现。
- 两个 starter:
spring-cloud-starter-alibaba-nacos-discovery(发现)+spring-cloud-starter-alibaba-nacos-config(配置)。加依赖 + 几行bootstrap.yml即接入。 - 发现集成:
@EnableDiscoveryClient(可选,新版自动生效)+spring-cloud-starter-alibaba-nacos-discovery,应用启动自动注册到 Nacos,调用方用@LoadBalanced RestTemplate或FeignClient按服务名调用。 - 配置集成:
bootstrap.yml配spring.cloud.nacos.config,应用启动从 Nacos 拉配置,@RefreshScope+/actuator/refresh动态刷新。@Value注入的配置值在 Nacos 改了自动更新。 - 一致性协议:Nacos 用两个协议分工——Distro(AP)同步临时实例(服务数据,节点对等,高可用);Raft(CP)同步永久实例与配置/元数据(强一致,过半提交)。按实例 ephemeral 字段自动路由。
- Distro 协议:AP 型,每个 Nacos 节点负责一部分服务数据,节点间相互同步(各自负责的数据发给其他节点),最终一致。无 Leader,任一节点可写,分区时各节点都能注册(高可用)。
- Raft 协议:CP 型,Leader 写、过半提交,用于永久实例与配置/元数据。与 etcd/Consul 同源。
- Nacos vs Consul 对比:Nacos(AP 默认/主动上报/原生配置中心/中国标准/无 DNS)/ Consul(CP/反向探/裸 KV/国际/有 DNS/WAN Gossip 多 DC)。配置中心与生态是主要分野。
- 选型决策:中国 Spring Cloud + 需配置中心 → Nacos;国际化/多 DC/Go/DNS 接入 → Consul。
一、Spring Cloud Alibaba:Nacos 接入
服务发现集成
xml
<!-- pom.xml -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>yaml
# application.yml
spring:
application:
name: order-service
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
namespace: dev # 命名空间(环境隔离)
cluster-name: SHANGHAI # 集群(机房)
ephemeral: true # 临时实例(默认,AP,主动报心跳)java
@SpringBootApplication
public class OrderApp {
public static void main(String[] args) { SpringApplication.run(OrderApp.class, args); }
}
// 调用方:按服务名调用(自动负载均衡)
@FeignClient("payment-service") // 服务名,框架从 Nacos 查实例
interface PaymentClient {
@PostMapping("/pay") String pay(@RequestBody PayReq req);
}- 应用启动自动注册到 Nacos(服务名 =
spring.application.name,实例 = 本机 IP:port)。 - 客户端 SDK 周期性主动报心跳(5s)维持健康状态。
- 调用方用
@FeignClient或@LoadBalanced RestTemplate,框架自动从 Nacos 查实例 + 客户端负载均衡。
配置中心集成
xml
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>yaml
# bootstrap.yml(注意是 bootstrap,比 application 早加载)
spring:
application:
name: order-service
profiles:
active: dev
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
namespace: dev
group: ORDER_GROUP
file-extension: yaml # 拉取 order-service-dev.yaml
shared-configs: # 共享配置
- data-id: common.yaml
refresh: truejava
@RefreshScope // Nacos 配置变化时,该 Bean 重新创建
@RestController
class OrderController {
@Value("${order.timeout:3000}")
private int timeout; // Nacos 改 order.timeout,自动更新
}- 应用启动时从 Nacos 拉取
${app-name}-${profile}.yaml(如order-service-dev.yaml)+ 共享配置。 - 运行时长轮询监听,配置变化触发
@RefreshScopeBean 重建,@Value注入新值。 - bootstrap vs application:配置中心要在应用上下文初始化前拉取,所以配
bootstrap.yml(Spring Cloud 2020+ 需spring-cloud-starter-bootstrap依赖启用)。
二、一致性协议:Distro + Raft 分工
Nacos 内部用两个协议,按数据类型分工:
| 数据类型 | 协议 | 模式 | 原因 |
|---|---|---|---|
| 临时实例(服务数据) | Distro | AP | 实例动态频繁上下线,要高可用(分区也能注册),容忍最终一致 |
| 永久实例 | Raft | CP | 不常变,要强一致(所有节点看到同样的永久列表) |
| 配置数据 | Raft(+ MySQL 持久化) | CP | 配置绝不能丢/错,强一致 + 持久化 |
| Nacos 元数据 | Raft | CP | 集群自身状态,需强一致 |
Distro 协议(AP,临时实例)
Nacos 节点 1(负责服务 A、B 的数据)
Nacos 节点 2(负责服务 C、D 的数据)
Nacos 节点 3(负责服务 E、F 的数据)
每个节点把自己负责的服务数据,周期性同步给其他节点。
任一节点都能接受任意服务的注册(先存本地,再转发给"负责"的节点)。
分区时各节点独立工作,恢复后最终一致。- 节点对等,无 Leader:每个节点都能接受注册与查询,按 hash 把服务数据分配给「负责节点」,负责节点同步给其他。
- 最终一致:分区时各节点数据可能短暂不一致,恢复后通过同步收敛。保证高可用(分区也能注册)。
Raft 协议(CP,永久实例/配置)
- 与 etcd/Consul 的 Raft 相同:Leader 写、过半提交、强一致。
- 配置数据额外持久化到 MySQL(主从),保证即使所有 Nacos 节点挂了,配置也不丢(重启从 MySQL 恢复)。
三、Nacos vs Consul 详细对比
| 维度 | Nacos | Consul |
|---|---|---|
| 出品方 | 阿里巴巴 | HashiCorp |
| 语言/部署 | Java(JVM + MySQL) | Go(单二进制) |
| 服务发现一致性 | AP 默认(Distro,可切 CP) | CP(Raft) |
| 健康检查 | 主动上报为主(临时实例,5s 心跳) | 反向探为主(Agent 探服务) |
| 配置中心 | 原生(三级模型 + 灰度 + 回滚 + MySQL 持久化) | 裸 KV(无灰度/回滚原语) |
| DNS 接口 | 无 | 有(端口 8600) |
| 多数据中心 | 需集群联邦(非原生) | 原生(WAN Gossip) |
| mesh 能力 | 无(配 Sentinel/Seata) | Connect(mTLS + Intentions) |
| Spring Cloud 集成 | Alibaba(中国事实标准) | 国际 |
| 典型场景 | 中国 Spring Cloud | 国际/多 DC/Go 体系 |
关键差异解读
- 配置中心:Nacos 是原生配置中心(三级模型、灰度、回滚、MySQL 持久化),Consul 是裸 KV 要团队自拼——这是国内选 Nacos 的主因。
- 健康检查方式:Nacos 默认主动上报(临时实例客户端报心跳),Consul 默认反向探(Agent 探服务)——两种哲学,Nacos 更轻量(Nacos 不维护大量探活任务),Consul 更主动(不依赖客户端配合)。
- 一致性灵活度:Nacos 默认 AP 可切 CP(按实例类型),Consul 统一 CP——Nacos 灵活度更高,Consul 一致性更强。
- 生态地域:Nacos 是中国 Spring Cloud 事实标准,Consul 是国际派。选型常看团队地域与既有技术栈。
四、选型决策
是不是中国 Spring Cloud 项目? → 是 → 需要配置中心吗?
│
├─ 要 → Nacos(原生配置中心,事实标准)
└─ 不要 → Nacos(仍是国内首选注册中心)
↓ 不是
需要 DNS 接入 / 多 DC 原生 / Go 技术栈? → 要 → Consul
↓ 不要
需要 K8s 底座? → 是 → etcd
↓ 否
通用 → Nacos(综合能力均衡)下一步
理解了 Spring Cloud 集成与一致性协议后,下一步看参考——发现与配置速查、一致性模式表、API 清单、易错点与命令速查,作为速查手册。