SpringCloud分布式链路跟踪的方法
作者:StanleyBlogs 发布时间:2023-11-24 23:42:19
注:作者使用IDEA + Gradle
注:需要有一定的java SpringBoot and SSM+Springcloud基础
程序测试错误追责
我举个例子,我现在要做一个电商项目,项目里面有一个购买模块,那我这边可能要执行一个代码,比如减库存之类的东西,那我两个服务不就是要相互调用嘛,我自身是一个服务,我现在要调用减库存这个服务;
你调用它,你知道它一定能执行成功吗?肯定是不一定;
比如说,我现在要执行一个减库存的代码,我调用这个方法会进行库存的一个更改,这个库存减少成功还好,万一要是失败就会出现一个问题就是,做前端的来调用你,但是你出错了,这时你也不知道你这个减库存到底有没有执行成功,两个人就会相互排斥问题,不知道到底是你前端调用的问题,还是我后端代码写的有毛病,反正测试工程师就只知道库存没有减;
解决方案就是,记日志;
记录日志
首先,springboot里面有集成好的日志组件,我们仅需拿来用即可,接下来,我将会分几个步骤来教大家如何在记日志;
1.首先我们打开一个编写好的子项目(服务),在yml配置文件中进行一些简单的配置👇:
logging:
path: 日志打印输出路径
level:
该服务的全包名: #级别【info级别最好,我用的是debug级别】
2.在我们的Controllerc引入Logge接口👇:
public static Logger logger = LoggerFactory.getLogger(#当前类);
注意:引入Logger时,它有许多个记日志的版本,java统一了成了slf4j,所以导入包的时候一定注意不要导错!
2.导入成功并且后需要把当前类加入到日志中👇:
3.开始调用日志
在控制层接口中调用日志
logger.debug("执行了查询,开始调用project-solr的服务");
这里的话就简单的记录一下日志,将来方便追错;
4.运行程序,查看是日志是否能被记录
首先运行注册中心,再启动自己写好的服务朝注册中心注册一下
查看注册中心:
发现solr注册进来了,注册中心我这边用的是集群负载均衡,三个注册中心相互注册,在后面可以清楚的看到我另外三个注册中心的端口号
5.调用solr服务,查看日志是否输出并打印👇:
点击去查看一下👇:
总中我我们可以清楚的看到,从开始,到结束,就是中间打印了一些其他的东西,这个先不去深究它;
小结
在工作中,别人的代码到底能不能执行成功,你是保证不了的,唯有记日志,来证明自己的代码没有问题,从上我选择在调用前打印日志,在调用后也打印了日志,说明我这个接口没有问题,但是,你调用你的solr服务,出现了问题,那是你的问题,跟我调用无关,我正常调用没问题,至于后面库存没有减少,那,就是你的问题;
给solr添加日志记录
刚才我是以调用对方服务的方式来记录日志,保证自己正常调用,那么,我们solr也应该记录一下日志,因为,它也保证不了调用solr的人,是否存在调用问题,所以,我要保证我solr正常执行,为了证明我是没有问题的,所以我们也给solr这个服务记录日志;
很简单,跟上面的一样,我直接复制粘贴即可,但是这次稍微的改一下;
logging:
path: C:\Users\30901\Desktop\log\project_solr
level:
com.lh.project.solr: info
注意:级别前面的包名需要更改成当前服务的包名,这次我在日志输出路径中多加了一个当前服务名,这样打印出的日志就能分别出谁打印出来的;
注意,日志文件是自动生成出来的;
我们把项目跑起来,试试,看看日志能不能被成功输出👇:
我们也可以清楚的看见,日志信息在这里打印的非常清楚;
这个是它自动生成的日志文件:
分布式链路追踪
首先需要引入依赖:
compile 'org.springframework.cloud:spring-cloud-starter-sleuth'
根据以上的例子,两个服务均需要用到用到分布式链路跟踪,所以我们两个两个都配置一下;
加完所需依赖后,我们再进行日志的输出,看看有什么区别👇:
区别就能发现,前面多出来了一串乱码,跟上面对比,就能看出来,那么具体是什么意思呢?
首先打印出来的日志有两个,一个是调用方,一个是被调用方,我们打开这两个日志来看一下:
这个时候,假设,以上一个请求,其中一个有问题,那么,你就可以把这个有问题的这个乱码跟被调用方里面的日志进行匹配,如果查询到了,那么说明这两个日志,对应的是同一个请求,咱们就可以通过这个乱码就可以判断,这两个服务调用的到底是不是属于同一个请求;
这个乱码分成三段:
第一高段请求方与调用方式一样的,因为它们属于同一个链路上,所以一样,因此,我们可以通过第一段代码,来跟踪;
来源:http://www.cnblogs.com/StanleyBlogs/p/10577278.html


猜你喜欢
- Spring中有很多继承于aware中的接口,这些接口到底是做什么用到的。aware,翻译过来是知道的,已感知的,意识到的,所以这些接口从字
- 一. 流的常用创建方法1-1 使用Collection下的 stream() 和 parallelStream() 方 * ist<St
- 1.简介学了几周的Java,闲来无事,写个乞丐版的扫雷,加强一下Java基础知识。2.编写过程编写这个游戏,一共经历了三个阶段,编写了三个版
- 1. Android中文件读写的原理: (1).所有文件的储存都是字节的储存。 (2).在磁盘上保留的并不是文件的字符而是先把字符编码成字节
- 前言在这一期的文章中,我将继续介绍 Either,使用它构建树形结构,该结构允许我模拟 Scala 的模式匹配来构建遍历方法。在 Java
- Spring AOP底层原理代理模式一、什么是 AOPAOP 就是面向切面编程,是 OOP(面向对象编程)的延续。利用 AOP 可以对业务逻
- 一、介绍SharpZipLib是一个完全由C#编写的ZIP,GZIP,Tar和BZIP2 Library,可以方便的支持这几种格式的压缩和解
- 做了2,3年的java-web,始终木有逃离所谓基础业务,增删改查这些一成不变的东西写起来浪费大量时间,于是做了个简单的代码生成器快速生成代
- 我想大家对DateTime.ToString()方法的用法肯定已经非常熟悉了,但我想大家用过的大部分用法都是:DateTime.ToStri
- java中字符串转整数及MyAtoi方法的实现 该题虽然和我们正常使
- 异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程。Java通过API中Throwable类的众多子类描述各种不同的异常。因而,Ja
- 本文实例讲述了Android实现仿通讯录侧边栏滑动SiderBar效果代码。分享给大家供大家参考,具体如下:之前看到某些应用的侧边栏做得不错
- 对于换肤技术,相信伙伴们都见过一些大型app,到了某些节日或者活动,e.g. 双十一、双十二、春节等等,app的ICON还有内部的页面主题背
- java缓冲流本身不具IO功能,只是在别的流上加上缓冲提高效率,像是为别的流装上一种包装。当对文件或其他目标频繁读写或操作效率低,效能差。这
- 1、redis的几种常见客户端:Jedis:是Redis的Java实现客户端,提供了比较全面的Redis命令的支持;Redisson:实现了
- 前言本文基于itext7实现pdf加水印和合并的操作。实际上在我们实际项目应用中,对于pdf的操作也是比较常见的,我上一个项目中就有将结果转
- java连续执行多条cmd命令命令之间用&连接例如:Process p = Runtime.getRuntime().exec(&q
- Java代码package com.zzx.controller;import com.zzx.model.User;import org.
- 虽然闭包主要是函数式编程的玩意儿,而C#的最主要特征是面向对象,但是利用委托或lambda表达式,C#也可以写出具有函数式编程风味的代码。同
- 过滤器实现过滤器需要实现 javax.servlet.Filter 接口。重写三个方法。其中 init()&n