Skip to content

Commit 2d0d63f

Browse files
committed
docs:分布式配置中心开放阅读
1 parent 5a9a584 commit 2d0d63f

20 files changed

+327
-45
lines changed

docs/distributed-system/api-gateway.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
11
---
22
title: API网关基础知识总结
3-
description: API网关基础知识详解,涵盖网关核心功能、请求转发、安全认证、流量控制及常见网关选型对比。
43
category: 分布式
4+
description: API网关基础知识详解,涵盖网关核心功能(路由转发、身份认证、限流熔断、负载均衡)、工作原理及Zuul、Spring Cloud Gateway、Nginx等常见网关选型对比。
5+
tag:
6+
- API网关
7+
head:
8+
- - meta
9+
- name: keywords
10+
content: API网关,网关,微服务网关,Spring Cloud Gateway,Zuul,限流熔断,负载均衡,网关面试题
511
---
612

713
## 什么是网关?
Lines changed: 196 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,203 @@
11
---
2-
title: 分布式配置中心常见问题总结(付费)
3-
description: 分布式配置中心核心概念与面试题解析,涵盖Apollo、Nacos等主流配置中心原理与实践要点
2+
title: 分布式配置中心面试题总结
3+
description: 深入解析分布式配置中心核心原理与面试高频考点,涵盖 Apollo、Nacos、Spring Cloud Config 对比选型、配置推送机制(长轮询/gRPC)、灰度发布、高可用设计等知识点
44
category: 分布式
5+
keywords:
6+
- 配置中心
7+
head:
8+
- - meta
9+
- name: keywords
10+
content: 配置中心,分布式配置中心,Apollo,Nacos,Spring Cloud Config,配置中心面试题,灰度发布,长轮询
511
---
612

7-
**分布式配置中心** 相关的面试题为我的[知识星球](https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html)(点击链接即可查看详细介绍以及加入方法)专属内容,已经整理到了《Java 面试指北》中。
13+
## 为什么要用配置中心?
814

