为了对微服务进行调查,可以尝试使用基于Golang的Go-Kit框架的Zipkin Tracer
我想做的事情。
因为在以前的帖子中,我学会了使用docker-compose在本地运行zipkin服务,所以我想尝试在Golang中注册记录到zipkin。
阅读以下内容后,您会发现在addsrv节中介绍了一个简单的示例。
- https://github.com/go-kit/kit/blob/master/examples/README.md
2. 我试过了
把源代码下载下来。
git clone https://github.com/go-kit/kit.git
cd kit/examples/addsvc/
2-2. 使用go get命令安装依赖库。
go get github.com/go-kit/kit/tracing/zipkin
go get github.com/codahale/hdrhistogram
go get github.com/prometheus/client_golang/prometheus
2-3. 编译并启动服务器。
go build
./addsvc --zipkin.collector.addr=*.*.*.*:9410
2-4. 使用curl工具向启动的服务器发送GET请求。
curl -H "Content-Type: application/json" -L "http://localhost:8001/sum" -d '{"a":10,"b":12}'
执行上述操作时,出现了以下错误信息。。
ts=2016-**-**T14:10:40Z caller=stdlib.go:89 file="http: panic serving [::1" msg="]:50391: interface conversion: interface {} is server.SumRequest, not *server.SumRequest"
2-5. 不过可以去看一下Zipkin的用户界面。
我确认了addsvc这项服务已被追踪。
可能因为最近仍有提交,这个项目可能还处在发展初期阶段。我打算再等一段时间后再来看看。
3. 我稍微看了一下醬料。
当我从main.go开始,在golang中搭建一个http服务器时,我研究了如何添加追踪器。
生成zipkin collector的变量
首先,从代码中看到,tracer本身是通过go-kit/kit/tracing/zipkin包中的zipkin.NewScribeCollector函数进行创建的。
// package tracing
var collector zipkin.Collector
{
zipkinLogger := log.NewContext(logger).With("component", "zipkin")
collector = loggingCollector{zipkinLogger} // TODO(pb)
if *zipkinCollectorAddr != "" {
var err error
if collector, err = zipkin.NewScribeCollector(
*zipkinCollectorAddr,
*zipkinCollectorTimeout,
zipkin.ScribeBatchSize(*zipkinCollectorBatchSize),
zipkin.ScribeBatchInterval(*zipkinCollectorBatchInterval),
zipkin.ScribeLogger(zipkinLogger),
); err != nil {
zipkinLogger.Log("err", err)
os.Exit(1)
}
}
}
追踪HTTP请求
我大概了解上述内容可能是由HTTP请求发送的,虽然我只是粗略地猜测着。
-
- 在处理的服务器和持续时间开始方面,使用zipkin.AnnotateServer(newSumSpan, collector)(sum)来处理。
- 在net/http的mux.Handler中,使用zipkint的transport/http包的函数来捕获结束情况。
我得到了一种类似的感觉。
var (
transportLogger = log.NewContext(logger).With("transport", "HTTP/JSON")
tracingLogger = log.NewContext(transportLogger).With("component", "tracing")
newSumSpan = zipkin.MakeNewSpanFunc(*zipkinHostPort, *zipkinServiceName, "sum")
newConcatSpan = zipkin.MakeNewSpanFunc(*zipkinHostPort, *zipkinServiceName, "concat")
traceSum = zipkin.ToContext(newSumSpan, tracingLogger)
traceConcat = zipkin.ToContext(newConcatSpan, tracingLogger)
mux = http.NewServeMux()
sum, concat endpoint.Endpoint
)
sum = makeSumEndpoint(svc)
sum = zipkin.AnnotateServer(newSumSpan, collector)(sum)
mux.Handle("/sum", httptransport.NewServer(
root,
sum,
server.DecodeSumRequest,
server.EncodeSumResponse,
httptransport.ServerBefore(traceSum),
httptransport.ServerErrorLogger(transportLogger),
))
4. 感受
-
- Golangでもできるんだー、と思いました。Elixir/Phoenixでもできないのかな。
net/httpでrouteごとに上記のように実装するのはちょっと冗長かも、と思いました。
go getが動かずに動作確認できませんでしたが、go-zipkinだと上記のような冗長な箇所が解消されているのかな、とちょっと期待。ソース見てみよー。
いろいろ眺めてみたけれど満足に動くライブラリとかサンプルが少ないような。。みんなトレーシングはfluentなどのロギングベースでいくのかな。mix inとかDIみたいにさりげなくzipkinのような仕組みをフレームワークに組み込めたら素敵だと思うのだけれども。。。
5. 参照
-
- https://golang.org/pkg/net/http/#NewServeMux
- https://github.com/go-kit/kit
今天就到这里。