Распространение идентификационных данных в межсервисной связи - PullRequest
1 голос
/ 15 апреля 2019

Я работаю над несколькими микро-сервисами gRPC и использую контекст для передачи любых заголовков и метаданных.Я использую opentracing для целей трассировки, и одна из моих служб gRPC вызывает другую службу gRPC, и в этот момент у меня возникают проблемы с распространением контекста, поскольку он не сохраняет метаданные, а также traceID.Мой код такой, как показано ниже

func A(ctx context.Context) {
    metadata:=extractMetadata(ctx)
    conn := &grpc.ClientConn{}
    zipkinCtx := opentracing.SpanFromContext(ctx).Context().(gozipkin.SpanContext)
    client := pb.NewDClient(conn)

    reply, err := client.LookupProperty(metadata.NewOutgoingContext(context.Background(), metadata.New(metadata)))
}

. В приведенном выше коде я вызываю службу D, для которой мне пришлось воссоздать новый контекст с метаданными, с которыми у меня все в порядке, но я не уверен, как яможет распространять tracIds на сервис D

Ответы [ 2 ]

1 голос
/ 15 апреля 2019

Не зная ваших фреймворков, я думаю, что для распространения этого в метаданных GRPC ваш сервер должен явно анализировать метаданные при получении вызова. GRPC документация показывает пример этого:

func (s *server) LookupProperty(ctx context.Context, in *pb.SomeRequest) (*pb.SomeResponse, err) {
    md, ok := metadata.FromIncomingContext(ctx)
    // do something with metadata
}

При использовании этого сервера теперь должен быть доступ к Traceid; содержится в «MD».

0 голосов
/ 17 апреля 2019

Я не совсем уверен, но кажется, что traceID должно быть настраиваемым полем в метаданных GRPC. Также обратите внимание на перехватчики GRPC, которые обеспечивают поддержку Opentracing как на стороне сервера, так и на стороне клиента: https://github.com/grpc-ecosystem/go-grpc-middleware/tree/master/tracing/opentracing. Возможно, вам не придется писать свои собственные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...