9-
![](https://oss.javaguide.cn/javamianshizhibei/distributed-system.png)
15+
微服务架构下,业务发展通常会导致服务数量增加,进而导致程序配置(服务地址、数据库参数、功能开关等)增多。传统配置文件方式存在以下问题:
16+
17+
- **无法动态更新**:配置放在代码库中,每次修改都需要重新发布新版本才能生效。
18+
- **安全性不足**:敏感配置(数据库密码、API Key)直接写在代码库中容易泄露。
19+
- **时效性差**:即使能修改配置文件,通常也需要重启服务才能生效。
20+
- **缺乏权限控制**:无法对配置的查看、修改、发布等操作进行细粒度权限管控。
21+
- **配置分散难管理**:多环境(开发/测试/生产)、多集群的配置分散在各处,难以统一维护。
22+
23+
此外,配置中心通常提供以下增强能力:
24+
25+
- **版本管理**:记录每次配置变更的修改人、修改时间、修改内容,支持一键回滚。
26+
- **灰度发布**:先将配置推送给部分实例验证,降低变更风险(Apollo、Nacos 1.1.0+ 支持)。
27+
28+
![view-release-history](https://oss.javaguide.cn/github/javaguide/config-center/view-release-history.png)
29+
30+
## 常见的配置中心有哪些?如何选择?
31+
32+
| 方案 | 状态 | 特点 |
33+
| ---------------------------------------------------------------------------------- | -------- | ----------------------------------- |
34+
| [Spring Cloud Config](https://cloud.spring.io/spring-cloud-config/reference/html/) | 活跃 | Spring 生态原生支持,基于 Git 存储 |
35+
| [Nacos](https://github.com/alibaba/nacos) | 活跃 | 阿里开源,配置中心 + 服务发现二合一 |
36+
| [Apollo](https://github.com/apolloconfig/apollo) | 活跃 | 携程开源,配置管理功能最完善 |
37+
| K8s ConfigMap | 活跃 | Kubernetes 原生方案 |
38+
| Disconf / Qconf | 停止维护 | 不建议使用 |
39+
40+
**选型建议**
41+
42+
- 只需配置中心 → **Apollo**(功能最完善)或 **Nacos**(上手更简单)
43+
- 需要配置中心 + 服务发现 → **Nacos**
44+
- Spring Cloud 体系且追求简单 → **Spring Cloud Config**
45+
- Kubernetes 环境 → **K8s ConfigMap 挂载 + 应用层文件监听**(由于 Kubelet 同步 Volume 存在 1~2 分钟延迟,需引入 inotify 或 Spring Cloud Kubernetes 实现热重载)
46+
47+
**Apollo vs Nacos vs Spring Cloud Config**
48+
49+
> **版本说明**:以下对比基于 Apollo 2.x、Nacos 2.x、Spring Cloud Config 3.x
50+
51+
| 功能点 | Apollo | Nacos | Spring Cloud Config |
52+
| ------------ | --------------------- | ------------------------------ | ------------------------------------ |
53+
| 配置界面 | 支持(功能完善) | 支持 | 无(通过 Git 操作) |
54+
| 配置实时生效 | 支持(长轮询,1s 内) | 支持(gRPC 长连接,1s 内) | 半实时(需触发 refresh 或 Bus 广播) |
55+
| 版本管理 | 原生支持 | 原生支持 | 依赖 Git |
56+
| 权限管理 | 支持(细粒度) | 支持 | 依赖 Git 平台 |
57+
| 灰度发布 | 支持(完善) | 支持(1.1.0+,基础) | 不支持 |
58+
| 配置回滚 | 支持 | 支持 | 依赖 Git |
59+
| 告警通知 | 支持 | 支持 | 不支持 |
60+
| 多语言 | 支持(Open API) | 支持(Open API) | 仅 Spring 应用 |
61+
| 多环境 | 支持 | 支持 | 需配合多 Git 仓库 |
62+
| 依赖组件 | MySQL + Eureka | 内置存储(Derby/MySQL)+ JRaft | Git + 可选消息队列 |
63+
64+
**深度对比**
65+
66+
1. **Apollo**:配置管理功能最完善(灰度发布、权限控制、审计日志),但部署复杂度较高。多环境(FAT/UAT/PROD)物理隔离场景下,需独立部署 Portal、Admin Service、Config Service 及独立数据库集群,运维门槛中等偏高
67+
2. **Nacos**:配置 + 注册中心二合一,部署简单(单机模式仅一个 Jar 包),但灰度等功能相对基础
68+
3. **Spring Cloud Config**:架构最简单(基于 Git),但实时性差,需要额外组件实现自动刷新
69+
70+
## 配置中心核心设计要点
71+
72+
设计或选型配置中心时,需关注以下能力:
73+
74+
### 1. 配置推送机制
75+
76+
| 模式 | 实时性 | 服务端压力 | 实现复杂度 | 适用场景 |
77+
| ---------- | --------------- | ---------------------------- | ---------- | ------------ |
78+
| **推模式** | 高(毫秒级) | 高(需维护连接) || 强实时性要求 |
79+
| **拉模式** | 低(秒~分钟级) | 高(无效轮询) || 配置变更极少 |
80+
| **长轮询** | 中高(1~30s) | 中等(海量连接时内存压力大) || **主流方案** |
81+
82+
> **推送机制说明**
83+
>
84+
> - **Apollo**:采用 HTTP 长轮询。客户端发起请求,服务端若有变更立即返回;无变更则挂起请求(默认 30s),期间一旦有变更立即响应。
85+
> - **Nacos 2.x**:采用 gRPC 长连接双向流。相比 1.x 的 HTTP 长轮询,gRPC 连接更轻量,配置变更可毫秒级主动 Push 至客户端。
86+
>
87+
> **注意**:长轮询虽然比短轮询节省 CPU 和网络开销,但当客户端规模达到十万级时,服务端需维持海量挂起的 HTTP 请求(依赖 Servlet AsyncContext),对内存和连接数上限仍有较大压力。
88+
89+
### 2. 必备功能清单
90+
91+
- **权限控制**:配置的查看、修改、发布需分级授权
92+
- **审计日志**:完整记录配置变更的操作人、时间、内容
93+
- **版本管理**:每次发布生成版本号,支持回滚到任意历史版本
94+
- **灰度发布**:配置先推送到部分实例,验证通过后全量发布
95+
- **多环境隔离**:开发、测试、生产环境配置独立管理
96+
- **高可用部署**:配置中心自身需要集群化部署,避免单点故障
97+
98+
## 以 Apollo 为例介绍配置中心的设计
99+
100+
### Apollo 介绍
101+
102+
根据 Apollo 官方介绍:
103+
104+
> [Apollo](https://github.com/ctripcorp/apollo)(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。
105+
>
106+
> 服务端基于 Spring Boot 和 Spring Cloud 开发,打包后可以直接运行,不需要额外安装 Tomcat 等应用容器。
107+
>
108+
> Java 客户端不依赖任何框架,能够运行于所有 Java 运行时环境,同时对 Spring/Spring Boot 环境也有较好的支持。
109+
110+
Apollo 核心特性:
111+
112+
- **配置修改实时生效(热发布)**:基于长轮询,1s 内即可接收到最新配置
113+
- **灰度发布**:配置只推给部分应用,降低变更风险
114+
- **部署简单**:单环境仅依赖 MySQL(Eureka 可使用内置模式),但多环境隔离部署复杂度较高
115+
- **跨语言**:提供了 HTTP 接口,不限制编程语言
116+
117+
关于如何使用 Apollo 可以查看 [Apollo 官方使用指南](https://www.apolloconfig.com/#/zh/)
118+
119+
### Apollo 架构解析
120+
121+
官方给出的 Apollo 基础模型:
122+
123+
![](https://img-blog.csdnimg.cn/a75ccb863e4a401d947c87bb14af7dc3.png)
124+
125+
1. 用户在 Apollo 配置中心修改/发布配置
126+
2. Apollo 配置中心通知应用配置已更改
127+
3. 应用访问 Apollo 配置中心获取最新配置
128+
129+
官方架构图:
130+
131+
![](https://img-blog.csdnimg.cn/79c7445f9dbc45adb45699d40ef50f44.png)
132+
133+
### 组件说明
134+
135+
| 组件 | 作用 | 默认端口 |
136+
| ------------------ | --------------------------------------------- | -------- |
137+
| **Portal** | Web 管理界面,提供配置的可视化管理 | 8070 |
138+
| **Client** | 客户端 SDK,提供配置获取和变更监听能力 | - |
139+
| **Meta Server** | Eureka 的 HTTP 代理,与 Config Service 同进程 | 8080 |
140+
| **Config Service** | 提供配置读取和推送接口,供 Client 调用 | 8080 |
141+
| **Admin Service** | 提供配置管理接口,供 Portal 调用 | 8090 |
142+
| **Eureka** | 服务注册中心,Config/Admin Service 注册于此 | 8761 |
143+
| **MySQL** | 存储配置数据和元数据 | 3306 |
144+
145+
### 核心流程
146+
147+
**Client 端(获取配置)**
148+
149+
1. Client 启动时访问 Meta Server 获取 Config Service 地址列表
150+
2. Client 本地缓存服务地址(Eureka 故障时仍可用)
151+
3. Client 发起长轮询请求获取配置
152+
4. Config Service 检测到配置变更后立即响应
153+
5. Client 更新内存缓存、触发变更回调,并**异步持久化到本地文件系统**(默认位于 `/opt/data/``/opt/logs/`
154+
155+
> **灾备机制**:即使 Config Service 全部宕机且应用重启,Client 仍可从本地磁盘读取缓存的配置完成启动,确保应用可用性不强依赖配置中心。
156+
157+
**Portal 端(发布配置)**
158+
159+
1. 用户在 Portal 修改配置并点击发布
160+
2. Portal 调用 Admin Service 发布接口
161+
3. Admin Service 将配置写入 MySQL 并生成发布版本
162+
4. Config Service 通过长轮询通知 Client 配置已变更
163+
5. Client 重新拉取最新配置
164+
165+
### Client 使用示例
166+
167+
获取配置:
168+
169+
```java
170+
Config config = ConfigService.getAppConfig();
171+
String someKey = "someKeyFromDefaultNamespace";
172+
String someDefaultValue = "someDefaultValueForTheKey";
173+
String value = config.getProperty(someKey, someDefaultValue);
174+
```
175+
176+
监听配置变化:
177+
178+
```java
179+
Config config = ConfigService.getAppConfig();
180+
config.addChangeListener(new ConfigChangeListener() {
181+
@Override
182+
public void onChange(ConfigChangeEvent changeEvent) {
183+
// 处理配置变更
184+
for (String key : changeEvent.changedKeys()) {
185+
ConfigChange change = changeEvent.getChange(key);
186+
System.out.println(String.format(
187+
"Key: %s, Old: %s, New: %s",
188+
key, change.getOldValue(), change.getNewValue()));
189+
}
190+
}
191+
});
192+
```
193+
194+
## 参考
195+
196+
- [Nacos 官方文档](https://nacos.io/zh-cn/docs/what-is-nacos.html)
197+
- [Apollo 官方文档](https://www.apolloconfig.com/#/zh/README)
198+
- [Spring Cloud Config 官方文档](https://cloud.spring.io/spring-cloud-config/reference/html/)
199+
- [Nacos 1.1.0 发布,支持灰度配置](https://nacos.io/zh-cn/blog/nacos%201.1.0.html)
200+
- [Apollo 在有赞的实践](https://mp.weixin.qq.com/s/Ge14UeY9Gm2Hrk--E47eJQ)
201+
- [微服务配置中心选型比较](https://www.itshangxp.com/spring-cloud/spring-cloud-config-center/)
10202

11203
<!-- @include: @planet.snippet.md -->

docs/distributed-system/distributed-id-design.md

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
11
---
2-
title: 分布式ID设计指南
3-
description: 分布式ID设计实战指南,结合订单系统、优惠券等业务场景讲解分布式ID的设计要点与技术选型。
2+
title: 分布式ID设计实战指南
43
category: 分布式
4+
description: 分布式ID设计实战指南,结合订单系统、一码付、优惠券等业务场景讲解分布式ID的设计要点、技术选型及不同场景下的ID生成策略。
5+
tag:
6+
- 分布式ID
7+
head:
8+
- - meta
9+
- name: keywords
10+
content: 分布式ID,分布式ID设计,订单ID生成,优惠券ID,一码付,ID生成策略,分布式系统设计
511
---
612

713
::: tip

docs/distributed-system/distributed-id.md

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
11
---
2-
title: 分布式ID介绍&实现方案总结
3-
description: 分布式ID生成方案详解,涵盖UUID、数据库自增、号段模式、雪花算法等主流方案的原理与优缺点对比。
2+
title: 分布式ID生成方案总结
43
category: 分布式
4+
description: 分布式ID生成方案详解,涵盖UUID、数据库自增ID、号段模式、雪花算法(Snowflake)、Leaf等主流方案的原理、优缺点对比及适用场景分析。
5+
tag:
6+
- 分布式ID
7+
head:
8+
- - meta
9+
- name: keywords
10+
content: 分布式ID,雪花算法,Snowflake,UUID,号段模式,Leaf,分布式ID生成,全局唯一ID,分布式ID面试题
511
---
612

713
<!-- @include: @small-advertisement.snippet.md -->

docs/distributed-system/distributed-lock-implementations.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
11
---
22
title: 分布式锁常见实现方案总结
3-
description: 分布式锁常见实现方案详解,包括基于Redis、ZooKeeper实现分布式锁的原理、优缺点及最佳实践。
43
category: 分布式
4+
description: 分布式锁常见实现方案详解,包括基于Redis SETNX、Redlock、ZooKeeper临时节点实现分布式锁的原理、优缺点对比及最佳实践。
5+
tag:
6+
- 分布式锁
7+
head:
8+
- - meta
9+
- name: keywords
10+
content: 分布式锁,Redis分布式锁,ZooKeeper分布式锁,SETNX,Redlock,分布式锁实现,分布式锁面试题
511
---
612

713
<!-- @include: @small-advertisement.snippet.md -->

docs/distributed-system/distributed-lock.md

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
11
---
2-
title: 分布式锁介绍
3-
description: 分布式锁基础概念详解,讲解为什么需要分布式锁、分布式锁的核心特性及常见应用场景分析。
2+
title: 分布式锁入门介绍
43
category: 分布式
4+
description: 分布式锁基础概念详解,讲解为什么需要分布式锁、分布式锁的核心特性(互斥性、防死锁、可重入)、常见应用场景(秒杀、库存扣减)分析。
5+
tag:
6+
- 分布式锁
7+
head:
8+
- - meta
9+
- name: keywords
10+
content: 分布式锁,分布式锁介绍,为什么需要分布式锁,分布式锁应用场景,秒杀超卖,分布式锁面试题
511
---
612

713
<!-- @include: @small-advertisement.snippet.md -->

docs/distributed-system/distributed-process-coordination/zookeeper/zookeeper-in-action.md

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
---
2-
title: ZooKeeper 实战
3-
description: ZooKeeper实战教程,涵盖Docker安装部署、常用命令操作及Curator客户端的使用方法详解。
2+
title: ZooKeeper实战教程
43
category: 分布式
4+
description: ZooKeeper实战教程,涵盖Docker安装部署、zkCli常用命令操作(create/get/set/delete/ls)、四字命令(stat/srvr/dump)及Curator Java客户端的CRUD操作与分布式锁实现。
55
tag:
66
- ZooKeeper
7+
head:
8+
- - meta
9+
- name: keywords
10+
content: ZooKeeper,ZooKeeper安装,ZooKeeper命令,Curator,zkCli,分布式锁,Docker部署,四字命令,ZooKeeper实战
711
---
812

913
<!-- @include: @small-advertisement.snippet.md -->

docs/distributed-system/distributed-process-coordination/zookeeper/zookeeper-intro.md

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
---
2-
title: ZooKeeper相关概念总结(入门)
3-
description: ZooKeeper入门指南,讲解ZooKeeper核心概念、数据模型、Watcher机制及作为注册中心和分布式锁的应用。
2+
title: ZooKeeper入门指南
43
category: 分布式
4+
description: ZooKeeper入门指南,讲解ZooKeeper核心概念、数据模型(ZNode/节点类型)、Watcher监听机制、ACL权限控制及作为注册中心、分布式锁、配置中心的典型应用场景。
55
tag:
66
- ZooKeeper
7+
head:
8+
- - meta
9+
- name: keywords
10+
content: ZooKeeper,ZooKeeper入门,ZNode,Watcher,分布式锁,注册中心,分布式协调,ZAB,临时节点,持久节点
711
---
812

913
<!-- @include: @small-advertisement.snippet.md -->

docs/distributed-system/distributed-process-coordination/zookeeper/zookeeper-plus.md

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
---
2-
title: ZooKeeper相关概念总结(进阶)
3-
description: ZooKeeper进阶详解,深入讲解ZAB协议、Leader选举机制、集群部署及与Eureka等注册中心的对比。
2+
title: ZooKeeper进阶详解
43
category: 分布式
4+
description: ZooKeeper进阶详解,深入讲解ZAB协议原理、Leader选举机制(FastLeaderElection)、集群部署策略(奇数节点)、会话管理及与Eureka、Nacos等注册中心的对比分析。
55
tag:
66
- ZooKeeper
7+
head:
8+
- - meta
9+
- name: keywords
10+
content: ZooKeeper,ZAB协议,Leader选举,集群部署,会话管理,Eureka对比,Nacos对比,分布式协调,CP系统
711
---
812

913
> [FrancisQ](https://juejin.im/user/5c33853851882525ea106810) 投稿。

docs/distributed-system/distributed-transaction.md

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
11
---
2-
title: 分布式事务常见解决方案总结(付费)
3-
description: 分布式事务常见解决方案详解,包括2PC、3PC、TCC、Saga、本地消息表等方案的原理与适用场景分析。
2+
title: 分布式事务解决方案总结
43
category: 分布式
4+
description: 分布式事务常见解决方案详解,包括2PC两阶段提交、3PC三阶段提交、TCC补偿事务、Saga编排模式、本地消息表、事务消息等方案的原理、优缺点及适用场景分析。
5+
tag:
6+
- 分布式事务
7+
head:
8+
- - meta
9+
- name: keywords
10+
content: 分布式事务,2PC,TCC,Saga,本地消息表,事务消息,分布式系统,最终一致性,补偿事务,分布式事务面试题
511
---
612

713
**分布式事务** 相关的面试题为我的[知识星球](https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html)(点击链接即可查看详细介绍以及加入方法)专属内容,已经整理到了《Java 面试指北》中。

0 commit comments

Comments
 (0)