微服务是一团糟的调试工作。在本教程中,我们将发现如何在Spring Cloud环境中调试分布式调用。抽丝剥茧 细说架构那些事——【优锐课】
上篇文章说到,微服务系列详解-Part5:Spring Cloud Zuul代理作为API网关
微服务架构中的挑战之一是调试问题的能力。一个简单的用户操作可能会触发一系列下游微服务调用。在微服务中跟踪与特定用户操作相关的日志将很麻烦。除此之外,我们可能想跟踪为什么某个微服务调用要花费这么多时间。我们可以使用Spring Cloud Sleuth处理此类问题。Spring Cloud Sleuth提供了分布式跟踪功能,我们还可以将这些跟踪信息导出到Zipkin以可视化呼叫跟踪。
在这篇文章中,我们将学习:
• 跟踪分布式服务呼叫
• 使用Spring Cloud Sleuth进行分布式跟踪
• 使用Zipkin服务器进行分布式跟踪
在微服务世界中,用户对UI的操作可能会调用一个微服务API端点,而端点又会调用另一个微服务端点。
例如,当用户看到目录时,shoppingcart-ui将调用目录服务REST API http://localhost:8181/api/products,而产品反过来又调用了库存服务REST API http://localhost:8282/api/inventor以检查库存可用性。
假设发生了异常或返回的数据无效,并且你想通过查看日志来调查问题所在。但是到目前为止,还没有办法将特定用户的日志跨多个服务关联起来。
Poor Man’s分布式追踪
一种解决方案是在调用链的开头,我们可以创建一个CORRELATION_ID并将其添加到所有日志语句中。连同它一起,还将CORRELATION_ID作为标头发送到所有下游服务,以便那些下游服务在日志中也使用CORRELATION_ID。这样,我们可以识别与跨服务的特定操作相关的所有日志语句。
我们可以使用Logging框架的MDC功能来实现此解决方案。通常,我们会有一个WebRequest拦截器,你可以在其中检查是否有CORRELATION_ID标头。如果标题中没有CORRELATION_ID,则创建一个新的并将其设置在MDC中。日志记录框架包括所有日志语句在MDC中设置的信息。
但是,除了我们不做所有这些工作之外,我们还可以使用Spring Cloud Sleuth,它将为我们做所有以及更多的事情。
首先,在这里熟悉Span,Trace,Annotations的一些术语。
让我们将Sleuth启动器添加到库存服务和目录服务中。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
添加Sleuth启动器并启动服务后,你可以在日志中观察到类似以下内容。
2018-03-20 10:19:15.512 INFO [inventory-service,,,] 53685 --- [trap-executor-0] c.n.d.s.r.aws.ConfigClusterResolver ...
2018-03-20 10:24:15.507 INFO [inventory-service,,,] 53685 --- [trap-executor-0] c.n.d.s.r.aws.ConfigClusterResolver ...
现在点击任何清单服务REST端点,例如http://localhost:8282/api/inventory。然后,你可以在日志中观察TraceID,SpanID。
2018-03-20 10:15:38.466 INFO [inventory-service,683f8e4370413032,d8abe400c68a9a6b,false] 53685 --- [oryController-3] ...
Sleuth在MDC的日志中包括模式[appname,traceId,spanId,exportable]。
现在,调用目录服务端点http://localhost:8181/api/products端点,该端点在内部调用清单服务端点http://localhost:8282/api/inventory。
在目录服务日志中,你可以找到类似以下内容的日志语句:
`2018-03-20 10:54:29.625 INFO [catalog-service,0335da07260d3d6f,