Posted in

你还在用Node.js做API网关?——Go实现百万RPS网关的5个不可绕过的工程实践

第一章:为什么API网关正在从Node.js向Go迁移

现代微服务架构对API网关提出了严苛要求:高并发吞吐、低延迟响应、资源确定性与热更新能力。在这一背景下,越来越多团队正将核心网关层从Node.js迁移到Go——这不是语言偏好的更迭,而是工程权衡的必然选择。

性能与资源效率的质变

Node.js基于事件循环,单线程模型在I/O密集场景表现优异,但面对数万级并发连接时,V8堆内存增长不可控,GC暂停(尤其是全量GC)易引发毫秒级抖动;而Go的GMP调度器与分代+三色标记并发GC,使10万RPS下P99延迟稳定在3ms内,内存占用仅为同等负载Node.js进程的40%。实测对比(AWS c5.4xlarge,Envoy前置代理):

指标 Node.js (v18) Go (v1.22, Gin+fasthttp)
平均延迟 12.7 ms 2.3 ms
内存峰值 1.8 GB 620 MB
CPU利用率 82%(波动±15%) 41%(平稳)

运维确定性增强

Node.js依赖NPM生态,node_modules深度嵌套常导致构建非幂等;Go通过go mod vendor可锁定全部依赖至本地,配合静态链接生成单二进制文件:

# 构建零依赖可执行文件,直接部署至Alpine容器
CGO_ENABLED=0 GOOS=linux go build -a -ldflags '-extldflags "-static"' -o gateway .

该二进制启动时间require()路径解析与模块缓存竞争问题。

原生支持云原生扩展

Go标准库对HTTP/2、gRPC、TLS 1.3及OpenTelemetry Tracing具备开箱即用支持。例如,启用gRPC-Web透传仅需3行代码:

// 自动将HTTP/1.1 + JSON请求转换为gRPC调用
grpcweb.WrapServer(server, 
    grpcweb.WithWebsockets(true), // 支持浏览器WebSocket直连
    grpcweb.WithCorsForRegisteredEndpointsOnly(false), // 允许跨域
)

而Node.js需引入@grpc/grpc-jsgrpc-webexpress-grpc-web等多个包,并手动处理协议桥接与错误映射。

第二章:高并发网关的核心架构设计

2.1 基于Go runtime的GMP模型与百万级连接调度实践

Go 的 GMP 模型(Goroutine-Machine-Processor)是支撑高并发网络服务的核心抽象。其轻量协程(G)、OS线程(M)与逻辑处理器(P)的三级解耦,使单机百万级连接成为可能。

调度关键参数调优

  • GOMAXPROCS:绑定 P 数量,建议设为物理 CPU 核数;
  • GOGC:控制 GC 频率,高连接场景可调至 100 降低停顿;
  • GOMEMLIMIT:配合 runtime/debug.SetMemoryLimit() 实现内存硬限。

网络连接复用示例

// 启用连接池与上下文超时,避免 Goroutine 泄漏
srv := &http.Server{
    Addr: ":8080",
    Handler: http.TimeoutHandler(handler, 30*time.Second, "timeout"),
    ReadTimeout:  15 * time.Second,
    WriteTimeout: 15 * time.Second,
}

该配置强制约束 I/O 生命周期,防止阻塞 M 导致 P 饥饿;TimeoutHandler 将超时交由 runtime 调度器统一回收 G,避免手动 goroutine 管理开销。

组件 作用 百万连接下的典型值
G 并发单元 > 10⁶(动态创建/销毁)
P 调度上下文 = GOMAXPROCS(通常 32~64)
M OS 线程载体 ~200(受系统线程限制)
graph TD
    A[New Conn] --> B{P 有空闲?}
    B -->|是| C[绑定 G 到本地 G 队列]
    B -->|否| D[投递至全局 G 队列]
    C & D --> E[Work Stealing:空闲 P 盗取 G]
    E --> F[执行 netpoller 事件循环]

2.2 零拷贝HTTP/2与QUIC协议栈集成:net/http vs. fasthttp vs. gnet选型实测

现代高性能服务需绕过内核态数据拷贝,尤其在HTTP/2多路复用与QUIC基于UDP的流控场景下。net/http 默认依赖syscall.Read/Write,存在两次内存拷贝;fasthttp 通过[]byte池与预分配上下文减少GC,但HTTP/2支持需额外封装;gnet 基于epoll/kqueue + io_uring(Linux 5.11+),原生支持零拷贝接收(MSG_TRUNC + splice)。

