Skip to content

Spring Cloud 中国实践与一致性协议

基于 Spring Cloud Alibaba 2023.x / Nacos 2.x · 核于 2026-08

速查

  • Spring Cloud Alibaba:阿里开源的 Spring Cloud 实现,核心是 Nacos(发现+配置)+ Sentinel(熔断限流)+ Seata(分布式事务)+ RocketMQ(消息)。Nacos 是其注册中心与配置中心的默认实现。
  • 两个 starterspring-cloud-starter-alibaba-nacos-discovery(发现)+ spring-cloud-starter-alibaba-nacos-config(配置)。加依赖 + 几行 bootstrap.yml 即接入。
  • 发现集成@EnableDiscoveryClient(可选,新版自动生效)+ spring-cloud-starter-alibaba-nacos-discovery,应用启动自动注册到 Nacos,调用方用 @LoadBalanced RestTemplateFeignClient 按服务名调用。
  • 配置集成bootstrap.ymlspring.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: true
java
@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)+ 共享配置。
  • 运行时长轮询监听,配置变化触发 @RefreshScope Bean 重建,@Value 注入新值。
  • bootstrap vs application:配置中心要在应用上下文初始化前拉取,所以配 bootstrap.yml(Spring Cloud 2020+ 需 spring-cloud-starter-bootstrap 依赖启用)。

二、一致性协议:Distro + Raft 分工

Nacos 内部用两个协议,按数据类型分工:

数据类型协议模式原因
临时实例(服务数据)DistroAP实例动态频繁上下线,要高可用(分区也能注册),容忍最终一致
永久实例RaftCP不常变,要强一致(所有节点看到同样的永久列表)
配置数据Raft(+ MySQL 持久化)CP配置绝不能丢/错,强一致 + 持久化
Nacos 元数据RaftCP集群自身状态,需强一致

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 详细对比

维度NacosConsul
出品方阿里巴巴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 清单、易错点与命令速查,作为速查手册。