本篇文章从服务器端角度介绍元数据相关原理。
1、服务器端一侧,是如何接收元数据的? |
我们以帧接收器作为入口分析;
进入grpc-go/internal/transport/http2_server.go文件中的HandleStreams方法里:
1.func (t *http2Server) HandleStreams(handle func(*Stream), traceCtx func(context.Context, string) context.Context) {
2. defer close(t.readerDone)
3. for {
4. t.controlBuf.throttle()
5. frame, err := t.framer.fr.ReadFrame()
6.
7. //---省略不相关代码
8. switch frame := frame.(type) {
9. case *http2.MetaHeadersFrame:
10. if t.operateHeaders(frame, handle, traceCtx) {
11. t.Close()
12. break
13. }
14.//---省略不相关代码
进入第10行,头帧处理器里: