Kratos 元信息傳遞

2022-04-24 14:07 更新

元信息傳遞

微服務(wù)之間將會(huì)通過(guò) HTTP 和 gRPC 進(jìn)行接口交互,所以服務(wù)架構(gòu)需要統(tǒng)一 Metadata 傳遞使用。 目前 gRPC 中也可以攜帶 Metadata 傳遞,原理是放到 HTTP Header 中,然后上游將會(huì)收到對(duì)應(yīng)的 Metadata 信息。 所以設(shè)計(jì)上,也是通過(guò) HTTP Header 進(jìn)行傳遞,在框架中先通過(guò) metadata 包封裝成key/value結(jié)構(gòu),然后攜帶到 Transport Header 中。

默認(rèn)格式規(guī)范

  • x-md-global-xxx,全局傳遞,例如 mirror/color/criticality
  • x-md-local-xxx,局部傳遞,例如 caller

也可以在 middleware/metadata 定制自己的 key prefix,配置固定的元信息傳遞

使用方式

首先配置 client/server 對(duì)應(yīng)的 middleware/metadata 插件,然后可以自定義傳遞 key prefix,或者 metadata 常量,例如 caller。 最后可以通過(guò) metadata 包中的 ?NewClientContext ?或者 ?FromServerContext ?進(jìn)行配置或者獲取。

注冊(cè) metadata 中間件

// https://github.com/go-kratos/examples/tree/main/metadata

// 注冊(cè) metadata 中間件到 gRPC 或 HTTP 的 server 或 client 中

// server
grpcSrv := grpc.NewServer(
    grpc.Address(":9000"),
    grpc.Middleware(
        metadata.Server(),
    ),
)
httpSrv := http.NewServer(
    http.Address(":8000"),
    http.Middleware(
        metadata.Server(),
    ),
)

// client
conn, err := grpc.DialInsecure(
    context.Background(),
    grpc.WithEndpoint("127.0.0.1:9000"),
    grpc.WithMiddleware(
        metadata.Client(),
    ),
)

獲取 metadata 字段的值

if md, ok := metadata.FromServerContext(ctx); ok {
    extra = md.Get("x-md-global-extra")
}

傳遞 metadata

ctx = metadata.AppendToClientContext(ctx, "x-md-global-extra", "2233")


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)