第一章:Golang可观测性基建白皮书导论
可观测性并非日志、指标与追踪的简单叠加,而是通过系统行为的外部输出(logs、metrics、traces)推断内部状态的能力。在云原生与微服务架构日益复杂的背景下,Golang 因其轻量协程、静态编译与高吞吐特性,成为基础设施组件与中间件的首选语言;但其默认缺乏统一观测语义,易导致监控盲区与故障定位延迟。
核心原则与设计哲学
- 可组合性:观测能力应解耦于业务逻辑,支持按需注入(如 OpenTelemetry SDK 的
TracerProvider与MeterProvider) - 零侵入演进:优先采用装饰器模式或中间件封装,避免修改核心 handler
- 语义一致性:严格遵循 OpenTelemetry Semantic Conventions(如
http.method,net.peer.ip等标准属性)
关键组件选型建议
| 组件类型 | 推荐方案 | 说明 |
|---|---|---|
| 指标采集 | Prometheus + OTel SDK | 使用 otelmetric 包注册 Counter/Gauge,暴露 /metrics 端点 |
| 分布式追踪 | OpenTelemetry Go SDK | 自动注入 context 并传播 traceparent header |
| 日志关联 | Zap + OTel Log Bridge | 通过 zap.WrapCore 注入 trace ID 与 span ID 字段 |
快速验证可观测性接入
启动一个带基础观测能力的 HTTP 服务示例:
package main
import (
"net/http"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/exporters/prometheus"
"go.opentelemetry.io/otel/sdk/metric"
)
func main() {
// 初始化 Prometheus 导出器(默认监听 :9090/metrics)
exporter, _ := prometheus.New()
provider := metric.NewMeterProvider(metric.WithReader(exporter))
otel.SetMeterProvider(provider)
// 注册健康检查端点(自动携带指标)
http.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
w.Write([]byte("OK"))
})
// 启动服务并暴露指标
http.ListenAndServe(":8080", nil)
}
执行后访问 http://localhost:9090/metrics 即可查看 http_server_duration_seconds_count 等标准指标。该结构为后续集成链路采样、日志上下文透传与告警规则奠定基础。
第二章:OpenTelemetry在Golang中的深度集成与实践
2.1 OpenTelemetry SDK架构解析与Go语言适配原理
OpenTelemetry Go SDK采用可插拔的组件化设计,核心由TracerProvider、MeterProvider和SDK三部分构成,通过接口抽象解耦API与实现。
核心组件职责
TracerProvider:管理Tracer生命周期与采样策略SpanProcessor:异步处理Span(如批量导出、内存缓冲)Exporter:对接后端(如Jaeger、OTLP HTTP/gRPC)
数据同步机制
Go SDK默认使用simpleSpanProcessor(同步)与batchSpanProcessor(异步),后者通过channel+worker goroutine实现背压控制:
// batchSpanProcessor核心逻辑片段
func (b *batchSpanProcessor) onEnd(sd sdktrace.ReadOnlySpan) {
b.mu.Lock()
b.spans = append(b.spans, sd)
if len(b.spans) >= b.cfg.maxQueueSize {
b.mu.Unlock()
b.exportSpans() // 触发批量导出
return
}
b.mu.Unlock()
}
maxQueueSize控制缓冲上限,exportInterval触发定时刷新,避免goroutine泄漏。
Go语言适配关键点
| 适配维度 | 实现方式 |
|---|---|
| 并发安全 | sync.Mutex + atomic保障多goroutine写入 |
| Context传播 | 原生context.Context集成Span上下文传递 |
| 内存效率 | 复用[]byte缓冲区,避免高频GC |
graph TD
A[Tracer.Start] --> B[ReadOnlySpan]
B --> C{BatchSpanProcessor}
C --> D[Channel Queue]
D --> E[Worker Goroutine]
E --> F[OTLP Exporter]
2.2 Trace数据模型与Span生命周期管理(含Context传递语义)
Trace 是分布式调用的全局视图,由多个具备父子/兄弟关系的 Span 构成。每个 Span 表示一个逻辑工作单元,拥有唯一 spanId 和继承自父级的 traceId。
Span 的核心状态流转
- STARTED:收到请求或主动创建时进入
- ACTIVE:执行中,可记录事件、标签、日志
- FINISHED:
finish()调用后不可变,提交至 exporter
Context 传递的语义契约
跨进程调用必须透传 traceId、spanId、parentSpanId 及采样标记(如 X-B3-Sampled),遵循 W3C Trace Context 标准:
// OpenTelemetry Java SDK 中的上下文注入示例
HttpHeaders headers = new HttpHeaders();
tracer.getPropagator().inject(Context.current(), headers,
(carrier, key, value) -> carrier.set(key, value));
// → 自动注入 traceparent + tracestate 字段
逻辑分析:inject() 方法将当前 SpanContext 序列化为 traceparent(含 traceId/spanId/flags)和 tracestate(供应商扩展),确保下游能重建 Context 并延续 Span 链。
| 字段 | 示例值 | 语义说明 |
|---|---|---|
trace-id |
4bf92f3577b34da6a3ce929d0e0e4736 |
全局唯一标识一次分布式请求 |
parent-id |
00f067aa0ba902b7 |
直接上游 Span 的 spanId |
tracestate |
rojo=00f067aa0ba902b7,congo=t61rcm8dl... |
多厂商上下文兼容链 |
graph TD
A[Client Start Span] -->|inject traceparent| B[HTTP Request]
B --> C[Server Extract Context]
C --> D[Create Child Span]
D --> E[Finish & Export]
Span 生命周期严格绑定于 Context:Context.root() 启动新 Trace;Context.current() 获取当前活跃 Span;withContext() 实现协程/线程间安全传递。
2.3 自动化Instrumentation与手动埋点最佳实践(基于gin、http、database/sql)
自动化注入:OpenTelemetry Gin Middleware
使用 otelgin 中间件实现零侵入请求追踪:
import "go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin"
r := gin.Default()
r.Use(otelgin.Middleware("user-service")) // 服务名作为resource attribute
该中间件自动捕获 HTTP 方法、状态码、延迟,并将 span context 注入下游调用。"user-service" 作为 service.name 属性,用于服务拓扑识别。
手动埋点:SQL 查询增强
在关键业务查询中显式创建子 span:
ctx, span := tracer.Start(ctx, "db.FindUserByID",
trace.WithAttributes(attribute.String("db.statement", "SELECT * FROM users WHERE id = ?")))
defer span.End()
err := db.QueryRowContext(ctx, "SELECT * FROM users WHERE id = ?", id).Scan(&u.ID, &u.Name)
trace.WithAttributes 补充语义标签,便于按 SQL 模板聚合慢查询;ctx 确保 span 链路上下文传递。
埋点策略对比
| 场景 | 推荐方式 | 原因 |
|---|---|---|
| HTTP 入口/出口 | 自动化 | 覆盖全路径,无遗漏风险 |
| 业务逻辑分支决策点 | 手动 + 自定义属性 | 需标注业务语义(如 payment.status) |
混合实践流程
graph TD
A[HTTP Request] --> B[otelgin 自动创建 root span]
B --> C[业务Handler]
C --> D{是否关键路径?}
D -->|是| E[tracer.Start 手动子span]
D -->|否| F[依赖自动span继承]
E --> G[DB Query with ctx]
2.4 Propagation机制详解:B3、W3C TraceContext与自定义透传策略
分布式追踪的传播(Propagation)是跨服务传递上下文的核心能力。不同规范定义了各异的键名、编码方式与优先级策略。
三种主流传播格式对比
| 规范 | HTTP Header Key(s) | 是否支持多值 | 采样决策携带 |
|---|---|---|---|
| B3 | X-B3-TraceId, X-B3-SpanId, etc. |
否 | ❌ |
| W3C TraceContext | traceparent, tracestate |
✅(tracestate) | ✅(traceparent flag) |
| 自定义透传 | 可配置(如 x-trace-id-v2) |
灵活 | 按需扩展 |
W3C traceparent 解析示例
// traceparent: 00-4bf92f3577b34da6a3ce929d957b18c4-00f067aa0ba902b7-01
String traceParent = "00-4bf92f3577b34da6a3ce929d957b18c4-00f067aa0ba902b7-01";
String[] parts = traceParent.split("-");
// parts[0]: version (00), parts[1]: trace-id, parts[2]: span-id, parts[3]: flags (01 → sampled)
该格式强制使用16进制固定长度(32位 trace-id,16位 span-id),flags=01 表示采样开启,兼容性与标准化程度最高。
自定义透传策略流程
graph TD
A[入口请求] --> B{是否启用W3C?}
B -->|是| C[解析 traceparent]
B -->|否| D[回退至B3 Header提取]
C --> E[注入自定义字段 x-env x-region]
D --> E
E --> F[透传至下游HTTP/GRPC]
自定义策略常通过 TextMapPropagator 扩展实现,支持动态 header 映射与业务元数据融合。
2.5 OpenTelemetry Collector部署与Exporter配置(OTLP/Zipkin/Jaeger)
OpenTelemetry Collector 是可观测性数据的中枢,支持统一接收、处理与分发遥测信号。推荐使用容器化方式部署:
# collector-config.yaml
receivers:
otlp:
protocols: { http: {}, grpc: {} }
zipkin:
endpoint: "0.0.0.0:9411"
jaeger:
protocols:
grpc: { endpoint: "0.0.0.0:14250" }
exporters:
otlp:
endpoint: "otlp-server:4317"
tls:
insecure: true
zipkin:
endpoint: "http://zipkin:9411/api/v2/spans"
jaeger:
endpoint: "jaeger:14250"
service:
pipelines:
traces:
receivers: [otlp, zipkin, jaeger]
exporters: [otlp, zipkin, jaeger]
该配置启用多协议接入(OTLP/Zipkin/Jaeger),并并行导出至不同后端。insecure: true 仅用于开发环境;生产中需配置 TLS 证书。
数据路由策略
- OTLP 接收器兼容
grpc和http,适配 SDK 默认行为 - Zipkin/Jaeger 接收器自动转换 span 格式,无需客户端改造
协议兼容性对比
| 协议 | 传输层 | 数据格式 | 原生支持 SDK |
|---|---|---|---|
| OTLP | gRPC/HTTP | Protobuf/JSON | ✅ 全语言官方支持 |
| Zipkin | HTTP | JSON | ⚠️ 需适配旧版 trace ID |
| Jaeger | gRPC/Thrift | Protobuf/Thrift | ⚠️ Thrift 已逐步弃用 |
graph TD
A[SDK] -->|OTLP/gRPC| B(Collector)
A -->|Zipkin/HTTP| B
A -->|Jaeger/gRPC| B
B -->|OTLP| C[Tempo]
B -->|Zipkin| D[Zipkin UI]
B -->|Jaeger| E[Jaeger UI]
第三章:Prometheus指标体系构建与Go服务监控落地
3.1 Prometheus数据模型与Go原生指标类型(Counter/Gauge/Histogram/Summary)
Prometheus采用维度化时间序列模型,每条时序由指标名称+标签集唯一标识,值为浮点数+时间戳。
四类核心指标语义差异
- Counter:单调递增计数器(如请求总数),仅支持
Inc()、Add() - Gauge:可增可减的瞬时值(如内存使用量),支持
Inc()/Dec()/Set() - Histogram:观测样本分布(如HTTP响应延迟),自动划分分位桶(
le="0.1") - Summary:客户端计算分位数(如P95),不依赖服务端聚合
Go客户端典型用法示例
// 定义带标签的Counter
httpRequestsTotal := prometheus.NewCounterVec(
prometheus.CounterOpts{
Name: "http_requests_total",
Help: "Total HTTP requests processed",
},
[]string{"method", "status"},
)
prometheus.MustRegister(httpRequestsTotal)
// 记录一次GET成功请求
httpRequestsTotal.WithLabelValues("GET", "200").Inc()
NewCounterVec 创建带多维标签的计数器;WithLabelValues 动态绑定标签组合;Inc() 原子递增1。标签在采集时构成独立时序,支撑灵活下钻分析。
| 指标类型 | 适用场景 | 是否支持负值 | 分位数计算位置 |
|---|---|---|---|
| Counter | 累计事件数 | 否 | 不适用 |
| Gauge | 当前资源状态 | 是 | 不适用 |
| Histogram | 延迟/大小分布 | 否 | 服务端(Prometheus) |
| Summary | 高精度分位需求 | 否 | 客户端(Go进程内) |
graph TD
A[Go应用] --> B[Metrics Registry]
B --> C1[Counter: 累加]
B --> C2[Gauge: Set/Inc/Dec]
B --> C3[Histogram: Observe latency]
B --> C4[Summary: Observe latency]
C1 & C2 & C3 & C4 --> D[Prometheus Scrapes /metrics]
3.2 Gin中间件集成Prometheus指标采集(含路由标签动态打点)
核心指标定义
使用 promhttp 和 promauto 初始化注册器,定义带 route 标签的 HTTP 指标:
var (
httpDuration = promauto.NewHistogramVec(
prometheus.HistogramOpts{
Name: "http_request_duration_seconds",
Help: "HTTP request duration in seconds",
Buckets: prometheus.DefBuckets,
},
[]string{"method", "route", "status"},
)
)
该指标动态捕获
route(如/api/users/:id),而非静态路径,需在 Gin 中间件中从c.FullPath()提取。route标签支持按路由模板聚合,避免因参数导致指标爆炸。
中间件实现逻辑
func PrometheusMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
start := time.Now()
c.Next()
route := c.FullPath() // 动态获取注册路由模式(如 "/user/:id")
httpDuration.WithLabelValues(
c.Request.Method,
route,
strconv.Itoa(c.Writer.Status()),
).Observe(time.Since(start).Seconds())
}
}
c.FullPath()返回 Gin 路由引擎匹配后的注册路径模板,非c.Request.URL.Path的原始路径,确保/user/123和/user/456归入同一route="/user/:id"标签。
指标采集效果对比
| 场景 | c.Request.URL.Path |
c.FullPath() |
标签稳定性 |
|---|---|---|---|
GET /api/v1/users/123 |
/api/v1/users/123 |
/api/v1/users/:id |
✅ 高 |
POST /order/abc |
/order/abc |
/order/:id |
✅ 高 |
数据流示意
graph TD
A[HTTP Request] --> B[Gin Router Match]
B --> C[Fullpath → /users/:id]
C --> D[Record to http_request_duration_seconds{route=\"/users/:id\"}]
D --> E[Prometheus Scraping]
3.3 自定义业务指标设计与Exporter开发(如goroutine数、请求延迟分布)
核心指标选型原则
- 可观测性优先:选择能直接反映服务健康态的指标(如
http_request_duration_seconds_bucket) - 低开销:避免高频采样导致GC压力,goroutine数宜每10s采集一次
- 可聚合性:延迟分布必须使用直方图(Histogram),而非Gauge
Prometheus Histogram 实战示例
// 定义HTTP请求延迟直方图,桶边界按P99经验设定
var httpDuration = prometheus.NewHistogramVec(
prometheus.HistogramOpts{
Name: "http_request_duration_seconds",
Help: "Latency distribution of HTTP requests",
Buckets: []float64{0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5}, // 单位:秒
},
[]string{"method", "status_code"},
)
逻辑分析:
Buckets决定直方图分桶精度;[]string{"method","status_code"}支持多维下钻分析;NewHistogramVec允许运行时动态标签绑定,避免指标爆炸。
Goroutine 数监控(Gauge)
var goroutines = prometheus.NewGauge(prometheus.GaugeOpts{
Name: "go_goroutines",
Help: "Number of currently running goroutines",
})
// 在采集器中定期更新:goroutines.Set(float64(runtime.NumGoroutine()))
| 指标类型 | 适用场景 | 更新频率 | 是否支持标签 |
|---|---|---|---|
| Histogram | 请求延迟、响应体大小 | 每次请求 | ✅ |
| Gauge | Goroutine数、缓存命中率 | 10s/次 | ✅ |
| Counter | 总请求数、错误总数 | 累加式 | ✅ |
graph TD
A[HTTP Handler] --> B[Observe latency with labels]
B --> C[HistogramVec.Inc/Bucket]
C --> D[Prometheus scrapes /metrics]
D --> E[Alert on P99 > 1s]
第四章:Grafana可视化与全链路可观测性闭环建设
4.1 Grafana数据源配置与OpenTelemetry Tempo/Loki/Prometheus协同架构
Grafana 作为统一可观测性门户,需同时接入指标、日志与追踪三大数据源,形成闭环诊断能力。
数据源注册顺序建议
- 先配置 Prometheus(指标基座)
- 再添加 Loki(日志上下文关联)
- 最后集成 Tempo(分布式追踪对齐)
关键配置片段(grafana.ini 片段)
[plugins]
enable_alpha = true
allow_loading_unsigned_plugins = "grafana-tempo-datasource,grafana-loki-datasource"
启用实验性插件支持,确保 Tempo 和 Loki 官方数据源可加载;
allow_loading_unsigned_plugins列表必须精确匹配插件 ID,否则启动失败。
协同关系概览
| 数据源 | 核心职责 | 关联维度 |
|---|---|---|
| Prometheus | 指标聚合与告警 | service_name, job |
| Loki | 日志结构化检索 | cluster, namespace |
| Tempo | 分布式链路追踪 | traceID, spanID |
graph TD
A[Prometheus] -->|metrics with labels| B(Grafana Explore)
C[Loki] -->|log lines with traceID| B
D[Tempo] -->|traceID + service map| B
B --> E[Unified Debugging View]
4.2 Trace-Log-Metric三元组关联查询(TraceID透传至日志与指标)
实现可观测性闭环的核心在于TraceID的端到端贯穿。微服务调用链中,TraceID需同步注入日志上下文与指标标签。
数据同步机制
日志框架(如Logback)通过MDC(Mapped Diagnostic Context)自动注入trace_id字段:
// 在Spring Cloud Sleuth或OpenTelemetry拦截器中
MDC.put("trace_id", Span.current().getTraceId()); // OpenTelemetry格式:16进制32位字符串
逻辑分析:
Span.current()获取当前活跃Span;getTraceId()返回标准化TraceID(如4bf92f3577b34da6a68a54c1122b7720),确保与分布式追踪系统一致。参数trace_id为固定键名,便于日志采集器(如Filebeat)提取结构化字段。
关联查询能力
| 数据源 | 关键字段 | 查询示例 |
|---|---|---|
| 日志 | trace_id |
trace_id == "4bf92f35..." |
| 指标 | trace_id label |
http_server_duration_seconds{trace_id="4bf92f35..."} |
流程示意
graph TD
A[HTTP请求] --> B[生成TraceID]
B --> C[注入Span上下文]
C --> D[写入日志MDC]
C --> E[打点指标label]
D & E --> F[统一查询平台联合检索]
4.3 Gin中间件源码级实现:上下文透传、Span注入与Error自动捕获
上下文透传机制
Gin 中间件通过 c.Next() 实现链式调用,*gin.Context 本身即为透传载体。其底层基于 context.WithValue() 构建派生上下文,确保跨中间件的请求生命周期一致性。
Span注入示例
func TracingMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
// 从HTTP Header提取traceID或生成新Span
span := tracer.StartSpan(c.Request.URL.Path)
c.Set("span", span) // 注入至Context
defer span.Finish()
c.Next() // 执行后续handler
}
}
该代码将 OpenTracing Span 绑定到 gin.Context,利用 c.Set() 实现跨中间件透传;defer span.Finish() 确保异常路径下 Span 正确结束。
Error自动捕获逻辑
Gin 默认在 c.AbortWithStatusJSON() 或 panic 恢复时触发错误收集。中间件可通过 c.Errors 获取累积错误列表,并统一上报:
| 字段 | 类型 | 说明 |
|---|---|---|
| Err | error | 原始错误实例 |
| Meta | map[string]interface{} | 附加上下文(如trace_id、path) |
| Time | time.Time | 错误发生时间 |
graph TD
A[HTTP Request] --> B[Tracing Middleware]
B --> C[Auth Middleware]
C --> D[Business Handler]
D --> E{Panic or c.Error?}
E -->|Yes| F[Recover & Inject Error to c.Errors]
E -->|No| G[Normal Response]
4.4 告警规则设计与SLO驱动的可观测性看板(含P99延迟、错误率、饱和度)
核心指标定义与SLO对齐
SLO(Service Level Objective)需锚定三个黄金信号:
- P99延迟:保障99%请求响应 ≤ 200ms(关键路径阈值)
- 错误率:HTTP 5xx + 客户端超时占比
- 饱和度:CPU/内存使用率 > 85% 持续3分钟即触发预警
Prometheus告警规则示例
# alert_rules.yml
- alert: HighP99Latency
expr: histogram_quantile(0.99, sum(rate(http_request_duration_seconds_bucket[1h])) by (le, job)) > 0.2
for: 5m
labels:
severity: critical
annotations:
summary: "P99 latency exceeds 200ms for {{ $labels.job }}"
逻辑分析:
histogram_quantile(0.99, ...)在1小时滑动窗口内计算P99延迟;rate(...[1h])抵消瞬时毛刺;for: 5m避免抖动误报。参数0.2对应200ms(单位:秒),le标签确保桶聚合正确。
可观测性看板维度
| 维度 | 数据源 | 可视化方式 | SLO关联动作 |
|---|---|---|---|
| P99延迟 | Prometheus + OTel | 折线图+热力图 | 自动扩容API实例 |
| 错误率 | Loki日志解析 | 堆叠柱状图 | 触发熔断降级策略 |
| 饱和度 | Node Exporter | 仪表盘+阈值色块 | 调度器驱逐高负载Pod |
告警闭环流程
graph TD
A[指标采集] --> B[规则评估]
B --> C{是否持续超阈值?}
C -->|是| D[生成Alert]
C -->|否| A
D --> E[通知路由]
E --> F[自动执行SLO修复预案]
F --> G[验证SLO达标]
G --> A
第五章:未来演进与生态协同展望
多模态AI驱动的运维闭环实践
某头部云服务商已将LLM+时序预测模型嵌入其智能运维平台(AIOps),实现故障根因自动定位与修复建议生成。系统在2024年Q2真实生产环境中,对Kubernetes集群中Pod频繁OOM事件的平均响应时间从17分钟压缩至2.3分钟;通过调用Prometheus API实时拉取指标、结合OpenTelemetry trace数据构建因果图谱,模型准确识别出内存限制配置错误与JVM Metaspace泄漏的复合诱因。该能力已集成至GitOps流水线,在Helm Chart提交前触发合规性检查,并自动生成resources.limits.memory修正补丁。
开源协议协同治理机制
下表对比主流基础设施项目在许可证兼容性层面的演进策略:
| 项目 | 当前许可证 | 2025年路线图关键动作 | 社区协作案例 |
|---|---|---|---|
| Envoy Proxy | Apache 2.0 | 启动eBPF扩展模块的双许可证(Apache+GPLv2) | 与Cilium共建XDP加速插件,代码复用率68% |
| Argo CD | Apache 2.0 | 引入SBOM签名验证框架,强制OCI镜像声明许可证 | 在GitLab CI中嵌入license-compliance扫描器 |
边缘-云协同推理架构落地
某工业物联网平台部署了分层推理架构:边缘节点(NVIDIA Jetson AGX Orin)运行轻量化YOLOv8n模型执行实时缺陷检测,每帧处理耗时
flowchart LR
A[边缘设备] -->|HTTP/3 + QUIC| B(区域边缘网关)
B --> C{置信度判断}
C -->|≥0.85| D[本地闭环处置]
C -->|<0.85| E[加密上传至区域云]
E --> F[大模型多模态分析]
F --> G[生成SOP修正建议]
G --> H[同步至MES系统]
跨云服务网格联邦实践
某跨国金融集团采用Istio 1.22+ClusterMesh方案,打通AWS us-east-1、Azure eastus2及私有OpenStack集群。通过自定义Gateway API CRD统一管理TLS证书生命周期,所有跨云流量经mTLS双向认证;服务发现采用DNS-based federation,将payment-service.global解析为各集群EndpointSlice聚合列表。在2024年“黑五”大促期间,该架构支撑单日峰值1.2亿次跨云调用,P99延迟稳定在87ms以内。
可观测性数据主权治理
某政务云平台实施OpenTelemetry Collector联邦采集架构:各委办局保留原始trace数据所有权,仅向市级中心推送脱敏后的指标聚合(如http.server.duration_sum{service="tax",status_code="5xx"})。通过eBPF探针在内核态完成字段过滤与哈希脱敏,确保PII数据不出域。该模式已在社保、医保等12个核心业务系统上线,满足《政务信息系统数据安全管理办法》第23条关于数据最小化采集的要求。
