vault backup: 2026-05-15 16:26:14

This commit is contained in:
hhs
2026-05-15 16:26:14 +08:00
parent 1ef38fe7e6
commit 0e67673d7a
45 changed files with 5165 additions and 788 deletions
+173
View File
@@ -0,0 +1,173 @@
---
tags: [microservice, config-management, nacos, apollo, spring-cloud-config]
create time: 2026-05-05
---
# 配置管理
## 概述
当服务实例数以百计时,手动管理配置是不可想象的。配置中心提供 **集中化、动态化、版本化** 的配置管理能力。
> [!question] 引出配置中心的必要性
> 假设你的 50 个服务实例都要连同一个数据库。现在需要把数据库密码从 `password1` 改为 `password2`,你会怎么改?登录每台机器改配置文件?滚动重启所有 Pod?还是……有更好的办法?
## 核心价值
```mermaid
flowchart LR
Dev["开发/运维"] --> CC[(配置中心)]
CC -->|热更新推送| S1[Service A]
CC -->|热更新推送| S2[Service B]
CC -->|热更新推送| S3[Service C]
CC -.->|版本管理| V1[v1.0 历史配置]
CC -.->|版本管理| V2[v1.1 当前配置]
```
| 能力 | 说明 |
|------|------|
| **动态刷新** | 修改配置后立即生效,无需重启 |
| **环境隔离** | dev / test / prod 配置分离 |
| **版本管理与回滚** | 每次变更有迹可循,一键回滚 |
| **权限控制** | 敏感配置(密钥、Token)按角色隔离 |
| **配置审计** | 记录谁在什么时候改了什么 |
## 配置分层模型
```mermaid
graph TB
subgraph "配置优先级(低 → 高)"
Base["Base 基线配置<br/>各项目共享的默认值"]
App["应用级配置<br/>每个服务的专属配置"]
Env["环境级配置<br/>dev/test/prod 差异"]
Instance["实例级配置<br/>单节点调优参数"]
end
style Base fill:#e3f2fd
style App fill:#fff3e0
style Env fill:#fce4ec
style Instance fill:#e8f5e9
```
**典型配置项分层**:
| 层级 | 示例 | 修改频率 |
|------|------|---------|
| 基线配置 | Redis 集群地址、公共超时时间 | 极低 |
| 应用配置 | 线程池大小、日志级别 | 低 |
| 环境配置 | DB 连接串、Feature Flag | 中 |
| 实例配置 | 单机限流阈值、调试开关 | 高 |
## Nacos Config 示例
```go
// 动态监听配置变更
configClient, _ := clients.NewConfigClient(value_map.NewValueMap(map[string]any{
"serverConfig": sc,
}))
content, _ := configClient.GetConfig(config_param.GetConfigParam{
DataId: "order-service.yaml",
Group: "DEFAULT_GROUP",
})
// 监听配置变化——Nacos 推送更新回调
configClient.ListenChange(config_param.ListenChangeParam{
DataId: "order-service.yaml",
Group: "DEFAULT_GROUP",
Callback: func(content string) {
fmt.Println("配置更新了:", content)
// 重新加载配置...
ReloadConfig(content)
},
})
```
### 配置文件的命名规范
推荐格式:`{service-name}.{environment}.yaml`
| 服务名 | 环境 | Data ID |
|--------|------|---------|
| order-service | dev | `order-service.dev.yaml` |
| order-service | prod | `order-service.prod.yaml` |
| user-service | prod | `user-service.prod.yaml` |
## Apollo vs Nacos Config 对比
| 维度 | Apollo (携程) | Nacos Config (阿里) | Spring Cloud Config |
|------|--------------|---------------------|--------------------|
| **界面体验** | Web UI 完善,操作直观 | 较好 | 需自建 |
| **发布流程** | 支持审核、灰度、回滚 | 基础发布+回滚 | 依赖 Git 工作流 |
| **配置粒度** | 应用/Cluster/Namespace 多维 | Service/Group | File-based |
| **性能** | AP 模型,延迟 < 1s | AP 模型,延迟 < 1s | 读取 Git,延迟稍高 |
| **生态集成** | 适合 Java/Spring 体系 | Java + Go + Python 等 | 仅 Spring 生态 |
| **适用场景** | 大型企业,多团队协同 | 中小团队快速落地 | 纯 Spring 项目 |
## K8s ConfigMap & Secret
纯 K8s 环境内的原生方案:
```yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: order-service-config
data:
application.yaml: |
server:
port: 8080
datasource:
url: jdbc:mysql://db-host:3306/orders
username: ${DB_USERNAME}
password: ${DB_PASSWORD}
---
apiVersion: v1
kind: Secret
metadata:
name: order-service-secrets
type: Opaque
stringData:
DB_USERNAME: "app_user"
DB_PASSWORD: "s3cret_p@ss"
```
注入到容器:
```yaml
envFrom:
- configMapRef:
name: order-service-config
- secretRef:
name: order-service-secrets
```
> [!warning] K8s 原生方案的局限
> - 修改 ConfigMap 后 Pod 不会自动重载配置(需配合 Sidecar 或手动触发 reload)
> - 没有版本管理和灰度发布能力
> - **建议**:简单项目用 K8s ConfigMap,复杂场景上 Apollo/Nacos
## 敏感信息处理
> [!danger] 安全红线
> **永远不要**在代码仓库中硬编码密码、API Key、私钥等敏感信息。
```mermaid
flowchart LR
Dev["开发者本地"] -->|"K8s Secret / Vault"| Store["加密存储"]
Store -->|"运行时解密"| Runtime["运行时的环境变量"]
Runtime --> App["应用程序"]
Audit["审计系统"] -.->|"只读访问"| Store
```
**推荐方案**:
- **K8s Secret** — 小型集群内使用(base64 编码,非加密,配合 EncryptionConfiguration 增强)
- **HashiCorp Vault** — 企业级密钥管理,动态秘钥、自动轮换
- **云厂商 KV 服务** — AWS Secrets Manager / 阿里云 KMS / 腾讯云 SecretManager
## 关联笔记
- [[02-服务治理/04-服务发现]] — Nacos 同时提供服务发现和配置管理
- [[05-部署运维/02-Kubernetes]] — ConfigMap/Secret 是 K8s 的配置注入方式