SpringCloud Sleuth入门介绍-阿里云开发者社区

开发者社区> 游客a74jvhcp7vclg> 正文

SpringCloud Sleuth入门介绍

简介:  为什么要使用微服务跟踪?它解决了什么问题?
+关注继续查看

案例代码:https://github.com/q279583842q/springcloud-e-book


一、Sleuth介绍


 为什么要使用微服务跟踪?它解决了什么问题?


1.微服务的现状?


微服务的现状

 随着业务的发展,单体架构变为微服务架构,并且系统规模也变得越来越大,各微服务间的调用关系也变得越来越复杂。

多服务协同工作

 在微服务的应用中,一个由客户端发起的请求在后端系统中会经过多个不同的微服务调用来协同产生最后的请求结果

复杂的调用链条容易出错

 在复杂的微服务架构系统中,几乎每一个前端请求都会形成一个复杂的分布式服务调用链路,在每条链路中任何一个依赖服务出现延迟超时或者错误都有可能引起整个请求最后的失败


例如:

 在微服务系统中,一个来自用户的请求,请求先达到前端A(如前端界面)然后通过远程调用,到达系统中间件B,C(负载均衡,网关等),最后达到后端服务D,E,后端经过一系列的业务逻辑计算最后将数据返回给用户,对于这样一个请求,经历了这么多个服务,怎么样将它的请求过程的数据记录下来呢?这就需要用到服务链路追踪


3.png


2.微服务跟踪解决了什么问题?


 微服务跟踪(sleuth)其实是一个工具,它在整个分布式系统中能跟踪一个用户请求的过程(包括数据采集,数据传输,数据存储,数据分析,数据可视化),捕获这些跟踪数据,就能构建微服务的整个调用链的视图,这是调试和监控微服务的关键工具。

SpringCloudSleuth有4个特点

截屏2021-12-03 上午9.41.03.png


二、Sleuth案例


 我们通过一个简单的微服务调用案例来演示下Sleuth是怎么跟踪请求调用的,案例结构图如下:


20190630110020242.png


1.创建sleuth-product-service服务


1.1 创建服务



20190630110642734.png

20190630110724128.png


1.2 创建pojo


 此处的Product类以及相关代码在GitHub上


20190630110843768.png


1.3 创建service接口

@RequestMapping("/product")
public interface ProductService {

    @RequestMapping(value="findAll",method=RequestMethod.GET)
    public List<Product> findAll();
}


2.创建sleuth-product-provider服务


2.1 创建项目


20190630111011501.png


2.2 pom文件


 注意添加sleuth的依赖

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.13.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.bobo</groupId>
    <artifactId>sleuth-product-provider</artifactId>
    <version>0.0.1-SNAPSHOT</version>


    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.4</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
        <dependency>
            <groupId>com.bobo</groupId>
            <artifactId>sleuth-product-service</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-sleuth</artifactId>
        </dependency>

    </dependencies>

    <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>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>


2.3 配置文件


 没有特殊的

spring.application.name=sleuth-product
server.port=9001
#\u8BBE\u7F6E\u670D\u52A1\u6CE8\u518C\u4E2D\u5FC3\u5730\u5740\uFF0C\u6307\u5411\u53E6\u4E00\u4E2A\u6CE8\u518C\u4E2D\u5FC3
eureka.client.serviceUrl.defaultZone=http://dpb:123456@eureka1:8761/eureka/,http://dpb:123456@eureka2:8761/eureka/

