分布式追踪实战

请求过程

ingress --> democlient-->demoserver

build

GOOS=linux go build demo-client.go

GOOS=linux go build demo-server.go

deploy

mv demo-client demo-server /opt/
kubectl create -f demo.yaml
apiVersion: v1
kind: Service
metadata:
  name: demoserver
  labels:
    app: demoserver
spec:
  ports:
  - port: 9001
    name: http
    protocol: TCP
    targetPort: 9001
  selector:
    app: demoserver
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: demoserver-v1
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: demoserver
        version: v1
    spec:
      containers:
      - args:
        - /opt/demo-server
        image: tomcat
        imagePullPolicy: Always
        name: demoserver
        ports:
        - containerPort: 9001
          protocol: TCP
        volumeMounts:
        - mountPath: /opt
          name: mountpath0
      volumes:
      - hostPath:
          path: /opt/
          type: ""
        name: mountpath0
---
apiVersion: v1
kind: Service
metadata:
  name: democlient
  labels:
    app: democlient
spec:
  ports:
  - port: 9002
    name: http
    protocol: TCP
    targetPort: 9002
  selector:
    app: democlient
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: democlient-v1
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: democlient
        version: v1
    spec:
      containers:
      - name: demo-client
        args:
        - /opt/demo-client
        - "http://demoserver:9001"
        image: tomcat
        imagePullPolicy: Always
        ports:
        - containerPort: 9002
          protocol: TCP
        volumeMounts:
        - mountPath: /opt
          name: mountpath0
      volumes:
      - hostPath:
          path: /opt/
          type: ""
        name: mountpath0
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: gateway
  annotations:
    kubernetes.io/ingress.class: "istio"
spec:
  rules:
  - http:
      paths:
      - path: /
        backend:
          serviceName: democlient
          servicePort: 9002
---
package main

import (
    "io/ioutil"
    "log"
    "net/http"
    "os"
)

var target string

func main() {
    target = os.Args[1]
    http.HandleFunc("/", gethandler)
    err := http.ListenAndServe(":9002", nil)
    if err != nil {
        log.Println(err)
    }
}

var headersToCopy = []string{
    "x-request-id",
    "x-b3-traceid",
    "x-b3-spanid",
    "x-b3-parentspanid",
    "x-b3-sampled",
    "x-b3-flags",
    "x-ot-span-context",
}

func gethandler(w http.ResponseWriter, r *http.Request) {
    client := &http.Client{}
    req, err := http.NewRequest("GET", target, nil)
    for _, h := range headersToCopy {
        log.Println(h, "  :", r.Header.Get(h))
        val := r.Header.Get(h)
        if val != "" {
            req.Header.Set(h, val)
        }
    }
    log.Println(req.Header)
    if user_cookie := r.Header.Get("user"); user_cookie != "" {
        req.Header.Set("Cookie", "user="+user_cookie)
    }
    resp, err := client.Do(req)
    if err != nil {
        log.Println(err)
        w.Write(nil)
        return
    }
    result, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        log.Println(err)
        w.Write(nil)
        return
    }
    w.Write([]byte(result))
}
package main

import (
    "log"
    "net/http"
)

func main() {
    http.HandleFunc("/", echohandler)
    err := http.ListenAndServe(":9001", nil)
    if err != nil {
        log.Println(err)
    }
}

var headersToCopy = []string{
    "x-request-id",
    "x-b3-traceid",
    "x-b3-spanid",
    "x-b3-parentspanid",
    "x-b3-sampled",
    "x-b3-flags",
    "x-ot-span-context",
}

func echohandler(w http.ResponseWriter, r *http.Request) {
    for _, h := range headersToCopy {
        log.Println(h, "  :", r.Header.Get(h))
    }
    w.Write([]byte("hellow"))
}

Last updated