golang环境中grpc与zipkin的集成

对于分布式系统服务,一个请求需要系统中多个模块,上百台机器配合才能完成。当进行系统调优时单靠分析日志是很难发现到系能瓶颈的,效率非常低下,为此google上线了分布式服务追踪系统Drapper。目前市面上的实现有Twitter的zipkin和阿里的鹰眼系统。最近我在做服务追踪,我们后台使用golang开发,grpc做服务通信,最终选择集成zipkin来做,这个公开资料比较少,写文章来总结一下,方便后来者。

一、首先zipkin的安装使用

1、下载

wget -O zipkin.jar ‘https://search.maven.org/remote_content?g=io.zipkin.java&a=zipkin-server&v=LATEST&c=exec‘

2、运行

java -jar zipkin.jar

3、在浏览器查看

http://localhost:9411    9411是zipkin默认端口

4、效果图如下:

对三个模块间的grpc通信做了追踪,请求的调用路径是这样的client---》server---》cache,从上面的图可以清楚看到每个模块出来花了多少时间。

二、例子的代码大概说明,以server为例,因为这个模块既包含server端也包含client端

代码可以在github上下载,路径:https://github.com/chukuang2004/gotest/tree/master/zipkin

使用到的第三方库有这三个

github.com/opentracing/opentracing-go

github.com/openzipkin/zipkin-go-opentracing

github.com/grpc-ecosystem/grpc-opentracing/go/otgrpc

1、server响应代码

func main() {

collector, err := zipkin.NewHTTPCollector("http://localhost:9411/api/v1/spans")
if err != nil {
log.Fatal(err)
return
}

tracer, err := zipkin.NewTracer(
zipkin.NewRecorder(collector, false, "localhost:0", "grpc_server"),
zipkin.ClientServerSameSpan(true),
zipkin.TraceID128Bit(true),
)
if err != nil {
log.Fatal(err)
return
}
opentracing.InitGlobalTracer(tracer)

lis, err := net.Listen("tcp", port)
if err != nil {
log.Fatalf("failed to listen: %v", err)
}

s := grpc.NewServer(grpc.UnaryInterceptor(otgrpc.OpenTracingServerInterceptor(tracer, otgrpc.LogPayloads())))
pb.RegisterAddServer(s, &AddServer{})
s.Serve(lis)
}

2、请求cache的代码,这个要注意的是新的请求使用的tracer和context要与之前的server的保持一致,这里面保存了一个调研链路里全剧唯一的tracerid

func (s *AddServer) DoAdd(ctx context.Context, in *pb.AddRequest) (*pb.AddReply, error) {

log.Printf("input %d %d", in.GetNum1(), in.GetNum2())

time.Sleep(time.Duration(10) * time.Millisecond)

tracer := opentracing.GlobalTracer()
val := cache.GetCache(ctx, tracer, in.GetNum1())
log.Printf("cache value %d", val)

return &pb.AddReply{Result: val + in.GetNum2()}, nil
}

func GetCache(ctx context.Context, tracer opentracing.Tracer, id int32) int32 {

conn, err := grpc.Dial(address, grpc.WithInsecure(), grpc.WithUnaryInterceptor(otgrpc.OpenTracingClientInterceptor(tracer)))
if err != nil {
log.Fatalf("did not connect: %v", err)
}
defer conn.Close()
c := pb.NewCacheClient(conn)

// Contact the server and print out its response.
r, err := c.Get(ctx, &pb.CacheRequest{Id: id})
if err != nil {
log.Fatalf("could not greet: %v", err)
return -1
}

return r.GetResult()
}

3、写的比较简单,因为细节太多,在一篇博客里没法一一说明,我懒癌复发了,但是把我的例子修改调试着感受一下,再看看三个库的文档,google drapper的论文基本也就明白了,推荐看一下这篇文章,他们貌似自己做了一套tracer,没有用开源的,当然也欢迎找我讨论。

