Spring Cloud构建微服务架构:分布式服务跟踪(入门)【Dalston版】

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,118元/月
云原生网关 MSE Higress,422元/月
简介: Spring Cloud构建微服务架构:分布式服务跟踪(入门)【Dalston版】

通过之前的N篇博文介绍,实际上我们已经能够通过使用它们搭建起一个基础的微服务架构系统来实现我们的业务需求了。但是,随着业务的发展,我们的系统规模也会变得越来越大,各微服务间的调用关系也变得越来越错综复杂。通常一个由客户端发起的请求在后端系统中会经过多个不同的微服务调用来协同产生最后的请求结果,在复杂的微服务架构系统中,几乎每一个前端请求都会形成一条复杂的分布式服务调用链路,在每条链路中任何一个依赖服务出现延迟过高或错误的时候都有可能引起请求最后的失败。这时候对于每个请求全链路调用的跟踪就变得越来越重要,通过实现对请求调用的跟踪可以帮助我们快速的发现错误根源以及监控分析每条请求链路上的性能瓶颈等好处。

针对上面所述的分布式服务跟踪问题,Spring Cloud Sleuth提供了一套完整的解决方案。在本章中,我们将详细介绍如何使用Spring Cloud Sleuth来为我们的微服务架构增加分布式服务跟踪的能力。

快速入门

在介绍各种概念与原理之前,我们先通过实现一个简单的示例,对存在服务调用的应用增加一些sleuth的配置实现基本的服务跟踪功能,以此来对Spring Cloud Sleuth有一个初步的了解,随后再逐步展开介绍实现过程中的各个细节部分。

准备工作

在引入Sleuth之前,我们先按照之前章节学习的内容来做一些准备工作,构建一些基础的设施和应用:

  • 服务注册中心:eureka-server,这里不做赘述,直接使用之前构建的工程。或者直接使用我的公益eureka注册中心,下面的例子使用该注册中心。
  • 微服务应用:trace-1,实现一个REST接口/trace-1,调用该接口后将触发对trace-2应用的调用。具体实现如下:
  • 创建一个基础的Spring Boot应用,在pom.xml中增加下面依赖:
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.10.RELEASE</version>
    <relativePath/> 
</parent>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
<dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>Dalston.SR5</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
</dependencyManagement>
  • 创建应用主类,并实现/trace-1接口,并使用RestTemplate调用trace-2应用的接口。具体如下:

@RestController
@EnableDiscoveryClient
@SpringBootApplication
public class TraceApplication {
    private final Logger logger = Logger.getLogger(getClass());
    @Bean
    @LoadBalanced
    RestTemplate restTemplate() {
      return new RestTemplate();
    }
    @RequestMapping(value = "/trace-1", method = RequestMethod.GET)
    public String trace() {
      logger.info("===call trace-1===");
      return restTemplate().getForEntity("http://trace-2/trace-2", String.class).getBody();
    }
    public static void main(String[] args) {
      SpringApplication.run(TraceApplication.class, args);
    }
}
  • application.properties中将eureka.client.serviceUrl.defaultZone参数指向eureka-server的地址,具体如下:

spring.application.name=trace-1
server.port=9101
eureka.client.serviceUrl.defaultZone=http://eureka.didispace.com/eureka/
  • 微服务应用:trace-2,实现一个REST接口/trace-2,供trace-1调用。具体实现如下:
  • 创建一个基础的Spring Boot应用,pom.xml中的依赖与trace-1相同
  • 创建应用主类,并实现/trace-2接口,具体实现如下:

@RestController
@EnableDiscoveryClient
@SpringBootApplication
public class TraceApplication {
    private final Logger logger = Logger.getLogger(getClass());
    @RequestMapping(value = "/trace-2", method = RequestMethod.GET)
    public String trace() {
      logger.info("===<call trace-2>===");
      return "Trace";
    }
    public static void main(String[] args) {
      SpringApplication.run(TraceApplication.class, args);
    }
}
  • application.properties中将eureka.client.serviceUrl.defaultZone参数指向eureka-server的地址,另外还需要设置不同的应用名和端口号,具体如下:

spring.application.name=trace-2
server.port=9102
eureka.client.serviceUrl.defaultZone=http://eureka.didispace.com/eureka/

