一行代码无缝接入链路跟踪

本文介绍了如何在基于Kitex的RPC微服务中无缝接入OpenTelemetry的链路跟踪,实现简单快捷的插拔式服务监控。通过在服务端和客户端添加少量代码,即可完成链路跟踪的集成,便于查看和定位分布式架构中的调用问题。

点击上方蓝色字体,选择“设为星标”

回复”云原生“获取基础架构实践

332c9c04bb0fd7a5eee37d0a7835808f.jpeg

前因

随着业务的扩充,微服务项目越来越多,对于分布式架构设计来讲,如何更好的监控每个服务的上下游成为了重点问题, 因为一旦中间某个调用链发生问题,就会导致整个链路连接失败。为了更好、更快的找到链路所在,我们就需要一个完整的链路跟踪系统,本节主要分享的是基于OpenTelemetry的一个链路跟踪库,可以很方便的无缝插拔式接入各种微服务系统中,当然,推荐使用字节开源的微服务分布式框架:Hertz、Kitex,该套框架已经很好的接入很多插件,并且本身提供高性能的功能特性,如果对于微服务有性能要求的,推荐尝试

基于高性能RPC框架Kitex

前面讲过我们的IDL,并且目前使用idl的两种方式以及使用的场景,接下来,我们直接通过thrift的idl文件来生成一个RPC微服务。

首先第一步,写出这个底层RPC服务的idl逻辑:

namespace go test

struct Request {
 1: required string data
 2: i64 type
}

struct Msg {
 1: i32 code
 2: string msg
}

struct Response {
 1: Msg msg
 2: string data
}

service TestService {
    Response Test1(1: Request req)
    Response Test2(1: Request req)
}

上面写了一个简单的基于thrift的idl,接下来,我们生成一个基于该idl的微服务,执行如下命令:

kitex -module "hz-kitex-examples" -thrift frugal_tag,template=slim -service test idl/test.thrift

执行上面的命令后,我们会看到在kitex_gen目录下生成一堆文件,这里就是RPC协议通信时,需要建立的一个桥梁,提供调用者与被调用者的连接:

e1ffa38bdac27bda13e8262e0dfa0a31.png

同时,我们还会看到生成对应的被调用者的逻辑:

1e0925094da78160a675ca85da1ea723.png

这里是启动类中对于网络、编解码、连接的设置:

75283b3e0f3fada02e8bdab7aa06dc16.png

这样,一个简单的RPC底层微服务就写完了。接下来,我们需要写一个对应的客户端进行彼此之间的通信、调用:

7e886f8d1cd9c6758fd5c868c6d0eb32.png

在这个rpc client的逻辑里,我们需要定义与server端一样的编解码、网络连接、通信协议方式。那么到目前为止,对于一个完整的基于Kitex的RPC微服务就开发完成了,下面环节,我们就基于该框架进行插拔式服务的链路跟踪。

插拔式链路跟踪

插拔式链路跟踪,为什么叫插拔式呢?顾名思义,其接入链路跟踪很简单,无需太多的逻辑,即可接入整个服务的连接的链路。本节介绍的链路跟踪技术,主要是基于Opentelemetry协议的Optl,对于该协议技术,大家感兴趣可以参考github的相关资料。

我们先看看RPC server端如何插拔式接入的,很简单,我们直接在server的启动main里加入:

p := provider.NewOpenTelemetryProvider(
  provider.WithServiceName(constants.UserServiceName),
  provider.WithExportEndpoint("121.37.173.206:4317"),
  provider.WithInsecure(),
 )
 defer p.Shutdown(context.Background())

同时,在初始化new服务端的时候,只要加上:

server.WithSuite(tracing.NewServerSuite()),
server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: constants.UserServiceName}),

这样,对于RPC server端就可以接入Opentelemetry了。

然后,对于调用server的client端,我们看如何接入,也很简单:

client.WithSuite(tracing.NewClientSuite()),
client.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: constants.ApiServiceName}),

看到代码是不是感觉很简单,两行code即可搞定,对得起我这文章标题吧。

同时,对于RPC client,也是一个Http server服务,所以可以接入open telemetry:

p := provider.NewOpenTelemetryProvider(
  provider.WithServiceName(constants.ApiServiceName),
  provider.WithExportEndpoint("121.37.173.206:4317"), //("localhost:4317"),
  provider.WithInsecure(),
 )
defer func(ctx context.Context, p provider.OtelProvider) {
  _ = p.Shutdown(ctx)
}(context.Background(), p)

tracer, cfg := hertztracing.NewServerTracer()

r := server.New(
  tracer,
 )
r.Use(hertztracing.ServerMiddleware(cfg))

看着是不是也很简单,代码逻辑都是一样的,没啥复杂的业务逻辑,新手都能入门。

测试

最后,我们来看看这个接入微服务链路跟踪后的整个系统的连接链路是啥样的,我们需要简单的展示下,这里是直接使用Jaeger进行UI展示,在调用数次请求之后,我们可以看到如下结果,先来看下我们调用的关系链:

7e1980bffe01441a800a299434940fdf.jpeg

然后经过几次调用后,我们可以看到这样的关系图:

71d990b6a1c3deae41b94532df26ca72.jpeg

最后,我们可以看到每次调用的链路以及日志信息:

7b2db639791efafa6cfd074b43153dcf.jpeg

最后,以上就是今天分享的几行代码,就可以轻松的无缝接入链路跟踪,帮助我们很好的看到调用链路关系,以及问题定位。

下面给大家介绍几本好书,目前销售火热,有原理加实战,感兴趣可以点击下方链接购买。

开源项目

  实践项目代码开源:https://gitee.com/damon_one/microservice-k8s

欢迎大家star、fork,欢迎联系我,一起学习。

号内回复“云原生”,获取云原生基础架构实践

817a1910c7c0a42dc57325a807b56a50.png

云原生社区合肥站

云原生社区合肥站正式启动啦,欢迎Base合肥、关注云原生、长期从事云原生的同志们踊跃加入,云原生社区合肥站会因为你们的加入而变得更加美好~

详情参见Issue:https://github.com/cloudnativeto/community/issues/107

欢迎关注个站

129add79f127b9b55159895d43dcf1ba.png

往期回顾

微服务自动化部署CI/CD

如何利用k8s拉取私有仓库镜像

个站建设基础教程

ArrayList、LinkedList 你真的了解吗?

大佬整理的mysql规范,分享给大家

如果张东升是个程序员

微服务架构设计之解耦合

浅谈负载均衡

Oauth2的认证实战-HA篇

Oauth2的授权码模式《上》

浅谈开发与研发之差异

浅谈 Java 集合 | 底层源码解析

基于 Sentinel 作熔断 | 文末赠资料

基础设施服务k8s快速部署之HA篇

今天被问微服务,这几点,让面试官刮目相看

Spring cloud 之多种方式限流(实战)

Spring cloud 之熔断机制(实战)

面试被问finally 和 return,到底谁先执行?

Springcloud Oauth2 HA篇

Spring Cloud Kubernetes之实战一配置管理

Spring Cloud Kubernetes之实战二服务注册与发现

Spring Cloud Kubernetes之实战三网关Gateway

ae8c9fc29459ba8c1601f3be5ec28def.gif

8add070131f27ca8867b182f1ded5f48.gif

点击 "damon8.cn" 获取更好的阅读体验!

❤️给个「在看」,是对我最大的支持❤️
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值