http://www.cnblogs.com/zhengyun_ustc/p/55solution2.html

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; color: #e4af09 }

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; color: #e4af09 }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; color: #454545; min-height: 14.0px }
p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; color: #454545 }
span.s1 { color: #454545 }
span.s2 { color: #e4af09 }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; color: #e4af09 }

时间: 2024-08-25 07:25:47

golang环境中grpc与zipkin的集成的相关文章

.NET程序员项目开发必知必会—Dev环境中的集成测试用例执行时上下文环境检查(实战)

Microsoft.NET 解决方案,项目开发必知必会. 从这篇文章开始我将分享一系列我认为在实际工作中很有必要的一些.NET项目开发的核心技术点,所以我称为必知必会.尽管这一些列是使用.NET/C#来展现,但是同样适用于其他类似的OO技术平台,这些技术点可能称不上完整的技术,但是它是经验的总结,是掉过多少坑之后的觉醒,所以有必要花几分钟时间记住它,在真实的项目开发中你就知道是多么的有帮助.好了,废话不说了,进入主题. 我们在开发服务时为了调试方便会在本地进行一个基本的模块测试,你也可以认为是集

在VS2103环境中集成Doxygen工具

自己已将学习了两三次了吧,差不多这次该总结一下: Doxygen是一种开源跨平台的,以类似JavaDoc风格描述的文档系统,完全支持C.C++.Java.Objective-C和IDL语言,部分支持PHP.C#.注释的语法与Qt-Doc.KDoc和JavaDoc兼容.Doxgen可以从一套归档源文件开始,生成HTML格式的在线类浏览器,或离线的LATEX.RTF参考手册. Doxygen 是一个程序的文件产生工具,可将程序中的特定批注转换成为说明文件.通常我们在写程序时,或多或少都会写上批注,但

将CKEditor集成到Java开发环境中

本文主要介绍如何将CKEditor集成到Java开发环境中,CKEditor是FCKEditor的升级版,使用很方便.下面是基本使用方法: 第一步:下载必要的库 1.到CKEditor官网http://www.fckeditor.net/download/下载Ckeditor4.0.2,这是目前最新的版本,4.1马上就出来了. 2.找到CKEditor 3.6.4 for Java,download.jar按钮,下载ckeditor-java-core-3.5.3.zip,这是java集成的ja

让你提前认识软件开发(51):VC++集成开发环境中Linux下Pclint工程的配置方法及常见错误修改

第3部分 软件研发工作总结 VC++集成开发环境中Linux下Pclint工程的配置方法及常见错误修改 [文章摘要] Pclint是一种C/C++软件代码静态分析工具.它是一种更加严格的编译器,能够发现普通编译器所不能发现的代码中的很多问题,因此被广泛应用于软件开发项目中. 本文介绍了如何在VC++集成开发环境中配置Linux下的Pclint工程,给出了C语言中pclint规则A检查的常见错误,并描述了对应的修改办法. [关键词] VC++  Pclint  配置  操作  修改 1. 前言 P

当用Myeclipse8.6集成开发环境,进行JavaWeb项目开发的时候,用集成开发环境中的run Server进行程序调试时,出现如下错误解决方案

当用Myeclipse8.6集成开发环境,进行JavaWeb项目开发的时候,用集成开发环境中的run Server进行程序调试时,出现如下错误解决方案: 'Starting Tomcat v6.0 Server at localhost'has encountered a problem 错误提示: Several ports(8080,8009)required by Tomcatv6.0 Server at localhost are already in use.The server ma

不允许用(a+b)/2这种方式求两个数的均值;如下程序在Linux和32位集成开发环境中运行

#define MAX(a,b) ((a)>(b)?(a):(b)) #include<stdio.h> int main() { int a = 10; int b = 20; int c = 0; int arevage = 0; c = MAX(a,b); arevage = c + (a - b)/2; printf("%d\n",arevage); return 0; } arevage可以用来定义变量吗 为什么 int arevage = 0;可以在win

在域信任环境中使用 Team Foundation Server (TFS 2013)

原文:在域信任环境中使用 Team Foundation Server (TFS 2013) 1. 用户情景和方案: XX公司的大部分软件产品通过软件外包的方式由开发商完成.为加强对软件开发的进度和质量管理,XX公司部署了一套基于微软TFS 2013的研发平台,并将这个平台与活动目录域test.local集成在一起,在 test.local中为所有软件外包人员创建了登陆账户. 但是XX公司内部已经部署了一套用于企业管理的活动目录域test2.local.为了避免在研发环境的域(test.loca

在CodeBlocks 开发环境中配置使用OpenCV (ubuntu系统)

CodeBlocks是一个开放源代码的全功能的跨平台C/C++集成开发环境.CodeBlocks由纯粹的C++语言开发完毕,它使用了蓍名的图形界面库wxWidgets.对于追求完美的C++程序猿,再也不必忍受Eclipse的缓慢,再也不必忍受VS.NET的庞大和高昂的价格.界面简单.易操作.可以非常好得通过插件进行功能扩展,因此我个人比較喜欢这个C++IDE.为了可以在codeblocks中使用opencv.仿照VS2010配置opencv的步骤.在CodeBlocks 开发环境中配置使用Ope

深入探讨在集群环境中使用 EhCache 缓存系统

EhCache 缓存系统简介 EhCache 是一个纯 Java 的进程内缓存框架,具有快速.精干等特点,是 Hibernate 中默认的 CacheProvider. 下图是 EhCache 在应用程序中的位置: 图 1. EhCache 应用架构图 EhCache 的主要特性有: 快速: 简单: 多种缓存策略: 缓存数据有两级:内存和磁盘,因此无需担心容量问题: 缓存数据会在虚拟机重启的过程中写入磁盘: 可以通过 RMI.可插入 API 等方式进行分布式缓存: 具有缓存和缓存管理器的侦听接口