在实现了上面内容之后,我们可以将eureka-servertrace-1trace-2三个应用都启动起来,并通过postman或curl等工具来对trace-1的接口发送请求http://localhost:9101/trace-1,我们可以得到返回值Trace,同时还能在它们的控制台中分别获得下面的输出:

-- trace-1
INFO 25272 --- [nio-9101-exec-2] ication$$EnhancerBySpringCGLIB$$36e12c68 : ===<call trace-1>===
-- trace-2
INFO 7136 --- [nio-9102-exec-1] ication$$EnhancerBySpringCGLIB$$52a02f0b : ===<call trace-2>===

实现跟踪

在完成了准备工作之后,接下来我们开始进行本章的主题内容,为上面的trace-1trace-2来添加服务跟踪功能。通过Spring Cloud Sleuth的封装,我们为应用增加服务跟踪能力的操作非常简单,只需要在trace-1trace-2pom.xml依赖管理中增加spring-cloud-starter-sleuth依赖即可,具体如下:

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>

到这里,实际上我们已经为trace-1trace-2实现服务跟踪做好了基础的准备,重启trace-1trace-2后,再对trace-1的接口发送请求http://localhost:9101/trace-1。此时,我们可以从它们的控制台输出中,窥探到sleuth的一些端倪。

-- trace-1
INFO [trace-1,f410ab57afd5c145,a9f2118fa2019684,false] 25028 --- [nio-9101-exec-1] ication$$EnhancerBySpringCGLIB$$d8228493 : ===<call trace-1>===
-- trace-2
INFO [trace-2,f410ab57afd5c145,e9a377dc2268bc29,false] 23112 --- [nio-9102-exec-1] ication$$EnhancerBySpringCGLIB$$e6cb4078 : ===<call trace-2>===

从上面的控制台输出内容中,我们可以看到多了一些形如[trace-1,f410ab57afd5c145,a9f2118fa2019684,false]的日志信息,而这些元素正是实现分布式服务跟踪的重要组成部分,它们每个值的含义如下:

  • 第一个值:trace-1,它记录了应用的名称,也就是application.propertiesspring.application.name参数配置的属性。
  • 第二个值:f410ab57afd5c145,Spring Cloud Sleuth生成的一个ID,称为Trace ID,它用来标识一条请求链路。一条请求链路中包含一个Trace ID,多个Span ID。
  • 第三个值:a9f2118fa2019684,Spring Cloud Sleuth生成的另外一个ID,称为Span ID,它表示一个基本的工作单元,比如:发送一个HTTP请求。
  • 第四个值:false,表示是否要将该信息输出到Zipkin等服务中来收集和展示。

上面四个值中的Trace IDSpan ID是Spring Cloud Sleuth实现分布式服务跟踪的核心。在一次服务请求链路的调用过程中,会保持并传递同一个Trace ID,从而将整个分布于不同微服务进程中的请求跟踪信息串联起来,以上面输出内容为例,trace-1trace-2同属于一个前端服务请求来源,所以他们的Trace ID是相同的,处于同一条请求链路中。

本文完整示例:

读者可以根据喜好选择下面的两个仓库中查看trace-1trace-2两个项目:

如果您对这些感兴趣,欢迎star、follow、收藏、转发给予支持!

本文内容部分节选自我的《Spring Cloud微服务实战》,但对依赖的Spring Boot和Spring Cloud版本做了升级。

