Fremount 2024-04-13 08:34 采纳率: 11.1%
浏览 6

获取分布式的请求响应内容

就是在k8s环境中,部署了一个微服务系统,这个系统包含多个微服务,现在我想获取对这个系统的请求的调用链数据,也就是指定请求所涉及到的各个微服务的请求与响应以及依赖,请问这个在go中能实现吗,如果能实现的话请给出涉及到的技术与详细步骤,我试过了分布式追踪,追踪不到具体的请求和响应,如果需要追踪的话需要侵入代码,我不希望用侵入式的方案。

  • 写回答

6条回答 默认 最新

  • Kwan的解忧杂货铺 Java领域优质创作者 2024-04-16 13:08
    关注

    下午好🌅🌅🌅
    本答案参考ChatGPT-3.5

    好的,针对这个问题,我可以给您提供以下解决方案:

    1. 使用Sidecar容器模式

    Sidecar模式是将业务容器与追踪组件容器(如jaeger-agent)放在同一个pod内,实现追踪的方式。您可以在每个微服务容器中加入一个用于追踪的Sidecar容器,这样就可以对整个系统进行追踪了。Sidecar容器可以使用官方的Jaeger-Client库,它提供了API来记录请求和响应的传输信息。这种方式不需要修改微服务业务代码。

    1. 使用Envoy代理

    Envoy是一个开源的高性能代理,可以在数据平面上修改网络流量。可以在每个微服务前加一个Envoy代理,将所有的请求发送到一个集中的追踪系统(如Jaeger或Zipkin)中进行追踪。Envoy代理可以配置为记录请求和响应的传输信息,并将数据发送到后端。

    1. 使用OpenTelemetry

    OpenTelemetry是一个开源的分布式追踪和度量框架,可以跨多个编程语言(包括Go)进行使用。使用OpenTelemetry API记录和传输请求和响应的信息,然后使用OpenTelemetry后端(如Jaeger或Zipkin)进行存储和分析。这样就可以实现对整个系统的追踪。

    以上三种方式都可以实现在不侵入代码的情况下,对整个系统进行追踪,您可以根据自己的需求选择其中的一种方式进行实现。

    在这里,为了更好地说明具体实现过程,我们以第一种方式为例,给出一些实现的具体步骤。

    1. 在每个微服务的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"
            ]
    
    1. 在每个微服务中使用官方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))
    
    1. 配置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
    
    1. 访问Jaeger UI,查看追踪数据。在浏览器中打开http:///,即可看到所有的服务追踪数据。

    希望这些步骤有助于您实现对整个微服务系统的追踪。

    评论

报告相同问题?

问题事件

  • 创建了问题 4月13日

悬赏问题

  • ¥15 单片机学习顺序问题!!
  • ¥15 ikuai客户端多拨vpn,重启总是有个别重拨不上
  • ¥20 关于#anlogic#sdram#的问题,如何解决?(关键词-performance)
  • ¥15 相敏解调 matlab
  • ¥15 求lingo代码和思路
  • ¥15 公交车和无人机协同运输
  • ¥15 stm32代码移植没反应
  • ¥15 matlab基于pde算法图像修复,为什么只能对示例图像有效
  • ¥100 连续两帧图像高速减法
  • ¥15 如何绘制动力学系统的相图