专业做衬衫哪个网站,专业网站建设联系电话,东营信息网,建站 报价关于Zipkin
Zipkin是一款开源的分布式实时数据追踪系统(Distributed Tracking System)#xff0c;能够收集服务间调用的时序数据#xff0c;提供调用链路的追踪。Zipkin每一个调用链路通过一个trace id来串联起来#xff0c;通过trace id#xff0c;就能够直接定位到这次调…关于Zipkin
Zipkin是一款开源的分布式实时数据追踪系统(Distributed Tracking System)能够收集服务间调用的时序数据提供调用链路的追踪。Zipkin每一个调用链路通过一个trace id来串联起来通过trace id就能够直接定位到这次调用链路并且可以根据服务名、标签、响应时间等进行查询找出哪些耗时比较长的链路节点。
当用户发起一次调用时Zipkin的客户端(Brave)会在入口处为整条调用链路生成一个全局唯一的trace id 一个trace id代表一个完整的调用链。一个trace内部包含多个span。
Zipkin为一条链路中的每一次分布式调用生成一个span id。一个trace由一组span组成一个trace中的所有span是一个树形结构树的根节点叫做root span。除root span外其他span都会包含一个parent Id表示父级span的span Id。
每个span中包含多个Annotation用来记录关键事件的时间点。
ZipKin 可以分为两部分
ZipKin Server 用来作为数据的采集存储、数据分析与展示ZipKin Client 基于不同的语言及框架封装的一些列客户端工具这些工具完成了追踪数据的生成与上报功能。
ZipKin Server
Zipkin支持的存储类型有inMemory(默认)、MySQL、Cassandra、以及ElasticsSearch几种方式正式环境推荐使用Cassandra和ElasticSearch。
要使用ZipKin Server非常简单通过https://repo1.maven.org/maven2/io/zipkin/zipkin-server/下载zipkin-server-x.xx-exec.jar文件然后执行即可:
# java -jar zipkin-server-3.4.2-exec.jar
...
2024-11-08T11:15:47.48408:00 INFO [/] 2450 --- [oss-http-*:9411] c.l.a.s.Server : Serving HTTP at /[0:0:0:0:0:0:0:0]:9411 - http://127.0.0.1:9411/说明: 如果不指定参数zipkin server不存储跟踪数据(inMemory) , 可以通过--STORAGE_TYPE参数指定支持的持久化存储。ZipKin Client
Brave是ZipKin客户端的库文件在我们编写的代码中使用用于将我们的埋点信息上报到Zipkin服务器端通常框架会整合Brave。
vertx-zipkin
Vert.x通过Zipkin Brave整合了Zipkin提供了一个开箱即用的组件vertx-zipkin可以让我们轻松的使用Zipkin跟踪Vertx编写的服务的调用。
首先需要添相关依赖添:
dependencygroupIdio.vertx/groupIdartifactIdvertx-zipkin/artifactIdversion4.5.10/version
/dependency使用vertx-zipkin非常简单只要为Vertx实例指定相应的zipkin跟踪配置(ZipkinTracingOptions)即可
import io.vertx.core.Vertx;
import io.vertx.core.VertxOptions;
import io.vertx.core.http.HttpMethod;
import io.vertx.core.http.HttpServer;
import io.vertx.core.http.HttpServerResponse;
import io.vertx.core.json.JsonArray;
import io.vertx.core.json.JsonObject;
import io.vertx.ext.web.Router;
import io.vertx.mysqlclient.MySQLBuilder;
import io.vertx.mysqlclient.MySQLConnectOptions;
import io.vertx.sqlclient.PoolOptions;
import io.vertx.sqlclient.Row;
import io.vertx.sqlclient.SqlClient;
import io.vertx.sqlclient.Tuple;
import io.vertx.tracing.zipkin.HttpSenderOptions;
import io.vertx.tracing.zipkin.ZipkinTracingOptions;public class API01 {public static void main(String[] args) {String senderEndpoint http://172.18.240.73:9411/api/v2/spans; // zipkin serverVertx vertx Vertx.vertx(new VertxOptions().setTracingOptions(new ZipkinTracingOptions().setSenderOptions(new HttpSenderOptions().setSenderEndpoint(senderEndpoint)).setServiceName(API01))); // 必须指定唯一的服务名MySQLConnectOptions connectOptions new MySQLConnectOptions().setHost(127.0.0.1).setPort(3306).setUser(root).setPassword(Passw0rd).setDatabase(hr).setConnectTimeout(2000).addProperty(autoReconnect, true).addProperty(useSSL,false).addProperty(rewriteBatchedStatements, true);PoolOptions poolOptions new PoolOptions().setMaxSize(5);SqlClient client MySQLBuilder.client().using(vertx).with(poolOptions).connectingTo(connectOptions).build();HttpServer server vertx.createHttpServer();Router router Router.router(vertx);router.route(HttpMethod.GET, /api/v2/api01/:empNo).handler(routingContext -{String en routingContext.pathParam(empNo);int empNo 0;try {empNo Integer.parseInt(en);} catch(Exception e) {}String sqlText select empno, ename, job from emp where empno ?;client.preparedQuery(sqlText).execute(Tuple.of(empNo)).onSuccess(rows - {JsonArray result new JsonArray();for (Row row : rows) {JsonObject json row.toJson();result.add(json);}HttpServerResponse response routingContext.response();response.putHeader(content-type, application/json);response.end(result.toString());}).onFailure(exception - {routingContext.fail(exception);});});server.requestHandler(router).listen(8001);}
}启动并调用我们编写的接口即可在zipkin服务端跟踪我们的调用信息。
访问zipkin服务器http://172.18.240.73:9411/zipkin/“点击Find a trace” - 点红色的“号图标指定serviceName”然后点击RUN QUERY按钮进行查询。 可以看到本次api01调用耗时5.583ms其中数据库耗时3.407ms。没有其它分布式调用。
设计一个复杂的案例假设有一个接口api04在api04中分别调用api03和api02接口而在api02中又调用api01接口。调用http://127.0.0.1:8004/api/v2/api04 来看看zipkin跟踪效果: 是不是很酷整个调用链都清晰的显示出来可以非常直观的看到api04的耗时包括其内部分布式子调用的顺序和耗时而我们要做的仅仅是添加几行zipkin配置代码。完整案例代码见文章顶部。