go-grpc逻辑架构图
一、总体逻辑架构图五层┌────────────────────────────────────────────────────────────────────┐ │ 应用代码 / 生成的存根(.pb.go) │ │ server: pb.RegisterGreeterServer(s, impl{}) │ │ client: c.SayHello(ctx, req) │ └───────┬───────────────────────────────────────────┬────────────────┘ │ │ ════════▼═══════════════════════════════════════════▼════════════════ L1 门面层(根目录) ┌──────────────────────┐ ┌─────────────────────────────────┐ │ Server(server.go) │ │ ClientConn(clientconn.go:668) │ │ Serve/handleStream/ │ │ NewClient/Invoke/GetState/ │ │ processRPC(:1292) │ │ Connect/Close │ └──────────┬───────────┘ └───────┬─────────────────────────┘ │ 拦截器(interceptor.go,4种) │ call.go:Invoke stream.go │ stats/channelz 埋点 │ picker_wrapper.go(取货口) ════════════▼═════════════════════════════▼══════════════════════════ L2 策略层(可插拔注册表) ┌────────────────┐ ┌────────────────┐ ┌─────────────────────────┐ │ resolver/ │ │ balancer/ │ │ encoding/ credentials/ │ │ dns/passthrough│ │ pickfirst/ │ │ proto(默认)/gzip/zstd │ │ manual/xds... │ │ roundrobin/ │ │ TLS/mTLS/ALTS/insecure │ │ resolver.go:54 │ │ ringhash... │ │ Register(名字→工厂) │ │ Register注册表 │ │ balancer.go:58 │ │ │ └───────┬────────┘ └───────┬────────┘ └─────────────────────────┘ │ resolver_wrapper.go │ balancer_wrapper.go │ (门面↔策略的适配器,双向解耦) ═════════▼══════════════════════▼════════════════════════════════════ L3 传输层 internal/transport/(自研 HTTP/2,不用 net/http) ┌────────────────────────────────────────────────────────────────┐ │ ClientTransport(transport.go:714) ServerTransport(:756) │ │ http2_client.go:握手/reader/keepalive定时器/GOAWAY处理 │ │ http2_server.go:逐帧开流/流配额/MaxConnectionAge │ │ controlbuf.go:loopyWriter(:522) 每连接唯一写goroutine优先级队列 │ │ flowcontrol.go bdp_estimator.go:两级窗口动态调优 │ └───────────────────────────────┬────────────────────────────────┘ │ x/net/http2 的 Framer HPACK ═════════════════════════════════▼══════════════════════════════════ L4 字节层: HTTP/2 帧 over TCP(TLS) ════════════════════════════════════════════════════════════════════ X 横切支撑(服务所有层) metadata/status/codes(错误与带外数据) · keepalive(活性参数) stats(观测) · channelz(运行时调试树) · grpclog(日志) backoff(重连退避) · service_config.go(服务端下发的策略JSON) E 生态扩展(独立子系统) xds/(istio体系) · health/ · reflection/ · orca/(负反馈负载信息) cmd/protoc-gen-go-grpc(代码生成) · examples/(40特性样例)三条铁律依赖单向向下L2 全是注册表接口可插拔L1 与 L2 之间靠 wrapper 适配不直连。二、专题图 1客户端一次一元调用时序视角业务 门面 策略层 传输层 │ SayHello │ │ │ ├─────────────► Invoke(call.go:33) │ │ │ ├─ 拦截器链 ──────────┤ │ │ ├─ invoke ──► newClientStream │ │ │ ├──────► pick ◄─ Picker(v_n) │ │ │ (picker_wrapper) │ │ │ │ │ SubConn.selected │ │ │ ▼ │ │ │ └────────► NewStream ──► loopyWriter │ │ │ HEADERSDATA 帧 │ │ SendMsg: codec → 5B前缀 → 队列 ────────┤──► TCP │ │ │◄── 响应帧 │ ◄────────────┴─ RecvMsg: Unmarshal trailer状态 ◄────┤ reader goroutine三、专题图 2服务端 goroutine 分层并发视角Serve(server.go:906) [主] Accept循环,临时错误指数退避 └─ go handleRawConn [每连接×1] TLSHTTP2握手 → 建 transport └─ HandleStreams读循环 [每连接×1] 逐帧解析,新流回调 └─ go handleStream [每流×1 或 worker池] └─ processRPC(:1292): 拦截链 → 业务handler → 回帧 loopyWriter [每连接×1] 唯一写出者四、专题图 3连接管理联动target:dns:///svc ──► Resolver(产地址可选ServiceConfig) │ UpdateState([A,B,C]) ▼ Balancer(策略)──建──► SubConn ──Connect()──► newHTTP2Client(真实连接) │ 收SubConn状态变化,产新版本Picker ▼ 通道5态 所有SubConn状态的策略聚合 IDLE→CONNECTING→READY ⇄ TRANSIENT_FAILURE(退避重试) ; Close→SHUTDOWN五、专题图 4HTTP/2 报文解剖请求: HEADERS(:path/包.服务/方法, content-type:application/grpc, grpc-timeout) DATA[1B压缩4B长度protobuf体] 响应: HEADERS(:status200) DATA[...] trailer HEADERS(grpc-status) 多路复用: 每条RPC一个 StreamID,同一条TCP并发 流控: 连接级流级两级窗口,WINDOW_UPDATE还款,BDP动态放大六、与 zap 的架构对照同一学习路线的两站维度zapgrpc-go定位单机日志库网络RPC框架核心抽象4 小接口(Core/Encoder/WriteSyncer/LevelEnabler)4 组接口(ClientConn/Balancer/Resolver/Transport)扩展机制RegisterSink/RegisterEncoder(注册表)resolver.Register/balancer.Register(同套路)性能哲学池化零分配单写者流控聚合,为吞吐不為零分配并发模型无后台goroutine(默认)goroutine工厂:每连接/每流分层门面与内核zap包 → zapcore根目录 → internal/transport