原文地址:引入gRPC:分布式链接跟踪gRPC+Opentracing+Zipkin项目地址:https://github.com/EDDYCJY/go..前言在实际应用中,你做了那么多Server,写了N个RPC方法。想查看您的方法的指标,但无从下手?本文将通过gRPC+Opentracing+Zipkin搭建分布式链路追踪系统,查看整个系统的链路、性能等指标。什么是开放追踪?通过提供独立于平台和供应商的API,开发人员可以轻松添加(或替换)跟踪系统的实现,但OpenTracing不是标准。因为CNCF不是官方的标准体,但它的目标是为分布式追踪创建一个更标准的API和工具术语在分布式系统中完成的工作单元。还包含对其他span的“引用”,它允许将多个span组合成一个完整的Trace。每个span按照OpenTracing规范封装了如下内容:operationnamestarttimeandendtimekey:valuespanTagskey:valuespanLogsSpanContextTagsSpan标签(span标签)可以理解为用户自定义的Span注释。便于查询、过滤和理解跟踪数据LogSpan日志(spanlogs)可以记录一个Span内特定时间或事件的日志信息。主要用于抓取特定Span的日志信息以及应用本身的其他调试或信息输出。SpanContextSpanContext表示跨进程边界传递给子Span的状态。在跟踪图中创建上下文时经常使用BaggageItems。BaggageItems可以理解为traceglobal操作过程中传输的额外数据集合。在一个案例图中,可以看到如下内容:执行时间上下文服务之间的层级关系,服务之间的串行或并行调用结合以上信息,在实际场景中,我们可以一下子找出系统的痛点在哪里通过整个系统调用链的上下文、性能等指标信息。什么是Zipkin?Zipkin是一个分布式跟踪系统。它的作用是收集解决微服务架构中的延迟问题所需的时序数据。它管理这些数据的收集和查找。Zipkin的设计基于GoogleDapper论文。运行dockerrun-d-p9411:9411openzipkin/zipkin其他安装方法参考:https://github.com/openzipkin...验证访问http://127.0.0.1:9411/zipkin/查看是否有Zipkin正常运行gRPC+Opentracing+Zipkin在上一节中,我们做了以下准备工作:了解Opentracing是什么,构建Zipkin,提供分布式跟踪系统的功能,然后实现gRPC通过Opentracing标准API连接到Zipkin,然后用Zipkin查看数据目录结构,新建一个simple_zipkin_client、simple_zipkin_server目录,目录结构如下:go-grpc-example├──LICENSE├──README.md├──client│├──...│├──simple_zipkin_client├──conf├──pkg├───proto├──服务器│├──...│├──simple_zipkin_server└──供应商安装$goget-ugithub.com/openzipkin/zipkin-go-opentracing$goget-ugithub.com/grpc-ecosystem/grpc-opentracing/go/otgrpcgRPCServerpackagemainimport("上下文"“日志”“网络”“github.com/grpc-ecosystem/go-grpc-middleware”“github.com/grpc-ecosystem/grpc-opentracing/go/otgrpc”zipkin“github.com/openzipkin/zipkin-go-opentracing""google.golang.org/grpc""github.com/EDDYCJY/go-grpc-example/pkg/gtls"pb"github.com/EDDYCJY/go-grpc-example/proto")typeSearchServicestruct{}func(s*SearchService)Search(ctxcontext.Context,r*pb.SearchRequest)(*pb.SearchResponse,error){返回&pb.SearchResponse{Response:r.GetRequest()+"Server"},nil}const(PORT="9005"SERVICE_NAME="simple_zipkin_server"ZIPKIN_HTTP_ENDPOINT="http://127.0.0.1:9411/api/v1/spans"ZIPKIN_RECORDER_HOST_PORT="127.0.0.1:9000")funcmain(){收集器,err:=zipkin.NewHTTPCollector(ZIPKIN_HTTP_ENDPOINT)iferr!=nil{log.Fatalf("zipkin.NewHTTPCollectorerr:%v",err)}recorder:=zipkin.NewRecorder(collector,true,ZIPKIN_RECORDER_HOST_PORT,SERVICE_NAME)tracer,err:=zipkin.NewTracer(recorder,zipkin.ClientServerSameSpan(false),)iferr!=nil{log.Fatalf("zipkin.NewTracererr:%v",错误)}tlsServer:=gtls.Server{CaFile:"../../conf/ca.pem",CertFile:"../../conf/server/server.pem",KeyFile:"../../conf/server/server.key",}c,err:=tlsServer.GetCredentialsByCA()iferr!=nil{log.Fatalf("GetTLSCredentialsByCA错误:%v",err)}opts:=[]grpc.ServerOption{grpc.Creds(c),grpc_middleware.WithUnaryServerChain(otgrpc.OpenTracingServerInterceptor(tracer,otgrpc.LogPayloads()),),}...}zipkin.NewHTTPCollector:创建一个ZipkinHTTP后端收集器zipkin.NewRecorder:基于Zipkin收集器创建记录器zipkin.NewTracer:创建OpenTracing跟踪器(兼容ZipkinTracer)otgrpc.OpenTracingClientInterceptor:返回grpc.UnaryServerInterceptor,不同的是拦截器会在LookforgRPCMetadata中的OpenTracingSpanContext,如果找到,则为服务SpanContext的子节点它是InitializesZipkin,它又包含收集器、记录器和跟踪器。然后在server端使用拦截器实现SpanContext和Payload的双向读取和管理Clientfuncmain(){//同zipkinserver//...conn,err:=grpc.Dial(":"+PORT,grpc.WithTransportCredentials(c),grpc.WithUnaryInterceptor(otgrpc.OpenTracingClientInterceptor(tracer,otgrpc.LogPayloads()),))...}otgrpc.OpenTracingClientInterceptor:返回grpc.UnaryClientInterceptor。拦截器的核心功能是:(1)OpenTracingSpanContext注入gRPCMetadata(2)在context.Context中查看上下文关系,如果有父Span,则创建ChildOf引用,获取子Span等方面,服务器端一致,先初始化Zipkin,再添加客户端特殊需要的拦截器。可以完成基本工作。验证并启动Server.go,执行Client.go。看一下http://127.0.0.1:9411/zipkin/的示意图:比较复杂,自己实践一下,在多服务架构下总结一下。串行、并行和服务集服务是很常见的情况。使用常规的解决方案往往很难找到问题出在哪里(代价太大)。而这种情况正是分布式跟踪系统大显身手的机会。希望大家通过本章的介绍和学习,能够理解它的概念,搭建并应用一个跟踪系统。参考本系列示例代码go-grpc-example系列目录带导入gRPC:gRPC及相关介绍导入gRPC:gRPCClientandServer导入gRPC:gRPCStreaming,ClientandServer导入gRPC:TLS证书认证导入gRPC:CA-基于TLS证书认证引入gRPC:一元和流拦截器引入gRPC:让你的服务同时提供HTTP接口引入gRPC:对RPC方法做自定义认证引入gRPC:gRPCDeadlines引入gRPC:分布式链路跟踪gRPC+Opentracing+Zipkin数据opentracingzipkin
