当前位置: 首页 > Linux

rabbitmq+sleuth+zinkip分布式链接跟踪

时间:2023-04-06 19:07:29 Linux

我们都知道微服务是通过feign来传递的。在一个复杂的微服务架构系统中,几乎每个前端请求都会形成一个复杂的分布式服务调用链路,每个链路中任何一个依赖服务的任何延迟超时或错误都可能导致整个请求的最终失败。当业务流程足够复杂时,一个完整的HTTP请求调用链一般会经过多个微服务系统,通过日志来追踪整个调用链就不再那么简单了。通过sleuth可以很方便的看到每个采集请求的耗时情况,分析哪些服务调用是耗时的。当耗时的服务调用随着请求量的增加而增加时,可以针对业务做一些优化。措施。所以我们可以通过SpringCloudSleuth来解决这个问题。这里我们将演示如何通过SpringCloudSleuth来跟踪这个过程,并使用Zipkin以图形界面的方式展示出来。展示前,分别介绍一下rabbitmq、sleuth、zinkip。rabbitmqRabbitMQ是一个开源消息代理软件(也称为面向消息的中间件),它实现了高级消息队列协议(AMQP)。RabbitMQ服务器是用Erlang语言编写的,而集群和故障转移是建立在OpenTelecomPlatform框架上的。所有主要的编程语言都有用于与代理接口通信的客户端库。Sleuth和zinkipsleuth是springcloud的组件之一。他们为springcloud应用程序实现分布式跟踪解决方案。它们与zinkip、HTrace和基于日志的跟踪兼容。Zipkin是一个开源的分布式实时数据跟踪系统(DistributedTrackingSystem),基于GoogleDapper的论文设计,由Twitter开发贡献。其主要功能是收集各种异构系统的实时监控数据,跟踪微服务架构下的系统延迟问题。Zipkin的UI可以呈现一个相关图,显示有多少跟踪请求通过了应用程序的每一层。Zipkin使用Trace结构来表示对请求的跟踪,将每个Trace拆分成若干个有依赖关系的span。在微服务架构中,一个用户的请求可能会被后台的几个服务处理,所以每个处理请求的服务都可以理解为一个Span(包括API服务、缓存服务、数据库服务、报表服务等)。当然这个服务可能会继续请求其他服务,所以Span是一个树形结构来体现服务之间的调用关系。除了查看Span的依赖关系,Zipkin的用户界面还以瀑布图的形式展示了每个Span的耗时情况,让你对每个服务的性能状态一目了然。sleuth中的一些术语Span:基本的工作单元,例如在新创建的span中发送RPC相当于向RPC发送响应请求,span由64位ID唯一标识,trace表示为另一个64位的ID,和span还有其他的数据信息,比如summaries,timestampevents,keyvalueannotations(tags),spanIDs,progressIDs(通常是IP地址),span是不停的起停,还有时间信息同时记录,当您创建跨度时,您必须在将来的某个时间停止它。Trace:由一系列span组成的树状结构。例如,如果您正在运行一个分布式项目,您可能需要创建一个跟踪。Annotation:用来及时记录一个事件的存在,一些核心的注解用来定义一个请求的开始和结束cs-ClientSent-客户端发起一个请求,这个注解描述了跨度的开始-服务端拿到Request,准备开始处理它,如果从它的sr中减去cs时间戳,就可以得到网络延迟ss-ServerSent-注解表示请求处理完成(当请求返回给客户端时),如果用ss减去sr时间戳,服务器处理请求所需的时间cr-ClientReceived-表示span结束,客户端成功收到服务器的回复,如果cr减去cs时间戳,就可以得到所有的时间需要客户端得到服务器的回复Next这里开始为云版本构建Greenwich.SR1,启动使用2.1.61.在pom.xml中引入sleuth依赖org.springframework.cloudspring-cloud-starter-sleuth2.模拟两条日志。两个服务是feign调用的,system是test调用的。这里有注册中心,测试模块这里就不演示了@Slf4j@RestControllerpublicclassTestController{@AutowiredprivateIHelloServicehelloService;@GetMapping("hello")publicStringhello(Stringname){log.info("Feigncallssystem's/helloservice");返回this.helloService.hello(name);}}在测试模块的服务包下创建IHelloService@FeignClient(value="system",contextId="helloServiceClient")publicinterfaceIHelloService{@GetMapping("hello")Stringhello(@RequestParam("name")Stringname);}系统模块@Slf4j@RestControllerpublicclassTestController{@GetMapping("hello")publicStringhello(Stringname){log.info("/helloserviceiscalled");return"hello"+name;}}3.访问接口localhost:8202/test/hello?name=sleuth:会出现两条自定义日志查看2019-08-2314:22:51.774INFO[test,72bb0469bee07104,72bb0469bee07104,false]22728---[nio-8202-exec-1]c.m.f.s.test.controller.TestController:Feigncallgeneratedbythetestmoduleatstartup检查2019-08-2314:22:52.469systemmodulegeneratedbythesystemwhenthe/helloservicestarts.:调用了/hello服务,可以看到[Test,72bb0469bee07104,72bb0469bee07104,false]信息出现在log,由SpringCloudSleuth生成,用于跟踪微服务请求链接,信息包含4部分的值,其含义如下:系统微服务名称对应spring.application.name;72bb0469bee07104称为TraceID,这个值固定在一个完整的请求链接中。这可以通过观察上面的日志来确认;43597a6edded6f2e称为SpanID,表示一个基本的工作单元;false表示是否将信息输出到Zipkin等服务进行收集展示。这里我们没有集成Zipkin,所以是false。让我们整合Zipkin。在集成Zipkin之前,我们需要先构建RabbitMQ。RabbitMQ用于收集Sleuth提供的跟踪信息,然后ZipkinServer从RabbitMQ获取,可以提高性能。在安装RabbitMQ之前,需要先安装Erlang/OTP。下载地址为:http://www.erlang.org/downloads/,下载exe文件安装即可。安装完成后,下载RabbitMQ,下载地址为:http://www.rabbitmq.com/insta...,下载exe文件并安装。安装完RabbitMQ后,我们进入RabbitMQ安装目录的sbin执行如下命令rabbitmq-pluginsenablerabbitmq_management然后在浏览器中输入http://localhost:15672。默认的用户名和密码都是guest。登录后可以看到:点击AdminTab页面,添加一个新用户:用户名为febs,密码为123456,角色为administrator。新添加的用户仍处于Noaccess状态,需要进一步授权该用户通过用户名进行远程访问。单击该添加用户名。进入授权页面,点击设置权限按钮,进行用户授权操作。安装好RabbitMQ后,我们开始集成Zipkin。在SpringCloud的低版本中,我们可以自己搭建ZipkinServer。现在只能使用官方搭建的ZipkinServer。地址为:https://github.com/openzipkin...在cmd窗口运行如下命令(windows下没有curl环境可以在gitbash中运行该命令),下载zipkin.jar:curl-SSLhttps://zipkin.io/quickstart.sh|bash-s如果下载速度特别慢,可以复制迅雷下载链接下载,下载后重命名为zipkin.jar。Zipkin支持将跟踪信息保存到MySQL数据库中,所以在运行zipkin.jar之前,我们需要准备好相关的数据库表。SQL脚本地址为:https://github.com/openzipkin/zipkin/blob/master/zipkin-storage/mysql-v1/src/main/resources/mysql.sql。库表准备好后,运行如下命令启动zipkin.jar:java-jarzipkin.jar--server.port=8402--zipkin.storage.type=mysql--zipkin.storage.mysql.db=febs_cloud_base--zipkin.storage.mysql.username=root--zipkin.storage.mysql.password=123456--zipkin.storage.mysql.host=localhost--zipkin.storage.mysql.port=3306--zipkin.collector。rabbitmq.addresses=localhost:5672--zipkin.collector.rabbitmq.username=febs--zipkin.collector.rabbitmq.password=123456上面的命令指定了数据库链接和RabbitMQ链接信息。更多可选配置,可以解压zipkin.jar,查看zipkinBOOT-INFclasses路径下的zipkin-server-shared.yml配置类源码。启动zipkin.jar后,在对应模块的pom中引入如下依赖:>org.springframework.amqpspring-rabbit修改对应模块spring的application.yml:zipkin:sender:type:rabbitsleuth:sampler:probability:1rabbitmq:host:localhostport:5672username:febspassword:123456spring.zipkin.sender.type指定使用RabbitMQ收集跟踪信息;spring.sleuth.sampler.probability的默认值是0.1,即采样率只有1/10,发送10个请求只会有一个被采集。为了测试方便,我们可以设置为1,即100%采样;spring.rabbitmq是用来配置RabbitMQ连接信息的,你可能会问为什么刚才的RabbitMQ端口是15672,这里却配置成5672,是不是写错了?羊毛布?其实不是,15672是RabbitMQ的管理页面端口,5672是AMPQ端口。添加配置后,启动系统和测试模块,发送一个localhost:8202/test/hello?name=summer请求,使用浏览器访问http://localhost:8402/zipkin/链接,然后点击如图图中Checkdependencies:查看数据表,看是否存储了信息:最后,最近有很多朋友找我要一份Linux学习路线图,所以根据自己的经验,利用业余时间熬夜了一个月并编写了一本电子书。无论你是面试还是自我提升,相信都会对你有所帮助!免费送给大家,只求大家给我点个赞!电子书|LinuxDevelopmentLearningRoadmap也希望有小伙伴可以和我一起把这本电子书做得更完美!获得?希望老铁们来个三连击,让更多人看到这篇文章。推荐阅读:干货|程序员和高级架构师免费发送工件的必备资源|支持搜索的资源网站

猜你喜欢