Dubbo
yuankaiqiang Lv5

1、简介

动态配置服务

动态配置服务让您能够以中心化、外部化和动态化的方式管理所有环境的配置。动态配置消除了配置变更时重新部署应用和服务的需要。配置中心化管理让实现无状态服务更简单,也让按需弹性扩展服务更容易。

服务发现及管理

动态服务发现对以服务为中心的(例如微服务和云原生)应用架构方式非常关键。Nacos支持DNS-Based和RPC-Based(Dubbo、gRPC)模式的服务发现。Nacos也提供实时健康检查,以防止将请求发往不健康的主机或服务实例。借助Nacos,您可以更容易地为您的服务实现断路器。

动态DNS服务

通过支持权重路由,动态DNS服务能让您轻松实现中间层负载均衡、更灵活的路由策略、流量控制以及简单数据中心内网的简单DNS解析服务。动态DNS服务还能让您更容易地实现以DNS协议为基础的服务发现,以消除耦合到厂商私有服务发现API上的风险。

2、安装

官网 [^1]

  1. 下载地址 [^2]

  2. 启动

    1
    2
    cd nacos/bin
    bash startup.sh -m standalone(ubuntu,standalone非集群模式启动)

    若提示内存不足,则修改启动内存 bin/startup.sh

    • Xms 是指设定程序启动时占用内存大小

    • Xmx 是指设定程序运行期间最大可占用的内存大小

    • -Xmn 新生代的大小

    image-20210609192625760

  3. 使用 http://localhost:8848/nacos 访问,账号密码初始为nacos

    image-20210609195125981

  4. 修改为mysql数据库,数据库版本需为5版本(application.properties文件)

    image-20210624134345889

    创建nacos数据库,将config文件下的nacos-mysql.sql文件导入到nacos数据库中,修改为自己myslq的用户名和密码

    image-20210624134538608

  5. 重启nacos服务

3、配置

命令空间,隔离多个环境

image-20210624211408315

在不同的命令空间中创建相应的配置信息

image-20210624211535233

回滚

在历史版本中可以进行配置版本的回滚操作

image-20210624211702040

无需账号密码登录

注释掉application.properties配置文件中的这一行

image-20210624215542651

加上下面后重启服务