性能对比关键指标(16KB响应体,4K并发)

栈类型 吞吐量 (req/s) 内存分配 (MB/s) QUIC就绪性
net/http 28,400 42.7 ❌(需quic-go桥接)
fasthttp 63,900 11.2 ⚠️(需自建ALPN+QUIC transport)
gnet 98,200 3.1 ✅(内置quic-go集成点)
// gnet零拷贝接收示例(启用io_uring)
func (ev *server) React(frame []byte) (out []byte, action gnet.Action) {
    // frame直接指向ring buffer页,无memcpy
    req := parseHTTP2FrameNoCopy(frame) // 零拷贝帧解析
    return ev.handle(req), gnet.None
}

该回调中frameio_uring提交的用户空间缓冲区直引用,规避copy()调用;parseHTTP2FrameNoCopy通过unsafe.Slice跳过帧头偏移,参数frame生命周期由gnet事件循环严格管理,避免悬垂指针。

graph TD A[客户端QUIC握手] –> B[UDP包进入gnet ring] B –> C{io_uring_submit} C –> D[内核直接DMA到用户buffer] D –> E[gnet.React无拷贝处理] E –> F[splice系统调用回传]

2.3 无锁环形缓冲区在请求解析层的落地:自研Parser Ring Buffer性能压测对比

为应对高并发HTTP请求解析的吞吐瓶颈,我们在解析层引入自研无锁环形缓冲区(Parser Ring Buffer),替代传统基于ReentrantLock的阻塞队列。

数据同步机制

采用CAS+内存序(volatile long tail + Unsafe.compareAndSwapLong)实现生产者/消费者独立推进,避免伪共享——通过@Contended隔离头尾指针缓存行。

// 生产者入队核心逻辑(简化)
public boolean offer(byte[] packet) {
    long nextTail = (tail.get() + 1) & mask; // 位运算取模,mask = capacity-1
    if (nextTail != head.get()) { // 非满判定(无锁双指针快照)
        buffer[(int) tail.get()] = packet;
        tail.set(nextTail); // volatile写,happens-before消费者读head
        return true;
    }
    return false;
}

mask确保容量为2的幂次,tail.set()触发store-store屏障,保障数据可见性;head.get()为普通volatile读,低开销。

压测关键指标(QPS @ 4KB请求体)

方案 平均延迟(ms) 99%延迟(ms) QPS
LinkedBlockingQueue 8.2 24.7 12,400
Parser Ring Buffer 2.1 5.3 48,900
graph TD
    A[Netty EventLoop] -->|批量dispatch| B[Parser Ring Buffer]
    B --> C{Consumer Thread Pool}
    C --> D[AST构建]
    C --> E[Schema校验]

2.4 基于Go泛型的动态路由匹配引擎:Trie+AST双模式路由树构建与热更新

传统字符串前缀匹配在高并发API网关中存在路径冗余与通配符支持弱的问题。本引擎融合Trie树的高效前缀索引能力与AST节点的语义化动态解析能力,通过Go泛型统一RouteNode[T any]接口,实现路径段类型安全复用。

双模式节点定义

type RouteNode[T any] struct {
    path     string
    handler  func(http.ResponseWriter, *http.Request, T) // 泛型上下文透传
    children map[string]*RouteNode[T]
    astExpr  *ast.CallExpr // 动态条件表达式(如 :id\\d+)
}

T承载路由参数绑定结构(如UserRouteParams),astExpr在运行时由go/ast解析并缓存编译结果,避免重复语法分析。

热更新机制核心流程

graph TD
    A[新路由配置加载] --> B{校验AST语法}
    B -->|合法| C[生成增量diff]
    B -->|非法| D[拒绝加载并告警]
    C --> E[原子替换Trie根节点指针]
    E --> F[旧节点GC回收]
模式 匹配耗时 通配符支持 内存开销
Trie纯前缀 O(m) *
AST动态解析 O(m+k) 正则/函数

2.5 并发安全的插件化中间件机制:context.Context生命周期穿透与goroutine泄漏防控

中间件链的Context透传契约

