分布式追踪实战
请求过程
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