第一章:Go语言实战项目代码库总览
本章聚焦于一个面向生产环境的Go语言微服务代码库——go-microservice-kit,它并非教学示例,而是从真实电商中台系统提炼出的可复用工程骨架。该代码库采用分层架构设计,涵盖身份认证、订单管理、库存同步与事件驱动四大核心模块,并严格遵循Go官方工程规范(如cmd/、internal/、pkg/、api/目录划分)。
项目结构概览
go-microservice-kit/
├── cmd/ # 各服务入口(order-svc、auth-svc等)
├── internal/ # 业务逻辑与领域模型(不可被外部导入)
│ ├── auth/ # JWT鉴权、用户上下文封装
│ ├── order/ # 订单状态机、Saga事务协调器
│ └── event/ # 基于NATS JetStream的事件发布/订阅抽象
├── pkg/ # 可复用工具包(日志、配置、数据库连接池)
├── api/ # Protobuf定义与gRPC服务接口(含OpenAPI生成支持)
└── docker-compose.yml # 集成MySQL、Redis、NATS、Jaeger的一键部署配置
快速启动指南
执行以下命令即可本地运行完整链路(需已安装Docker与Go 1.22+):
# 1. 克隆并初始化子模块(含proto生成工具)
git clone https://github.com/example/go-microservice-kit.git
cd go-microservice-kit && git submodule update --init
# 2. 启动依赖服务(MySQL、Redis、NATS)
docker-compose up -d infra
# 3. 生成gRPC代码并运行认证服务
make proto-generate # 调用protoc生成.pb.go文件
go run cmd/auth-svc/main.go
关键技术选型对照表
| 功能域 | 技术组件 | 选用理由 |
|---|---|---|
| 服务发现 | HashiCorp Consul | 原生支持健康检查与KV配置中心 |
| 消息中间件 | NATS JetStream | 轻量、低延迟、内置At-Least-Once语义 |
| ORM | sqlc + pgx/v5 | 编译期SQL类型安全,零反射开销 |
| 配置管理 | koanf + env provider | 支持多源合并(YAML+环境变量+Consul KV) |
所有服务均通过/healthz端点暴露标准化健康检查,并集成OpenTelemetry自动采集trace与metrics,无需修改业务代码即可接入Prometheus与Grafana监控栈。
第二章:高并发微服务核心架构设计
2.1 Go协程与通道模型在微服务中的工程化实践
高并发请求处理模式
微服务常面临突发流量,Go协程轻量级特性(≈2KB栈空间)使其天然适配高并发场景。配合无锁通道(channel),可构建解耦的生产者-消费者流水线。
数据同步机制
以下为订单服务中库存校验与扣减的典型协程协作模式:
// 使用带缓冲通道控制并发粒度,避免goroutine爆炸
func processOrder(orderID string, ch <-chan bool, done chan<- error) {
select {
case <-ch: // 获取令牌,限流关键
if err := deductStock(orderID); err != nil {
done <- err
return
}
done <- nil
case <-time.After(3 * time.Second): // 超时保护
done <- fmt.Errorf("timeout waiting for stock lock")
}
}
逻辑分析:ch 作为令牌桶通道(容量=10),限制并发扣减数;done 用于结果回传;超时机制防止协程永久阻塞。参数 ch 和 done 均为只读/只写通道,强化类型安全与语义约束。
协程生命周期管理对比
| 场景 | 手动 go f() |
errgroup.Group |
context.WithTimeout |
|---|---|---|---|
| 错误聚合 | ❌ | ✅ | ❌ |
| 统一取消 | ❌ | ✅ | ✅ |
| 资源泄漏防护 | 弱 | 中 | 强 |
graph TD
A[HTTP请求] --> B[启动goroutine]
B --> C{通道协调}
C --> D[库存服务调用]
C --> E[日志服务异步写入]
D & E --> F[聚合响应]
2.2 基于context的请求生命周期管理与超时控制
Go 的 context 包为请求级生命周期控制提供了统一抽象,使超时、取消与值传递天然耦合。
超时控制的核心模式
使用 context.WithTimeout 创建带截止时间的子 context,HTTP handler 中典型用法如下:
ctx, cancel := context.WithTimeout(r.Context(), 5*time.Second)
defer cancel() // 防止 goroutine 泄漏
逻辑分析:
r.Context()继承自 HTTP server,WithTimeout返回新 context 和cancel函数;defer cancel()确保作用域退出时释放资源。若 5 秒内未完成,ctx.Done()将被关闭,下游 I/O(如http.Client.Do、数据库查询)可据此中断。
关键超时参数对比
| 参数 | 类型 | 说明 |
|---|---|---|
Context.Deadline |
time.Time |
可读取的绝对截止时刻 |
Context.Err() |
error |
返回 context.DeadlineExceeded 或 context.Canceled |
http.Client.Timeout |
time.Duration |
全局连接+读写超时,不感知请求上下文 |
生命周期传播流程
graph TD
A[HTTP Request] --> B[r.Context]
B --> C[context.WithTimeout]
C --> D[DB Query / RPC Call]
D --> E{Done?}
E -->|Yes| F[return ctx.Err]
E -->|No| G[continue processing]
2.3 高性能HTTP/GRPC双协议服务封装与选型策略
现代微服务架构常需兼顾 RESTful 生态兼容性与 gRPC 的高性能,双协议封装成为关键能力。
协议封装设计原则
- 统一业务逻辑层,隔离传输适配层
- 共享序列化模型(如 Protobuf),避免重复定义
- 支持运行时协议自动路由(基于
Content-Type或:scheme)
核心封装代码示例
// 同一 ServiceImpl 同时注册 HTTP 和 gRPC 端点
func RegisterHandlers(srv *MyService, mux *http.ServeMux, grpcSrv *grpc.Server) {
// HTTP:通过 grpc-gateway 生成反向代理
gwMux := runtime.NewServeMux()
_ = pb.RegisterMyServiceHandlerServer(context.Background(), gwMux, srv)
mux.Handle("/v1/", gwMux) // REST 路由前缀
// gRPC:原生注册
pb.RegisterMyServiceServer(grpcSrv, srv)
}
该封装复用 srv 实例,gwMux 将 /v1/* 的 JSON 请求自动解码并转发至 gRPC 接口;runtime.NewServeMux 内置 Protobuf-to-JSON 映射规则,pb.Register*HandlerServer 自动生成符合 OpenAPI 语义的 HTTP 路由。
协议选型对比
| 维度 | HTTP/1.1 + JSON | gRPC/HTTP2 + Protobuf |
|---|---|---|
| 吞吐量 | 中等 | 高(二进制+流控) |
| 客户端生态 | 广泛(浏览器、curl) | 需 SDK(但多语言支持完备) |
| 调试便利性 | 高(可直读) | 依赖 grpcurl 或工具链 |
graph TD
A[客户端请求] --> B{请求头判断}
B -->|Content-Type: application/json| C[grpc-gateway HTTP 转发]
B -->|:scheme: https + binary| D[gRPC 原生处理]
C --> E[统一 ServiceImpl]
D --> E
2.4 分布式限流、熔断与重试机制的Go原生实现
限流:基于令牌桶的并发安全实现
type TokenBucket struct {
capacity int64
tokens int64
rate float64 // tokens/sec
lastRefill time.Time
mu sync.RWMutex
}
func (tb *TokenBucket) Allow() bool {
tb.mu.Lock()
defer tb.mu.Unlock()
now := time.Now()
elapsed := now.Sub(tb.lastRefill).Seconds()
newTokens := int64(elapsed * tb.rate)
tb.tokens = min(tb.capacity, tb.tokens+newTokens)
tb.lastRefill = now
if tb.tokens > 0 {
tb.tokens--
return true
}
return false
}
逻辑分析:Allow() 在每次调用时按时间比例补充令牌,避免全局锁竞争;min() 防止令牌溢出;sync.RWMutex 保障高并发读写安全。关键参数:capacity 控制突发流量上限,rate 决定平滑吞吐能力。
熔断器状态机(简明版)
| 状态 | 触发条件 | 行为 |
|---|---|---|
| Closed | 连续失败 | 正常转发请求 |
| Open | 失败率超阈值且持续超时 | 直接返回错误,不发起调用 |
| Half-Open | Open 状态下超时窗口到期 | 允许单个试探请求 |
重试策略组合
- 指数退避:
time.Sleep(time.Second * time.Duration(1<<attempt)) - 上下文取消:
ctx, cancel := context.WithTimeout(parentCtx, 5*time.Second) - 可重试错误判定:仅对
net.ErrTimeout、io.EOF等临时性错误重试
graph TD
A[请求发起] --> B{是否超时/网络错误?}
B -->|是| C[指数退避等待]
C --> D[重试计数 < 3?]
D -->|是| A
D -->|否| E[返回最终错误]
B -->|否| F[解析响应]
2.5 微服务间异步通信:基于Redis Stream与NATS的事件驱动架构
在高吞吐、低耦合场景下,纯HTTP同步调用易成瓶颈。Redis Stream 提供持久化、可回溯的有序消息队列;NATS 则以轻量、高性能见长,支持 JetStream 持久化扩展。
选型对比关键维度
| 特性 | Redis Stream | NATS JetStream |
|---|---|---|
| 消息保留策略 | 时间/长度双维度 | 基于大小或时间 |
| 消费者组语义 | 原生支持(XGROUP) |
Consumer 显式声明 |
| 至少一次投递 | ✅(ACK + Pending) | ✅(Ack Policy) |
Redis Stream 生产示例(Go)
// 使用 redis-go 客户端写入订单创建事件
streamID, err := rdb.XAdd(ctx, &redis.XAddArgs{
Stream: "events:order",
Values: map[string]interface{}{
"type": "OrderCreated",
"order_id": "ORD-7890",
"timestamp": time.Now().UnixMilli(),
},
}).Result()
逻辑分析:XAdd 自动分配全局唯一 streamID(毫秒+序号),Values 为字符串键值对,所有字段序列化为字符串存储;streamID 可用于幂等校验与断点续读。
事件分发拓扑(Mermaid)
graph TD
A[Order Service] -->|XADD| B[(Redis Stream)]
B --> C{Consumer Group}
C --> D[Inventory Service]
C --> E[Notification Service]
B -->|NATS Bridge| F[NATS JetStream]
F --> G[Analytics Service]
第三章:可商用服务模板的关键组件实现
3.1 统一配置中心与热加载机制(支持Viper+Consul+Env)
统一配置中心需兼顾本地开发灵活性、服务端集中管控与运行时动态响应能力。核心采用 Viper 作为配置抽象层,Consul 提供分布式键值存储与监听能力,Env 变量实现环境差异化覆盖。
配置优先级策略
Viper 默认遵循以下覆盖顺序(由低到高):
- 默认值
- Consul KV(
/config/service-name/路径) - 环境变量(
APP_前缀自动映射) - 命令行参数
Consul 监听与热加载流程
// 初始化 Consul watcher 并注册回调
watcher := &consulapi.KVPair{Key: "config/webapp/"}
_, _, err := client.KV.List(watcher.Key, &consulapi.QueryOptions{
WaitTime: 5 * time.Minute,
RequireConsistent: true,
})
// 触发 Viper 重载:viper.AddConfigPath(...) → viper.ReadInConfig() → viper.WatchRemoteConfig()
该代码启动长轮询监听 Consul 中指定前缀的配置变更;一旦 KV 更新,触发 viper.WatchRemoteConfig() 的回调函数,自动解析并合并新配置,无需重启进程。
支持的配置源对比
| 源类型 | 实时性 | 安全性 | 适用场景 |
|---|---|---|---|
| Consul KV | 秒级 | TLS + ACL | 生产环境动态调参 |
| 环境变量 | 启动时 | 依赖宿主隔离 | CI/CD 或容器化部署 |
| 本地文件 | 静态 | 文件权限控制 | 本地调试与单元测试 |
graph TD
A[应用启动] --> B[初始化Viper]
B --> C[加载默认值]
C --> D[拉取Consul配置]
D --> E[注入环境变量]
E --> F[启动WatchRemoteConfig]
F --> G[Consul事件通知]
G --> H[自动Reload & Notify]
3.2 结构化日志与分布式链路追踪(Zap+OpenTelemetry集成)
现代微服务架构中,日志与追踪需协同工作:Zap 提供高性能结构化日志输出,OpenTelemetry 负责跨服务链路采集,二者通过 context.Context 共享 trace ID。
日志与追踪上下文绑定
import (
"go.uber.org/zap"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/trace"
)
func logWithTrace(ctx context.Context, logger *zap.Logger, msg string) {
span := trace.SpanFromContext(ctx)
logger.Info(msg,
zap.String("trace_id", span.SpanContext().TraceID().String()),
zap.String("span_id", span.SpanContext().SpanID().String()),
zap.Bool("is_sampled", span.SpanContext().IsSampled()),
)
}
该函数将当前 span 的核心标识注入 Zap 日志字段,确保日志可被 Jaeger 或 Grafana Tempo 关联检索。IsSampled() 辅助判断采样状态,避免误判丢失链路。
集成关键配置项对比
| 组件 | 推荐配置 | 作用说明 |
|---|---|---|
| Zap | AddCaller(), AddStackSkip() |
提升日志可调试性 |
| OpenTelemetry | WithSampler(TraceIDRatioBased(0.1)) |
控制 10% 请求采样率,平衡性能与可观测性 |
数据流向示意
graph TD
A[HTTP Handler] --> B[Start Span]
B --> C[Inject SpanContext into Context]
C --> D[Log with Zap + trace fields]
D --> E[Export logs & spans to OTLP endpoint]
3.3 健康检查、指标暴露与Prometheus可观测性落地
健康检查的双模式设计
应用需同时支持 Liveness(存活)与 Readiness(就绪)探针:
# Kubernetes pod spec 中的探针配置
livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /readyz
port: 8080
initialDelaySeconds: 5
periodSeconds: 5
/healthz 判断进程是否僵死,失败触发重启;/readyz 检查依赖(如DB连接、缓存)是否就绪,失败则从Service端点摘除。initialDelaySeconds 避免启动风暴,periodSeconds 控制探测频次。
Prometheus指标暴露规范
应用需以 /metrics 端点暴露符合 OpenMetrics 标准的文本格式指标:
| 指标类型 | 示例 | 语义 |
|---|---|---|
counter |
http_requests_total{method="GET",status="200"} |
累计请求数,单调递增 |
gauge |
process_cpu_seconds_total |
当前瞬时值(如内存使用量) |
histogram |
http_request_duration_seconds_bucket |
请求延迟分布 |
自动化采集链路
graph TD
A[应用 /metrics] -->|HTTP pull| B[Prometheus Server]
B --> C[TSDB 存储]
C --> D[Grafana 可视化]
C --> E[Alertmanager 告警]
关键参数 scrape_interval: 15s 平衡时效性与负载,relabel_configs 实现标签标准化(如添加 env="prod")。
第四章:CI/CD全链路自动化交付体系
4.1 GitHub Actions驱动的多环境构建与语义化版本发布
自动化构建流程设计
通过 .github/workflows/ci-cd.yml 统一编排开发、预发、生产三环境构建:
on:
push:
branches: [main, develop, release/*]
tags: ["v[0-9]+.[0-9]+.[0-9]+*"] # 语义化标签触发发布
该配置使 v1.2.0 标签推送自动触发发布流水线,release/* 分支支持灰度验证。
环境差异化构建策略
| 环境 | 构建参数 | 发布目标 |
|---|---|---|
| develop | --config dev |
Docker Registry(dev) |
| staging | --config staging |
Kubernetes(staging) |
| production | --config prod --minify |
CDN + Helm Chart |
版本生成与校验逻辑
# 提取语义化版本并校验格式
VERSION=$(git describe --tags --abbrev=0 2>/dev/null || echo "v0.0.0")
if ! [[ $VERSION =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
echo "Invalid semantic version: $VERSION" && exit 1
fi
脚本确保仅接受符合 SemVer 2.0 的 vX.Y.Z 格式,避免非法版本污染制品仓库。
graph TD
A[Git Tag Push] --> B{Tag Match v\\d+.\\d+.\\d+?}
B -->|Yes| C[Build & Test]
C --> D[Generate Changelog]
D --> E[Push to Package Registry]
4.2 Docker镜像安全扫描与多阶段构建最佳实践
安全扫描:Trivy集成CI流水线
在CI中嵌入trivy image --severity HIGH,CRITICAL myapp:latest可阻断高危镜像发布。--severity限定扫描等级,避免噪声干扰;--quiet配合|| exit 1实现失败熔断。
多阶段构建精简镜像
# 构建阶段:含完整工具链
FROM golang:1.22-alpine AS builder
WORKDIR /app
COPY go.mod . && go mod download
COPY . .
RUN CGO_ENABLED=0 go build -a -o /bin/app .
# 运行阶段:仅含二进制与必要依赖
FROM alpine:3.19
RUN apk add --no-cache ca-certificates
COPY --from=builder /bin/app /usr/local/bin/app
CMD ["app"]
逻辑分析:--from=builder精准复制产物,剔除编译器、源码、包缓存;最终镜像体积缩减约85%,攻击面显著收窄。
扫描与构建协同策略
| 阶段 | 工具 | 关键动作 |
|---|---|---|
| 构建后 | Trivy | 扫描builder阶段残留漏洞 |
| 推送前 | Syft+Grype | 生成SBOM并比对已知CVE数据库 |
graph TD
A[源码提交] --> B[多阶段构建]
B --> C[Trivy扫描运行镜像]
C --> D{无HIGH/CRITICAL?}
D -->|是| E[推送至Registry]
D -->|否| F[中断流水线]
4.3 Kubernetes Helm Chart标准化封装与GitOps部署流水线
Helm Chart结构规范化
遵循 charts/<app>/ 目录约定,强制包含 Chart.yaml、values.yaml、templates/ 和 schema.json。values.yaml 中分离环境变量(如 env: production)与配置参数(如 replicaCount: 3),提升复用性。
GitOps流水线核心组件
- Argo CD 监控 Git 仓库中
charts/目录的 SHA 变更 - Helm lint + kubeval 验证在 CI 阶段执行
- 每次 commit 触发
helm template --validate渲染校验
示例:CI阶段Helm验证脚本
# .github/workflows/helm-validate.yml
- name: Validate Helm Chart
run: |
helm lint charts/myapp/ --strict # 检查语法、schema合规性
helm template myapp charts/myapp/ \
--values charts/myapp/values.production.yaml \
--validate # 渲染并提交K8s API Server校验
--validate 调用集群API进行Dry-run,确保CRD、RBAC等资源语义正确;--values 指向环境特化配置,实现“一套Chart,多环境部署”。
Helm与GitOps协同流程
graph TD
A[Git Push to main] --> B[CI:Helm lint & template --validate]
B --> C{Valid?}
C -->|Yes| D[Argo CD detects diff]
C -->|No| E[Fail CI]
D --> F[Sync to Cluster via declarative apply]
| 组件 | 职责 | 审计点 |
|---|---|---|
Chart.yaml |
元数据、版本、依赖声明 | apiVersion: v2 强制 |
schema.json |
values.yaml 结构约束 | OpenAPI v3 校验规则 |
templates/ |
Go模板+Kustomize兼容层 | 禁止硬编码namespace |
4.4 自动化测试矩阵:单元测试、集成测试与混沌工程注入
现代高可用系统需在不同抽象层级验证韧性。单元测试聚焦单个函数或方法,确保逻辑正确性;集成测试验证模块间契约与数据流;混沌工程则主动注入故障,检验系统在非理想状态下的自愈能力。
测试层级协同示例
# 模拟服务依赖中断的混沌测试片段
from chaoslib.experiment import run_experiment
from chaoslib.types import Configuration, Secrets
config: Configuration = {"wait_before": 5, "wait_after": 10}
secrets: Secrets = {"aws": {"region": "us-east-1"}}
run_experiment({
"name": "kill-db-connection",
"steady-state-hypothesis": {
"probes": [{"type": "probe", "name": "check-api-health", "tolerance": True}]
},
"method": [{"type": "action", "name": "terminate-rds-instance", "provider": {"type": "aws", "action": "stop_rds_instance"}}]
})
该脚本调用Chaos Toolkit终止RDS实例,wait_before保障基线观测窗口,wait_after留出恢复观察期;tolerance定义健康判定阈值,体现“假设—扰动—验证”闭环。
| 层级 | 执行频率 | 验证焦点 | 典型工具 |
|---|---|---|---|
| 单元测试 | 每次提交 | 函数边界与分支逻辑 | pytest, Jest |
| 集成测试 | 每日构建 | API/DB/消息队列连通性 | Postman, Testcontainers |
| 混沌实验 | 每周/发布前 | 故障传播与降级策略 | Chaos Mesh, Gremlin |
graph TD
A[代码提交] --> B[单元测试快速反馈]
B --> C{通过?}
C -->|是| D[触发集成测试]
D --> E[部署至预发环境]
E --> F[运行混沌实验]
F --> G[生成韧性报告]
第五章:附录与源码使用指南
获取与验证源码完整性
本项目源码托管于 GitHub 仓库 https://github.com/techops-ai/infra-pipeline,推荐使用 Git CLI 克隆最新稳定版(v2.4.1):
git clone --branch v2.4.1 --depth 1 https://github.com/techops-ai/infra-pipeline.git
cd infra-pipeline
sha256sum ./docs/RELEASE_NOTES.md # 输出应为: a3f8c9b2e1d4... (见下表)
校验哈希值可确保未被篡改,关键文件校验表如下:
| 文件路径 | SHA256 哈希值(截取前16位) | 用途说明 |
|---|---|---|
deploy/ansible/playbook.yml |
e8b1a7d2f0c93456... |
生产环境K8s集群部署主剧本 |
scripts/validate-config.py |
9d4f2a1c8e7b6543... |
YAML配置语法与语义双重校验工具 |
tests/unit/test_auth_middleware.py |
2c6f3a8b1e9d0f45... |
JWT令牌解析逻辑单元测试 |
本地开发环境快速启动
依赖 Python 3.10+ 和 Docker 24.0+。执行以下命令即可启动全栈调试环境:
make dev-up # 自动构建镜像、拉起PostgreSQL+Redis+API服务
curl -X POST http://localhost:8000/api/v1/auth/login \
-H "Content-Type: application/json" \
-d '{"username":"admin","password":"devpass123"}'
该流程已在 Ubuntu 22.04 / macOS Sonoma / Windows WSL2 上完成交叉验证。
配置参数覆盖机制
支持三级配置覆盖:默认值(代码内建)→ 环境变量 → .env.local 文件。例如修改数据库连接池大小:
# .env.local
DB_POOL_MAX_SIZE=32
DB_TIMEOUT_SECONDS=15
系统启动时自动加载并优先级生效,无需重启服务即可热重载部分配置(标记为 @hot-reload 的模块)。
日志诊断与错误追踪
当 API 返回 500 Internal Server Error 时,立即检查 logs/app-error.log 中带 TRACE_ID 的完整链路日志:
[2024-06-15T14:22:31.892Z] ERROR [TRACE_ID: x7y9z2m4n8p1q5r6] auth_service.py:142 - Failed to validate token: ExpiredSignatureError('Signature has expired')
结合 trace_id 在 Jaeger UI(http://localhost:16686)中检索全链路调用树,定位到 auth-service 的 JWT 过期时间配置偏差。
CI/CD 流水线自定义扩展
.github/workflows/ci-deploy.yml 支持通过 workflow_dispatch 手动触发带参数的部署:
on:
workflow_dispatch:
inputs:
target_env:
description: 'Target deployment environment'
required: true
default: 'staging'
type: choice
options:
- staging
- production
- canary
执行后自动注入对应 secrets.PROD_DEPLOY_KEY 或 secrets.STAGING_DEPLOY_KEY,实现环境隔离的密钥管理。
模块化插件开发规范
新增云监控适配器需继承 monitoring/base_adapter.py 并实现 fetch_metrics() 方法:
class AzureMonitorAdapter(BaseAdapter):
def fetch_metrics(self, resource_id: str) -> dict:
return self._azure_client.query_metrics(
resource_id=resource_id,
timespan="PT1H",
metrics=["Percentage CPU", "Network In Total"]
)
注册至 plugins/monitoring/__init__.py 后,系统自动识别并加载,无需修改核心调度逻辑。
性能压测基准数据
使用 Locust 对 /api/v1/data/query 接口进行 200 并发持续 5 分钟压测,结果如下(AWS c5.4xlarge 实例):
| 指标 | 数值 | 条件 |
|---|---|---|
| 平均响应时间 | 127 ms | 数据集 1.2M 行,聚合查询 |
| P95 延迟 | 342 ms | 同上 |
| 错误率 | 0.0% | 无超时或连接拒绝 |
故障注入演练脚本
./scripts/failover-simulate.sh 提供模拟主数据库宕机场景:
# 自动切换至只读副本并触发告警通知
./scripts/failover-simulate.sh --target pg-primary --duration 180s
该脚本已集成至 Chaos Mesh 测试框架,可在 Kubernetes 集群中精确控制故障范围与恢复策略。