#--------------db----------------
mybatis.type-aliases-package=com.book.product.pojo
mybatis.mapper-locations=classpath:com/bobo/product/mapper/*.xml

spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/book-product?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
spring.datasource.username=root
spring.datasource.password=123456


注意添加日志配置文件,日志级别设置为debug


20190630111217710.png


2.4 业务代码


 业务代码提供了对商品数据的查询。


20190630111257332.png


3.创建sleuth-consumer服务


3.1 创建项目


20190630111447456.png


3.2 pom文件


 统一注意添加sleuth的依赖

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.13.RELEASE</version>
    </parent>
    <groupId>com.bobo</groupId>
    <artifactId>sleuth-consumer</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <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>
    <dependencies>
        <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>
        <!-- 添加Feign坐标 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-feign</artifactId>
        </dependency>
        <!-- 添加e-book-product-service坐标 -->
        <dependency>
            <groupId>com.bobo</groupId>
            <artifactId>sleuth-product-service</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-sleuth</artifactId>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>


3.3 配置文件


 没有特殊的配置

spring.application.name=e-book-consumer
server.port=9010
#\u8BBE\u7F6E\u670D\u52A1\u6CE8\u518C\u4E2D\u5FC3\u5730\u5740\uFF0C\u6307\u5411\u53E6\u4E00\u4E2A\u6CE8\u518C\u4E2D\u5FC3
eureka.client.serviceUrl.defaultZone=http://dpb:123456@eureka1:8761/eureka/,http://dpb:123456@eureka2:8761/eureka/


3.4 业务代码


 通过Feign实现对商品服务的调用,具体代码见GitHub,地址在头部


20190630111636499.png


4.服务跟踪


 先启动product服务,然后启动consumer服务,访问:http://localhost:9010/find


20190630111859762.png


请求访问成功,注意查看控制台信息

consumer的控制器

20190630112243551.png20190630112316456.png20190630112434546.png


product的控制台信息

20190630112107153.png20190630112141676.png


5.Sleuth 日志分析

20190630113718776.png


Created new Feign span [Trace: cbe97e67ce162943, Span: bb1798f7a7c9c142, Parent: cbe97e67ce162943, exportable:false]
# 调用 product服务
2019-06-30 09:43:24.022 [http-nio-9010-exec-8] DEBUG o.s.c.s.i.web.client.feign.TraceFeignClient - The modified request equals GET http://localhost:9001/product/findAll HTTP/1.1

X-B3-ParentSpanId: cbe97e67ce162943
X-B3-Sampled: 0
X-B3-TraceId: cbe97e67ce162943
X-Span-Name: http:/product/findAll
X-B3-SpanId: bb1798f7a7c9c142

# product中的日志输出
## product 被调用
 [findAll] to a span [Trace: cbe97e67ce162943, Span: bb1798f7a7c9c142, Parent: cbe97e67ce162943, exportable:false]
 Adding a class tag with value [ProductController] to a span [Trace: cbe97e67ce162943, Span: bb1798f7a7c9c142, Parent: cbe97e67ce162943, exportable:false]
 ## 调用数据库操作
 org.mybatis.spring.SqlSessionUtils - Creating a new SqlSession
 org.mybatis.spring.SqlSessionUtils - SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@42858a0e] was not registered for synchronization because synchronization is not active
 o.springframework.jdbc.datasource.DataSourceUtils - Fetching JDBC Connection from DataSource
 o.m.spring.transaction.SpringManagedTransaction - JDBC Connection [ProxyConnection[PooledConnection[com.mysql.jdbc.JDBC4Connection@7981208d]]] will not be managed by Spring
 com.bobo.mapper.ProductMapper.selectByExample - ==>  Preparing: select id, name, status, price, deleted, create_time, update_time from product 
 com.bobo.mapper.ProductMapper.selectByExample - ==> Parameters: 
 com.bobo.mapper.ProductMapper.selectByExample - <==      Total: 3
## 结束请求
 o.s.cloud.sleuth.instrument.web.TraceFilter - Closing the span [Trace: cbe97e67ce162943, Span: bb1798f7a7c9c142, Parent: cbe97e67ce162943, exportable:false] since the response was successful


# consumer 中调用服务结束
Closing Feign span and logging CR [Trace: cbe97e67ce162943, Span: bb1798f7a7c9c142, Parent: cbe97e67ce162943, exportable:false]
Closing Feign span [Trace: cbe97e67ce162943, Span: bb1798f7a7c9c142, Parent: cbe97e67ce162943, exportable:false]


如上,通过日志我们可以看出服务调用的相关过程

截屏2021-12-03 上午9.40.03.png

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Word报告自动生成(例如 导出数据库结构)(上)
将很早之前写的一个小组件重新整理优化一下,做成一个通用的功能。适用于导出数据库的结构(表、字段等)到Word或将体检数据自动生成Word版的体检报告等。
5 0
2020秋招面试JVM虚拟机高频问题总结 问题+答案(1)
2020秋招面试JVM虚拟机高频问题总结 问题+答案(1)
4 0
ASP.NET Core : 九.从Windows发布到CentOS的跨平台部署(下)
本文聊一下如何在Windows上用VS开发并发布, 然后将其部署到CentOS上。对于我们一些常在Windows上逛的来说,CentOS用起来还真有些麻烦。MSDN官方有篇文章大概讲了一下(链接),按照MSDN上面的例子用vs创建个hellomvc项目,还是踩了好多坑,将整个过程和遇到的坑说一下,希望对有需要的朋友有所帮助。
5 0
java 字节流与字符流的区别
java 字节流与字符流的区别
4 0
CORS跨域资源共享
CORS跨域资源共享
4 0
ASP.NET Core : 十一. 如何在后台运行一个任务(上)
在大部分程序中一般都会需要用到后台任务, 比如定时更新缓存或更新某些状态。
5 0
2020秋招面试JVM虚拟机高频问题总结 问题+答案(5)
2020秋招面试JVM虚拟机高频问题总结 问题+答案(5)
4 0
2020秋招面试JVM虚拟机高频问题总结 问题+答案(4)
2020秋招面试JVM虚拟机高频问题总结 问题+答案(4)
4 0
绝了!这款工具让 Spring Boot 不在需要 Controller、Service、DAO、Mapper 了
ataway 是基于 DataQL 服务聚合能力,为应用提供的一个接口配置工具。使得使用者无需开发任何代码就配置一个满足需求的接口。整个接口配置、测试、冒烟、发布。一站式都通过 Dataway 提供的 UI 界面完成。UI 会以 Jar 包方式提供并集成到应用中并和应用共享同一个 http 端口,应用无需单独为 Dataway 开辟新的管理端口。 这种内嵌集成方式模式的优点是,可以使得大部分老项目都
7 0
Java面试操作系统高频知识点——秋招春招均可用
Java面试操作系统高频知识点——秋招春招均可用
3 0
+关注
游客a74jvhcp7vclg
10余年开发架构经验,同时乐于技术分享!
332
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载