目录
相关文章
|
25天前
|
存储 运维 负载均衡
构建高可用性GraphRAG系统:分布式部署与容错机制
【10月更文挑战第28天】作为一名数据科学家和系统架构师,我在构建和维护大规模分布式系统方面有着丰富的经验。最近,我负责了一个基于GraphRAG(Graph Retrieval-Augmented Generation)模型的项目,该模型用于构建一个高可用性的问答系统。在这个过程中,我深刻体会到分布式部署和容错机制的重要性。本文将详细介绍如何在生产环境中构建一个高可用性的GraphRAG系统,包括分布式部署方案、负载均衡、故障检测与恢复机制等方面的内容。
83 4
构建高可用性GraphRAG系统:分布式部署与容错机制
|
2月前
|
Kubernetes 负载均衡 Docker
构建高效后端服务:微服务架构的探索与实践
【10月更文挑战第20天】 在数字化时代,后端服务的构建对于任何在线业务的成功至关重要。本文将深入探讨微服务架构的概念、优势以及如何在实际项目中有效实施。我们将从微服务的基本理念出发,逐步解析其在提高系统可维护性、扩展性和敏捷性方面的作用。通过实际案例分析,揭示微服务架构在不同场景下的应用策略和最佳实践。无论你是后端开发新手还是经验丰富的工程师,本文都将为你提供宝贵的见解和实用的指导。
|
2月前
|
运维 供应链 安全
SD-WAN分布式组网:构建高效、灵活的企业网络架构
本文介绍了SD-WAN(软件定义广域网)在企业分布式组网中的应用,强调其智能化流量管理、简化的网络部署、弹性扩展能力和增强的安全性等核心优势,以及在跨国企业、多云环境、零售连锁和制造业中的典型应用场景。通过合理设计网络架构、选择合适的网络连接类型、优化应用流量优先级和定期评估网络性能等最佳实践,SD-WAN助力企业实现高效、稳定的业务连接,加速数字化转型。
SD-WAN分布式组网:构建高效、灵活的企业网络架构
|
2月前
|
监控 API 持续交付
构建高效后端服务:微服务架构的深度探索
【10月更文挑战第20天】 在数字化时代,后端服务的构建对于支撑复杂的业务逻辑和海量数据处理至关重要。本文深入探讨了微服务架构的核心理念、实施策略以及面临的挑战,旨在为开发者提供一套构建高效、可扩展后端服务的方法论。通过案例分析,揭示微服务如何帮助企业应对快速变化的业务需求,同时保持系统的稳定性和灵活性。
46 9
|
29天前
|
监控 算法 网络协议
|
2月前
|
监控 安全 Java
构建高效后端服务:微服务架构深度解析与最佳实践###
【10月更文挑战第19天】 在数字化转型加速的今天,企业对后端服务的响应速度、可扩展性和灵活性提出了更高要求。本文探讨了微服务架构作为解决方案,通过分析传统单体架构面临的挑战,深入剖析微服务的核心优势、关键组件及设计原则。我们将从实际案例入手,揭示成功实施微服务的策略与常见陷阱,为开发者和企业提供可操作的指导建议。本文目的是帮助读者理解如何利用微服务架构提升后端服务的整体效能,实现业务快速迭代与创新。 ###
64 2
|
2月前
|
消息中间件 Kafka 数据库
微服务架构中,如何确保服务之间的数据一致性?
微服务架构中,如何确保服务之间的数据一致性?
|
2月前
|
消息中间件 存储 负载均衡
微服务与分布式系统设计看这篇就够了!
【10月更文挑战第12天】 在现代软件架构中,微服务和分布式系统设计已经成为构建可扩展、灵活和可靠应用程序的主流方法。本文将深入探讨微服务架构的核心概念、设计原则和挑战,并提供一些关于如何在分布式系统中实现微服务的实用指导。
58 2
|
27天前
|
存储 监控 大数据
构建高可用性ClickHouse集群:从单节点到分布式
【10月更文挑战第26天】随着业务的不断增长,单一的数据存储解决方案可能无法满足日益增加的数据处理需求。在大数据时代,数据库的性能、可扩展性和稳定性成为企业关注的重点。ClickHouse 是一个用于联机分析处理(OLAP)的列式数据库管理系统(DBMS),以其卓越的查询性能和高吞吐量而闻名。本文将从我的个人角度出发,分享如何将单节点 ClickHouse 扩展为高可用性的分布式集群,以提升系统的稳定性和可靠性。
59 0
|
2月前
|
运维 Kubernetes 开发者
构建高效后端服务:微服务架构与容器化技术的结合
【10月更文挑战第18天】 在数字化转型的浪潮中,企业对后端服务的要求日益提高,追求更高的效率、更强的可伸缩性和更易于维护的系统。本文将探讨微服务架构与容器化技术如何结合,以构建一个既灵活又高效的后端服务体系。通过分析当前后端服务面临的挑战,介绍微服务和容器化的基本概念,以及它们如何相互配合来优化后端服务的性能和管理。本文旨在为开发者提供一种实现后端服务现代化的方法,从而帮助企业在竞争激烈的市场中脱颖而出。
27 0