插件化中间件必须遵循 func(http.Handler) http.Handler 签名,并在每层显式接收 *http.Request,从中提取 ctx := r.Context()。任何中间件不得创建独立 context(如 context.Background()),否则将切断取消信号。

goroutine泄漏高危模式

  • 直接启动无取消约束的 goroutine:go doWork()
  • 忘记 defer cancel() 导致 context.Value 泄漏
  • 在中间件中缓存未绑定生命周期的 channel

安全中间件模板

func TimeoutMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        // 基于原请求ctx派生带超时的新ctx
        ctx, cancel := context.WithTimeout(r.Context(), 5*time.Second)
        defer cancel() // ✅ 关键:确保cancel被调用

        // 将新ctx注入request,向下透传
        r = r.WithContext(ctx)
        next.ServeHTTP(w, r)
    })
}

逻辑分析WithTimeout 返回子 ctx 与 cancel 函数;defer cancel() 保证 HTTP 处理结束即释放资源;r.WithContext() 是唯一合法的上下文替换方式,保障下游中间件和 handler 能感知超时信号。

Context生命周期对照表

场景 ctx 是否可取消 是否触发 cancel goroutine 安全
r.Context()(原始) 是(由客户端断连触发) 自动
context.WithValue(r.Context(), k, v) 继承父 ctx 取消能力 否(仅扩展数据)
context.Background() 永不 ❌(泄漏风险)
graph TD
    A[Client Request] --> B[r.Context\(\)]
    B --> C{Middleware Chain}
    C --> D[ctx.WithTimeout\(\)]
    D --> E[Handler]
    E --> F[Done/Cancel]
    F --> G[自动清理关联goroutine]

第三章:生产级稳定性工程实践

3.1 Go内存模型下的GC调优与pprof全链路追踪实战

Go 的 GC 是基于三色标记-清除的并发算法,受 GOGC、堆大小及对象生命周期共同影响。高频短生命周期对象易触发频繁 GC,需结合 pprof 定位根因。

pprof 启用与采样策略

启动时注入:

import _ "net/http/pprof"

// 在 main 中启用 HTTP pprof 端点
go func() { log.Println(http.ListenAndServe("localhost:6060", nil)) }()

此代码启用标准 pprof HTTP 接口;GODEBUG=gctrace=1 可实时输出 GC 次数、暂停时间与堆增长,辅助判断是否需调低 GOGC(默认100)。

关键调优参数对照表

参数 默认值 适用场景 风险
GOGC 100 内存敏感服务(如边缘网关) GC 频次上升,CPU 占用增高
GOMEMLIMIT unset 云环境限制 RSS(如 Kubernetes memory limit) 超限时触发紧急 GC

GC 压力传导路径(mermaid)

graph TD
    A[HTTP Handler] --> B[频繁 new struct{}]
    B --> C[逃逸至堆]
    C --> D[年轻代快速填满]
    D --> E[触发 STW 标记阶段]
    E --> F[用户请求延迟尖刺]

通过 go tool pprof http://localhost:6060/debug/pprof/heap 可交互式分析对象分配热点。

3.2 基于etcd+raft的分布式配置热加载与一致性校验

配置变更的原子广播机制

etcd 利用 Raft 协议将配置更新作为日志条目提交,仅当多数节点持久化后才应用至状态机,确保强一致性。

数据同步机制

客户端通过 Watch API 监听 /config/ 前缀路径,etcd 服务端在 Raft 提交后触发事件通知:

cli, _ := clientv3.New(clientv3.Config{Endpoints: []string{"10.0.1.10:2379"}})
watchCh := cli.Watch(context.Background(), "/config/", clientv3.WithPrefix())
for wresp := range watchCh {
  for _, ev := range wresp.Events {
    log.Printf("Config updated: %s = %s", ev.Kv.Key, ev.Kv.Value)
    applyConfig(string(ev.Kv.Value)) // 热加载业务逻辑
  }
}

WithPrefix() 启用前缀监听;ev.Kv.Value 是序列化后的配置(如 JSON),需反序列化并校验结构合法性;applyConfig() 应具备幂等性,避免重复加载引发状态抖动。

一致性校验流程