1
2
3
4
spring.security.enabled=false
management.security=false
security.basic.enabled=false
nacos.security.ignore.urls=/**

4、Springboot中使用

获取配置,第一种方式

导入依赖

1
2
3
4
5
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>2.0.1</version>
</dependency>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package com.yuankaiqiang.nacos;

import java.util.Properties;
import java.util.concurrent.Executor;

import com.alibaba.nacos.api.NacosFactory;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.config.listener.Listener;
import com.alibaba.nacos.api.exception.NacosException;

public class NacosConifig {

public static void main(String[] args) throws NacosException, InterruptedException {
String serverAddr = "114.55.26.230:8848";
String dataId = "spiritmark.nacos.demo.properties";
String group = "DEFAULT_GROUP";
// String namespace = "";
Properties properties = new Properties();
properties.put("serverAddr", serverAddr);
// properties.put("namespace", namespace);

ConfigService configService = NacosFactory.createConfigService(properties);
String content = configService.getConfig(dataId, group, 5000);
System.out.println(content);

//添加配置监听
configService.addListener(dataId, group, new Listener() {
@Override
public void receiveConfigInfo(String configInfo) {
System.out.println("receive:" + configInfo);
}

@Override
public Executor getExecutor() {
return null;
}
});

// //发布配置
// boolean isPublishOk = configService.publishConfig(dataId, group, "content");
// System.out.println(isPublishOk);
//
// //获取配置
// Thread.sleep(3000);
// content = configService.getConfig(dataId, group, 5000);
// System.out.println(content);
//
// //删除配置
// boolean isRemoveOk = configService.removeConfig(dataId, group);
// System.out.println(isRemoveOk);
// Thread.sleep(3000);
//
// //再次获取配置
// content = configService.getConfig(dataId, group, 5000);
// System.out.println(content);
// Thread.sleep(300000);
}
}

获取配置,第二种方式

导入依赖(这个依赖包括第一种方式的jar包)

1
2
3
4
5
<!-- nacos-配置管理功能依赖 -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-config-spring-boot-starter</artifactId> <version>0.2.1</version>
</dependency>

启动类上增加@NacosPropertySource,多个配置增加多个注解,只支持properties

image-20210625190446948

1
2
3
4
5
6
7
8
9
10
11
12
@RestController
@RequestMapping("/user")
public class Controller {

@NacosValue(value = "${username:null}", autoRefreshed = true)
private String username;

@RequestMapping(value = "/getUser")
public String getUser() {
return username;
}
}

原配置

image-20210625190649606

image-20210625190705864

修改为zhangsan后

image-20210625190803773

image-20210625190816255

注册服务

启动项目后

1
2
3
4
server.port = 8891
spring.application.name=provider-server
nacos.discovery.server-addr=114.55.26.230:8848
nacos.config.server-addr=114.55.26.230:8848
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Configuration
public class NacosRegisterConfiguration {

@Value("${server.port}")
private int serverPort;

@Value("${spring.application.name}")
private String applicationName;

@NacosInjected
private NamingService namingService;

@PostConstruct
public void registerInstance() throws NacosException {
namingService.registerInstance(applicationName, "127.0.0.1", serverPort, "DEFAULT");
}
}

服务列表中增加了一个服务

image-20210625204010182

image-20210625204030596

订阅注册服务者

订阅者订阅某个服务

image-20210625224619567

image-20210625224553199

5、搭建集群

需要依赖mysql

伪分布式(下面这种方式适用1.4.2使用,2.x启动有问题)

  1. 复制三份nacos文件夹,重命名为nacos1,nacos2,nacos3,相当于三个集群

image-20210624224631980

  1. 修改每个文件中集群中的端口号,application.properties 中增加 server.port=8848

    Nacos18848
    Nacos28849
    Nacos38850
  2. 修改每个文件,集群配置文件(cluster.conf.example)中修改成对应的ip和端口,因为都是本地所以都为192.168.x.x(使用192),并将文件名称修改为 cluster.conf

    1
    2
    3
    4
    5
    #it is ip
    #example
    192.168.185.116:8848
    192.168.185.116:8849
    192.168.185.116:8850
  3. 分别三个集群启动 bash startup.sh -m cluster cluster为集群模式启动

  4. 查看状态

    8848为leader

    image-20210625142014286

    关掉8848服务器,leader为8849

    image-20210625142207853

4、面试题

1. 什么是 Nacos?它的核心功能有哪些?

答:
Nacos(Naming and Configuration Service)是阿里巴巴开源的一个动态服务发现、配置管理和服务管理平台。

核心功能:

  • 服务注册与发现:支持 DNS 和 RPC 服务发现(如 Dubbo、gRPC、Spring Cloud)。
  • 动态配置管理:支持配置的集中管理、动态更新、版本控制、环境隔离。
  • 服务管理:支持服务健康检查、元数据管理、流量管理等。
  • 动态 DNS 服务:支持权重路由,可用于 DNS 负载均衡。

✅ 特点:轻量级、高可用、易集成,是 Spring Cloud Alibaba 的核心组件之一。

2. Nacos 的配置中心是如何实现动态刷新的?

答:
Nacos 客户端通过 长轮询(Long Polling) + 回调机制 实现配置的动态推送感知:

  1. 客户端启动时向 Nacos 服务器发起一个长轮询请求(默认 30s 超时)。
  2. 服务端不会立即返回,而是 hold 请求,直到配置发生变化或超时。
  3. 一旦配置变更,服务端立即返回变更的 dataId 列表。
  4. 客户端收到通知后,主动拉取最新配置,并触发 Listener 回调。
  5. 在 Spring Cloud 中,通过 @RefreshScope 注解实现 Bean 的刷新。

⚠️ 注意:不是真正的“推送”,而是“准实时拉取 + 服务端阻塞通知”。

3. 如何在 Spring Boot 中集成 Nacos 配置中心?

答:
步骤如下:

  1. 添加依赖:
1
2
3
4
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
  1. 配置 bootstrap.yml
1
2
3
4
5
6
7
8
9
10
spring:
application:
name: user-service
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
namespace: dev-namespace-id
group: DEFAULT_GROUP
file-extension: yaml
  1. 在 Nacos 控制台创建配置:
    • Data ID: user-service.yaml
    • Group: DEFAULT_GROUP
    • 内容:YAML 格式配置
  2. 使用 @Value + @RefreshScope 实现热更新:
1
2
3
4
5
6
@Component
@RefreshScope
public class UserService {
@Value("${user.timeout:5000}")
private int timeout;
}

4. Nacos 的命名空间(Namespace)、组(Group)、Data ID 分别有什么作用?

答:

概念作用示例
Namespace隔离环境(如 dev/test/prod)或租户不同环境使用不同命名空间 ID
Group对配置或服务进行逻辑分组ORDER_GROUP,USER_GROUP
Data ID唯一标识一个配置文件通常为${spring.application.name}.${file-extension}

✅ 公式:Data ID = ${prefix}-${spring.profile.active}.${file-extension}
默认前缀是 spring.application.name

5. Nacos 支持哪些配置格式?如何指定?

答:
支持格式:properties, yaml, json, xml, text 等。

通过 file-extension 参数指定:

1
2
3
4
5
spring:
cloud:
nacos:
config:
file-extension: yaml

⚠️ 注意:如果使用 yaml,建议统一使用 .yaml 后缀,避免与 .yml 混淆。

6. Nacos 如何实现配置的版本管理和回滚?

答:
Nacos 控制台提供配置的 历史版本管理 功能:

  • 每次修改配置会生成一个新版本。
  • 可查看历史版本的修改时间、内容、操作人。
  • 支持“一键回滚”到任意历史版本。
  • 版本信息存储在数据库中(MySQL 或内嵌 Derby)。

✅ 优势:避免误操作导致配置错误,提升运维安全性。

7. Nacos 集群模式下如何保证数据一致性?

答:
Nacos 使用 Raft 协议 实现 CP(一致性优先)的数据一致性。

  • 在集群模式下,Nacos 自研了 jraft 组件(基于 Raft)。
  • 所有写请求(如发布配置)必须由 Leader 处理。
  • Leader 将数据同步给 Follower,多数派确认后才返回成功。
  • 读请求可由任意节点处理(可优化性能)。

✅ 注意:单机模式使用 Derby,集群模式必须使用 MySQL 持久化配置。

8. Nacos 和 Eureka 的区别是什么?

对比项NACOSEUREKA
CAP 模型支持 AP(服务发现)和 CP(配置)AP 模型
健康检查TCP/HTTP/心跳心跳机制
配置中心✅ 内置❌ 不支持
服务发现协议支持 DNS + API仅 API
自动剔除节点✅(超过阈值自动剔除)
集群一致性协议Raft(CP)Peer-to-Peer 复制(AP)
生态集成Spring Cloud AlibabaSpring Cloud Netflix

✅ 总结:Nacos 更全面,功能更强,是 Eureka 的“超集”。

9. Nacos 和 Apollo 的区别?

对比项NACOSAPOLLO
核心定位服务发现 + 配置管理一体化专业配置中心
配置灰度发布❌(社区版)/ ✅(企业版)
权限控制基础(用户+namespace)完善(项目、角色、审计)
配置发布流程简单直接支持审批流程
服务发现❌(需额外组件)
易用性轻量、易部署功能多、较重
社区支持阿里 + Spring Cloud Alibaba携程开源,活跃

✅ 建议:需要服务发现选 Nacos;需要复杂配置治理选 Apollo。

10. Nacos 客户端是如何监听配置变化的?

答:
通过 ConfigService 添加监听器:

1
2
3
4
5
6
7
8
NacosFactory.createConfigService(properties);
String config = configService.getConfig(dataId, group, 5000);
configService.addListener(dataId, group, new Listener() {
@Override
public void receiveConfigInfo(String configInfo) {
System.out.println("配置更新:" + configInfo);
}
});

在 Spring Cloud 中自动完成,开发者只需使用 @RefreshScope

11. Nacos 如何实现多环境隔离?

答:
主要通过 Namespace 实现:

  1. 在 Nacos 控制台创建多个命名空间,如:
    • dev(开发)
    • test(测试)
    • prod(生产)
  2. 每个命名空间有唯一 ID。
  3. 应用通过配置 namespace: <id> 指定环境。
1
2
3
4
5
spring:
cloud:
nacos:
config:
namespace: dev-uuid

✅ 优势:配置完全隔离,避免误操作。

12. Nacos 集群部署需要哪些组件?

答:
生产环境推荐集群部署,组件包括:

  • 至少 3 个 Nacos 节点(奇数个,满足 Raft 协议)
  • 共享数据库:MySQL 集群(主从或 MHA),用于持久化配置和服务信息
  • 负载均衡器:如 Nginx、HAProxy,对外提供统一入口
  • JDK 1.8+
  • 网络互通、时间同步

部署结构:

1
2
3
4
5
Client → Nginx → Nacos Node1
→ Nacos Node2
→ Nacos Node3

MySQL(主从)

13. Nacos 的健康检查机制是怎样的?

答:
Nacos 支持多种健康检查方式:

  • 临时实例(Ephemeral):客户端上报心跳(默认 5s 一次),服务端 15s 未收到则标记不健康,30s 未收到则剔除。
  • 持久化实例(Persistent):服务端主动发起 TCP/HTTP/MySQL 检查。

✅ 临时实例适用于 Spring Cloud 服务;持久化实例适用于非 SDK 接入(如 Kubernetes 服务)。

14. 如何保证 Nacos 配置的安全性?

答:
可以从以下方面加强安全:

  1. 启用鉴权

    :Nacos 1.2+ 支持开启鉴权:

    1
    2
    3
    4
    nacos:
    core:
    auth:
    enabled: true
  2. 配置敏感信息加密:如数据库密码,可使用 Jasypt 或自定义加密插件。

  3. 网络隔离:Nacos 服务部署在内网,限制外网访问。

  4. 权限控制:通过 namespace 隔离不同团队。

  5. 审计日志:记录配置变更操作人、时间。

15. Nacos 的高可用是如何保障的?

答:
从多个层面保障高可用:

  • 集群部署:至少 3 节点,避免单点故障。
  • 数据持久化:使用 MySQL 存储配置和服务信息,防止数据丢失。
  • Raft 协议:保证数据一致性,Leader 故障自动选举。
  • 健康检查:自动剔除异常节点。
  • 负载均衡:前端加 Nginx,实现请求分发。
  • 容错机制:客户端本地缓存配置,即使 Nacos 宕机也能使用旧配置启动。

16. Nacos vs Apollo 主要对比

特性NACOSAPOLLO
配置管理✅(更成熟)
服务发现✅(一体化)❌(需配合 Eureka/Zookeeper)
配置灰度发布❌(社区版)/ ✅(企业版)
多数据中心支持
权限体系基础(社区版)更完善(用户、项目、角色)
易用性简单轻量功能丰富但较重
社区活跃度高(Spring Cloud Alibaba 主推)
与 Spring Cloud 集成原生支持需额外集成

适用场景建议

  • 选 Nacos
    • 同时需要 服务发现 + 配置管理
    • 技术栈基于 Spring Cloud Alibaba
    • 希望轻量、快速部署
    • 不需要复杂的灰度发布或审计功能
  • 选 Apollo
    • 对配置管理要求高(如严格的发布流程、权限审计、灰度发布)
    • 已有成熟 Apollo 体系
    • 需要更强大的治理能力

🎯 总结:Nacos 面试重点

类别重点内容
基础使用配置接入、bootstrap.yml、@RefreshScope
架构设计Namespace/Group/Data ID、AP/CP 切换
原理机制长轮询、Raft、健康检查
高可用集群部署、MySQL 持久化
对比选型vs Eureka、vs Apollo、vs Consul
 评论