当前位置: 首页 > 后端技术 > Java

使用SpringCloudJaeger进行分布式跟踪

时间:2023-04-01 19:43:06 Java

在本文中,了解如何实现Jaeger(基于OpenTracing和SpringBoot应用程序)以及如何使用JaegerUI可视化跟踪。简介在本文中,我们将探索如何使用Jaeger实现分布式跟踪并使用JaegerUI可视化跟踪。Jaeger是一种开源分布式跟踪机制,可帮助跟踪分布式系统中的请求。它基于OpenTracing规范,属于云原生计算基金会(CNCF)的一部分。顺便说一句,让我们看一些代码。为了实现Jaeger跟踪,我们从https://start.spring.io创建了一个只有一个“SpringWeb”依赖项的应用程序。生成并下载代码后,我们会将以下Jaeger依赖项添加到pom文件中,这将有助于在服务之间生成和传播跟踪。io.opentracing.contribopentracing-spring-jaeger-cloud-starter3.3.1有了这个,让我们添加一个带有一些路径的控制器。@RestController@RequestMapping("/service")publicclassController{privatestaticfinalLoggerlogger=LoggerFactory.getLogger(Controller.class);私有RestTemplaterestTemplate;@Value("${spring.application.name}")privateStringapplicationName;公共控制器(RestTemplaterestTemplate){this.restTemplate=restTemplate;}@GetMapping("/path1")publicResponseEntitypath1(){logger.info("传入请求在{}forrequest/path1",applicationName);Stringresponse=restTemplate.getForObject("http://localhost:8090/service/path2",String.class);returnResponseEntity.ok(“来自/path1+的响应+”+response);}@GetMapping("/path2")publicResponseEntitypath2(){logger.info("传入请求在{}在/path2",applicationName);returnResponseEntity.ok("来自/path2的响应&quo吨;);这里我们有两个端点:/path1和/path2这里的想法是使用同一应用程序的两个实例,以便在固定端口8090/path1调用另一个服务。/path2为了让span连接到相同的跟踪ID,我们需要创建一个RestTemplatebean以允许Jaeger包含一个拦截器。这有助于向传出请求添加跟踪,这将有助于跟踪整个请求。@BeanpublicRestTemplaterestTemplate(RestTemplateBuilderbuilder){returnbuilder.build();完成后,让我们使用Docker在本地启动Jaeger服务器。为此,我创建了一个带有端口映射的DockerCompose文件。version:"3.3"services:jaeger-allinone:image:jaegertracing/all-in-one:1.25ports:-6831:6831/udp-6832:6832/udp-16686:16686-14268:14268我们可以通过UDP或TCP与Jaeger通信。使用docker-composeup启动Docker镜像后,我们可以使用URLhttp://localhost:16686/访问UI。现在,让我们添加一些属性以允许应用程序将跟踪发送到Jaeger服务器。我们将通过TCP进行通信,因此请确保我们将跟踪发送到另一个TCP端口,即14268opentracing:jaeger:http-sender:url:http://localhost:14268/api/traces让我们启动“服务器“与1”。java-jartarget/Distributed-Service-0.0.1-SNAPSHOT.jar--spring.application.name=Service-1--server.port=8080然后在不同的终端上运行与“服务2”相同的应用程序一个新的实例java-jartarget/Distributed-Service-0.0.1-SNAPSHOT.jar--spring.application.name=Service-2--server.port=8090应用启动后,调用“Service1”,/path1如下curl-ihttp://localhost:8080/service/path1让我们看看“服务1”的日志。INFO69938---[nio-8080-exec-1]i.j.internal.reporters.LoggingReporter:Span报告:ed70bbaa2bd5b42f:c7c94163fc95fc1e:ed70bbaa2bd5b42f:1-GETtraceinformat[RootSpanID,CurrentSpanID,ParentSpan.在这种情况下,由于“服务1”是原始服务,父跨度IDed70bbaa2bd5b42f也是根跨度ID。现在,让我们看看“服务2”的??日志。INFO69885---[nio-8090-exec-1]i.j.internal.reporters.LoggingReporter:Spanreported:ed70bbaa2bd5b42f:e9060cb1d5336c55:c7c94163fc95fc1e:1-path2从这里我们看到中间值是当前spanID,父spanID(即第三个值(c7c94163fc95fc1e)是“服务1”的跨度ID。现在,如果您打开UI,您将看到以下内容:当我们向下钻取时,我们会看到有关每个跨度的更多详细信息。在这里,rootspanIDed70bbaa2bd5b42f跨越整个请求。另外两个spanID指的是单独的服务。结论今天我们探讨了如何将基于OpenTracing的Jaeger与SpringBoot应用程序集成。您可以在此处阅读有关OpenTracing规范的更多信息。此外,使用SpringCloudJaeger的库的源代码在这里。我不断探索和学习新事物。如果您想了解最新趋势并提高您的软件开发技能,请关注我。祝你好运!!