校验项 方法 触发时机
版本一致性 Compare-and-Swap (CAS) 配置写入前
值完整性 SHA256(value) + etcd TTL Watch 事件中
节点视图一致性 etcdctl endpoint status 定期健康巡检
graph TD
  A[客户端发起 PUT /config/db] --> B[Raft 日志复制]
  B --> C{多数节点落盘?}
  C -->|Yes| D[Commit 并应用至 kv store]
  C -->|No| E[拒绝写入,返回失败]
  D --> F[广播 Watch 事件]

3.3 熔断降级与自适应限流:基于go-zero sentinel的定制化RateLimiter实现

在高并发微服务场景中,单纯静态QPS限流易导致突发流量击穿或资源闲置。我们基于 go-zero 内置的 sentinel-go 扩展,构建支持动态窗口、实时指标反馈与熔断联动的 AdaptiveRateLimiter

核心设计原则

  • 基于滑动时间窗统计(1s/10桶)
  • 熔断触发条件:错误率 > 60% 且请求数 ≥ 20
  • 限流阈值每5秒按 min(当前TPS×1.2, 最大阈值) 自适应上调

配置参数对照表

参数 类型 默认值 说明
BaseQps int 100 初始基准QPS
MaxQps int 1000 动态上限
WindowSec int 1 统计窗口秒数
// AdaptiveRateLimiter 核心判断逻辑
func (r *AdaptiveRateLimiter) Allow() bool {
    metrics := sentinel.GetMetricsForResource("api_order_create")
    if metrics == nil {
        return r.baseLimiter.Allow() // fallback to static limiter
    }
    tps := float64(metrics.Total()) / float64(r.windowSec)
    newQps := int(math.Min(float64(r.maxQps), tps*1.2))
    r.updateThreshold(newQps) // 动态重载阈值
    return r.baseLimiter.SetQps(newQps).Allow()
}

该逻辑每调用即采集最近窗口内总请求数,换算为实时TPS,并以1.2倍平滑系数上探容量;SetQps 触发 sentinel 底层令牌桶重初始化,无锁安全。

graph TD
    A[请求进入] --> B{Sentinel 指标采集}
    B --> C[计算当前TPS]
    C --> D[自适应调整QPS阈值]
    D --> E[令牌桶重载]
    E --> F[Allow/Block决策]
    F --> G[熔断器状态同步]

第四章:可观察性与云原生集成体系

4.1 OpenTelemetry SDK深度集成:Span注入、Baggage透传与eBPF辅助指标采集

OpenTelemetry SDK 不仅提供标准的 Span 生命周期管理,更支持运行时上下文增强与内核级观测协同。

Span 注入与 Context 绑定

通过 Tracer.start_span() 显式创建 Span,并借助 context.attach() 将其注入当前执行流:

from opentelemetry import trace
from opentelemetry.context import attach, detach

tracer = trace.get_tracer(__name__)
span = tracer.start_span("db-query")
token = attach(span.get_span_context())  # 激活上下文
# ... 执行业务逻辑
detach(token)  # 清理上下文引用

此处 token 是上下文快照句柄;attach() 确保后续 tracer.start_span() 自动继承父 Span,实现跨函数调用链路粘连。

Baggage 透传机制

Baggage 用于携带业务元数据(如 tenant_id、feature_flag),在进程/服务间自动传播:

  • 以键值对形式存储(字符串→字符串)
  • 默认随 HTTP Header baggage 字段序列化传递
  • 支持动态增删,不参与采样决策

eBPF 辅助指标采集架构

eBPF 程序挂载于 socket send/recv 点位,提取连接维度延迟与吞吐,经 perf event ring buffer 上报至用户态 Collector:

graph TD
    A[eBPF Probe] -->|TCP latency| B[Perf Buffer]
    B --> C[OTel Exporter]
    C --> D[Prometheus Remote Write]
维度 采集方式 示例标签
连接延迟 kprobe/tcp_sendmsg peer.addr=”10.1.2.3:8080″
请求字节数 tracepoint/syscalls/sys_enter_write pid=”1234″

eBPF 采集与 SDK Span 共享 trace_id,实现应用层与网络层指标精准对齐。

4.2 Prometheus指标建模:按路由/上游/标签维度的多维时间序列设计

Prometheus 的核心优势在于其灵活的多维标签(label)模型。将 API 流量按 route(如 /api/v1/users)、upstream(如 auth-service:8080)和业务标签(如 env="prod"team="backend")联合建模,可实现细粒度可观测性。

