就是在k8s环境中,部署了一个微服务系统,这个系统包含多个微服务,现在我想获取对这个系统的请求的调用链数据,也就是指定请求所涉及到的各个微服务的请求与响应以及依赖,请问这个在go中能实现吗,如果能实现的话请给出涉及到的技术与详细步骤,我试过了分布式追踪,追踪不到具体的请求和响应,如果需要追踪的话需要侵入代码,我不希望用侵入式的方案。
6条回答 默认 最新
关注 下午好🌅🌅🌅
本答案参考ChatGPT-3.5好的,针对这个问题,我可以给您提供以下解决方案:
- 使用Sidecar容器模式
Sidecar模式是将业务容器与追踪组件容器(如jaeger-agent)放在同一个pod内,实现追踪的方式。您可以在每个微服务容器中加入一个用于追踪的Sidecar容器,这样就可以对整个系统进行追踪了。Sidecar容器可以使用官方的Jaeger-Client库,它提供了API来记录请求和响应的传输信息。这种方式不需要修改微服务业务代码。
- 使用Envoy代理
Envoy是一个开源的高性能代理,可以在数据平面上修改网络流量。可以在每个微服务前加一个Envoy代理,将所有的请求发送到一个集中的追踪系统(如Jaeger或Zipkin)中进行追踪。Envoy代理可以配置为记录请求和响应的传输信息,并将数据发送到后端。
- 使用OpenTelemetry
OpenTelemetry是一个开源的分布式追踪和度量框架,可以跨多个编程语言(包括Go)进行使用。使用OpenTelemetry API记录和传输请求和响应的信息,然后使用OpenTelemetry后端(如Jaeger或Zipkin)进行存储和分析。这样就可以实现对整个系统的追踪。
以上三种方式都可以实现在不侵入代码的情况下,对整个系统进行追踪,您可以根据自己的需求选择其中的一种方式进行实现。
在这里,为了更好地说明具体实现过程,我们以第一种方式为例,给出一些实现的具体步骤。
- 在每个微服务的pod中加入一个Sidecar容器,用于追踪。例如,在Kubernetes环境中,可以使用Kubernetes Deployment或DaemonSet定义Pod,示例如下:
apiVersion: apps/v1 kind: Deployment metadata: name: my-service spec: selector: matchLabels: app: my-service template: metadata: labels: app: my-service spec: containers: - name: my-service image: my-service:latest # set up my-service container - name: jaeger-sidecar image: jaegertracing/jaeger-agent args: [ "--reporter.grpc.host-port=jaeger-collector:14250", "--log-level=debug" ]
- 在每个微服务中使用官方Jaeger-Client库(或其他支持的追踪库)记录请求和响应的传输信息。示例如下:
import ( "github.com/opentracing/opentracing-go" "github.com/uber/jaeger-client-go" ) // Initialize Jaeger tracer cfg := jaegercfg.Configuration{ // ... set up or load from environment variable } tracer, _ := cfg.NewTracer() // Create span from incoming request spanCtx, _ := tracer.Extract(opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier(req.Header)) span := tracer.StartSpan("my-handler", ext.RPCServerOption(spanCtx)) // Add tags and log span.SetTag("http.method", r.Method) span.SetTag("http.url", r.URL.Path) span.SetTag("http.status_code", status) span.LogFields(log.String("event", "request-handled")) // Inject span context and finish span after response is sent defer span.Finish() // Pass span context to downstream services in outgoing requests req, _ := http.NewRequest("GET", "http://downstream-service", nil) tracer.Inject(span.Context(), opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier(req.Header))
- 配置Jaeger Collector和UI,收集和展示追踪数据。可以使用以下commands在Kubernetes环境中部署Jaeger Collector和UI:
$ kubectl create namespace observability $ kubectl create -n observability -f https://raw.githubusercontent.com/jaegertracing/jaeger-kubernetes/master/jaeger-production-template.yml # Wait for all pods to become ready $ kubectl get pods -n observability
- 访问Jaeger UI,查看追踪数据。在浏览器中打开http:///,即可看到所有的服务追踪数据。
希望这些步骤有助于您实现对整个微服务系统的追踪。
解决 无用评论 打赏 举报
悬赏问题
- ¥15 单片机学习顺序问题!!
- ¥15 ikuai客户端多拨vpn,重启总是有个别重拨不上
- ¥20 关于#anlogic#sdram#的问题,如何解决?(关键词-performance)
- ¥15 相敏解调 matlab
- ¥15 求lingo代码和思路
- ¥15 公交车和无人机协同运输
- ¥15 stm32代码移植没反应
- ¥15 matlab基于pde算法图像修复,为什么只能对示例图像有效
- ¥100 连续两帧图像高速减法
- ¥15 如何绘制动力学系统的相图