标签组合示例

  • http_requests_total{route="/api/v1/orders", upstream="order-service", env="staging", status="503"}
  • nginx_upstream_response_time_seconds_sum{route="/api/v1/payments", upstream="payment-gateway", region="us-east"}

推荐标签策略

  • 必选维度:routeupstreamenv
  • 可选高基数规避:用 team_id 替代 team_name,避免标签爆炸
  • 禁止使用动态值(如 user_id)作为标签

指标定义示例(Prometheus client library)

from prometheus_client import Counter, Histogram

# 按 route + upstream 多维建模
http_requests = Counter(
    'http_requests_total',
    'Total HTTP requests',
    ['route', 'upstream', 'method', 'status', 'env']
)

# 使用示例
http_requests.labels(
    route='/api/v1/products',
    upstream='catalog-service:9001',
    method='GET',
    status='200',
    env='prod'
).inc()

逻辑分析Counter 实例通过 labels() 动态绑定多维标签,底层以 (name, label_values) 元组为唯一键存储时间序列。routeupstream 作为高区分度静态维度,确保聚合与下钻能力;env 支持环境隔离,避免跨环境指标污染。

维度 建议取值粒度 是否允许高基数 说明
route REST 资源路径(非含参) /api/v1/users,非 /api/v1/users/123
upstream 服务名+端口 避免 IP 地址导致抖动
team 团队短编码(如 bknd 控制标签值集合大小
graph TD
    A[HTTP 请求] --> B[路由匹配]
    B --> C[提取 route 标签]
    B --> D[解析上游服务]
    D --> E[注入 upstream 标签]
    C & E & F[环境上下文] --> G[打标并上报]

4.3 Kubernetes CRD驱动的网关策略编排:Gateway API v1beta1适配与Operator开发

Gateway API v1beta1 的成熟标志着服务网格边界控制权从 Ingress 向声明式、角色分离的 CRD 体系演进。Operator 需精准映射 GatewayHTTPRouteReferenceGrant 的生命周期。

CRD 资源依赖关系

# gateway.yaml —— 绑定监听端口与 GatewayClass
apiVersion: gateway.networking.k8s.io/v1beta1
kind: Gateway
metadata:
  name: prod-gateway
spec:
  gatewayClassName: nginx-gatewayclass  # 必须存在且被 Operator watch
  listeners:
  - name: https
    port: 443
    protocol: HTTPS
    tls: { mode: Terminate, certificateRefs: [...] }

该定义触发 Operator 校验 gatewayClassName 关联的 GatewayClass 是否启用对应控制器,并动态生成 Nginx 配置片段。

数据同步机制

  • Operator 监听 HTTPRoute 创建事件
  • 解析 parentRefs 定位所属 Gateway
  • 调用 ReferenceGrant 鉴权跨命名空间引用
组件 职责 触发条件
GatewayClass Controller 初始化网关实例 GatewayClass 状态变为 Accepted
Route Reconciler 更新路由规则树 HTTPRoute .status.parents 变更
graph TD
  A[HTTPRoute 创建] --> B{ReferenceGrant 授权?}
  B -->|是| C[注入 Envoy xDS 配置]
  B -->|否| D[设置 .status.conditions = Denied]

4.4 日志结构化与WAL持久化:zap + loki + promtail日志Pipeline调优

Zap 作为高性能结构化日志库,需配合 WAL(Write-Ahead Logging)机制保障崩溃恢复能力。Loki 不存储原始日志,而是依赖 Promtail 的 positions.yaml 持久化偏移,本质即轻量 WAL。

结构化日志输出示例

// 使用 zapcore.AddSync 封装带 fsync 的文件写入器
logger := zap.New(zapcore.NewCore(
    zapcore.NewJSONEncoder(zapcore.EncoderConfig{
        TimeKey:        "ts",
        LevelKey:       "level",
        NameKey:        "logger",
        CallerKey:      "caller",
        MessageKey:     "msg",
        EncodeTime:     zapcore.ISO8601TimeEncoder, // 标准化时间格式,利于 Loki 解析
        EncodeLevel:    zapcore.LowercaseLevelEncoder,
    }),
    zapcore.AddSync(&lumberjack.Logger{
        Filename:   "/var/log/app/app.log",
        MaxSize:    100, // MB
        MaxBackups: 5,
        MaxAge:     28,  // days
        Compress:   true,
    }),
    zapcore.InfoLevel,
))

该配置启用 JSON 编码与滚动归档,EncodeTime 统一为 ISO8601,使 Promtail 的 pipeline_stages 可精准提取 ts 字段对齐 Loki 时间索引。

Promtail 关键 pipeline 配置

阶段 功能 示例配置片段
docker 自动提取容器元数据 stage: {docker: {}}
json 解析 Zap JSON 日志 stage: {json: {expressions: {level: level, ts: ts}}}
labels 注入 Loki 标签 stage: {labels: {level: "", job: "app"}}

日志流拓扑

graph TD
    A[Zap Logger] -->|JSON over file| B[Promtail]
    B -->|HTTP/protobuf| C[Loki]
    B -->|positions.yaml| D[(WAL Disk)]
    C --> E[LogQL 查询]

第五章:未来演进:从网关到服务网格数据平面

随着微服务架构在生产环境中的深度落地,API网关的职责边界正被持续挑战。某头部电商公司在2023年双十一大促前完成关键改造:将原有基于Spring Cloud Gateway的统一入口,逐步下沉为Istio Envoy Proxy集群直连业务Pod的透明流量代理。这一变更并非简单替换组件,而是重构了流量治理的权力结构——认证鉴权、熔断限流、灰度路由等策略不再集中于单点网关,而是通过xDS协议动态分发至每个服务实例旁的Sidecar。

流量控制粒度的质变

传统网关仅能对“/order/v1/create”路径做全局QPS限制;而服务网格数据平面支持按调用链上下文精细化管控。例如,在EnvoyFilter中嵌入如下Lua逻辑,可对携带x-user-tier: platinum头且目标服务为payment的请求启用毫秒级重试:

apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
  name: platinum-retry
spec:
  configPatches:
  - applyTo: HTTP_FILTER
    match:
      context: SIDECAR_INBOUND
    patch:
      operation: INSERT_BEFORE
      value:
        name: envoy.filters.http.lua
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua
          inlineCode: |
            function envoy_on_request(request_handle)
              local tier = request_handle:headers():get("x-user-tier")
              local path = request_handle:headers():get(":path")
              if tier == "platinum" and string.match(path, "/payment/") then
                request_handle:streamInfo():setDynamicMetadata("retry", "enable", "true")
              end
            end

网络可观测性的范式迁移

当流量治理能力下沉后,监控指标采集点发生根本性位移。下表对比了两种架构下的核心指标延迟分布:

指标类型 网关架构(ms) 服务网格(ms) 差异原因
P99请求延迟 42 18 绕过网关序列化开销
故障定位耗时 3.2分钟 17秒 Envoy访问日志含全链路ID
TLS握手失败率 0.8% 0.03% mTLS双向认证自动注入

运维操作模式的重构

某金融客户将Kubernetes集群升级至v1.26后,发现原有Nginx Ingress Controller无法满足FIPS合规要求。团队采用渐进式迁移:先部署Istio 1.21并启用PILOT_ENABLE_ALPHA_GATEWAY_API=true,将Ingress资源自动转换为Gateway+VirtualService;再通过istioctl analyze --use-kubeconfig扫描存量配置,识别出23处硬编码证书路径需替换为Kubernetes Secret引用。整个过程在72小时内完成零停机切换。

安全边界的重新定义

在服务网格中,mTLS已不再是可选功能而是默认基线。某政务云平台要求所有跨AZ调用必须满足国密SM4加密,其Envoy配置片段如下:

- applyTo: CLUSTER
  patch:
    operation: MERGE
    value:
      transport_socket:
        name: envoy.transport_sockets.tls
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext
          common_tls_context:
            tls_certificate_sds_secret_configs:
            - name: "default"
              sds_config:
                api_config_source:
                  api_type: GRPC
                  grpc_services:
                  - envoy_grpc:
                      cluster_name: sds-grpc
            tls_params:
              cipher_suites: ["ECDHE-SM4-SM4"]

该平台在2024年Q1完成全部57个微服务的mTLS强制启用,网络层中间人攻击面收敛至零。

服务网格数据平面的演进正在消解传统网关的抽象层级,使每个服务实例成为自治的网络节点。

记录分布式系统搭建过程,从零到一,步步为营。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注