Spring Cloud 接入 EDAS 之全链路跟踪

在上一篇 Spring Cloud 接入 EDAS 之服务发现篇 中已经讲解了如何接入 EDAS 的服务注册中心。在这一篇中,我们将聊聊全链路跟踪。

全链路跟踪的必要性

微服务框架带来的好处已经无需多言,模块化,解耦,提高了开发的效率,服务具备更好的扩展性等等。但是微服务其实是一把双刃剑,微服务同时也带来了一些问题。
随着业务的拆分越来越细,模块越来越多,一个看似简单的业务动作,很可能跨越了几十个系统,调用链非常复杂。

基于微服务体系之下构建的业务系统存在的问题基本上分为四类。

  • 故障定位难

即使是一个简单的下单的动作,用户在页面上点购买按钮,其实它背后是由十几个甚至数十个的微服务去共同完成的,这十几个甚至几十个微服务也由不同的团队去负责,这是微服务的过度协同带来的结果,一旦出现问题,最坏情况下我们也许就要拉上十几个团队一起来看问题。

  • 容量预估难

当遇到大促活动时,在以前的单体应用系统当中做容量预估是非常容易的,因为我们大促时候按照预估的流量与当前系统的单机压测容量做一个对比,把所有的系统按比例去扩容就可以了。而在微服务的大促场景下,每一个系统在核心链路当中的参与度、重要性都是不一样的,我们并不能对每一个系统做等比例的扩容,所以微服务架构下的容量预估也是一件难事。

  • 资源浪费多

资源浪费多首先是容量预估不准的一个后果,同时资源浪费多背后隐含的另一个问题就是性能优化难,为什么这么说呢?我们当打开一个页面发现它慢的时候,我根本不知道这个页面慢在哪里,瓶颈在哪里,怎么去优化,这些问题累积下来,资源的浪费也成为了一个巨大的问题。

  • 链路梳理难

一个新人加入公司的时候,老板让他负责一个系统,他在这个复杂的微服务体系中,就像人第一次在没有地图没有导航的情况下来到一个大城市一样,根本不知道自己身在何处。应用负责人不知道自己的系统被谁依赖了,也不知道自己的系统下游会影响其他哪些人。

EagleEye

EagleEye 就是为了解决上述问题而生的。

EagleEye 简介

EagleEye 是阿里巴巴的分布式追踪系统,基于 Google 的分布式调用跟踪系统 Dapper 实现。
EagleEye 日均处理万亿级别的分布式调用链数据,通过收集和分析在不同的网络调用中进行日志埋点,可以得到同一次请求上的各个系统的调用链关系,有助于梳理应用的请求入口与服务的调用来源、依赖关系,同时,也对分析系统调用瓶颈、估算链路容量、快速定位异常有很大帮助。

EagleEye 如何接入

Spring Cloud 应用接入 EagleEye 很简单,如果你已经使用了 上文 中提到了 EDAS 注册中心,则只需要添加如下依赖即可自动接入 EagleEye。
目前 EDAS 的 EagleEye 已经支持自动对 RestTemplate、AsyncRestTemplate、FeignClient 调用的请求自动进行跟踪。后续我们将接入更多的组件的自动埋点

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eagleeye</artifactId>
        <version>1.1</version>
    </dependency>

如果你只是想单纯地使用 EagleEye 的功能,同样没问题,除了基本的 Spring Cloud 所需的依赖外,还需要在 pom.xml 文件中加入如下公共配置。

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eagleeye</artifactId>
        <version>1.1</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-pandora</artifactId>
        <version>1.2</version>
    </dependency>

    <build>
        <plugins>
            <plugin>
                <groupId>com.taobao.pandora</groupId>
                <artifactId>pandora-boot-maven-plugin</artifactId>
                <version>2.1.7.8</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

还需要在 main 函数中加入两行代码,加入后的代码如下图所示

    public static void main(String[] args) {
        PandoraBootstrap.run(args);
        SpringApplication.run(ServerApplication.class, args);
        PandoraBootstrap.markStartupAndWait();
    }

当然,建议还是全套使用 EDAS 的配套功能,这样才能形成合力,发挥最大的作用。
加入如上依赖后,无需搭建任何采集分析系统,开箱即可使用 EDAS 的全链路跟踪功能。

注意 由于目前 spring cloud for aliware 尚未进入中央仓库,需要配置 maven 的私服地址,配置详情参考 私服配置

Demo

源码

为了演示 EagleEye 的功能,我们在这里编写了两个 Demo 应用,通过模拟他们的互相调用,分别模拟了正常调用,延迟较大和异常出错的场景。

点击链接下载源码 service1service2

分别将这两个应用部署到 EDAS 后,我们通过调用 Service1 的几个方法来演示 EagleEye 的使用。

我们分别调用这些方法 /rest/ok 、 rest/delay 、 /rest/ok ,它们分别对应了正常调用,延迟较大调用,异常出错的场景。

使用 EagleEye 的查看调用链功能,可以看到如下的信息。

正常的调用链详情

正常调用的场景,从图中可以看出服务经过了这么几次调用,并且可以看到 step1、step2、step3 的耗时分别是 2ms、1ms、0ms。

延迟较大的调用链详情

延迟较大的场景,从图中可以看到 delay1、delay2、delay3 的耗时分别是 453ms、353ms、151ms,

将鼠标停留在 delay3 这个调用段,还可以看到更多详细的调用链的信息。其中服务端处理请求花费了 150ms,客户端在服务端处理完请求后的 1ms 收到了响应。

异常出错的调用链详情

从图中我们可以很清晰地看到,出错的请求为 /rest/error3 ,极大地方便了我们对问题进行定位。

关于 EagleEye 更详细的使用方式,参考文档 服务监控

其他客户端的演示

同时,我们也在 /echo-rest/{str} 、 /echo-async-rest/{str} 、 /echo-feign/{str} 这三个 URI 中,分别演示了 EagleEye 对 RestTemplate、 AsyncRestTemplate 、 FeignClient 的自动埋点支持,您可以在调用后,通过 服务监控 页面查看着这三者的调用链信息。

Sleuth

我们都知道 Spring Cloud 提供了原生的链路跟踪解决方案 Sleuth ,使用起来也不复杂。

日志埋点

在 Spring Cloud 工程中接入 Sleuth 埋点功能,首先需要在 pom.xml 中加入如下依赖

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

这里只是完成了日志埋点的第一步,接下来就是日志分析了。

启动 Zipkin

日志分析使用的是 zipkin,所以需要部署一下 zipkin ,最方便的方式就是使用 docker 的方式启动,参照 官方文档

埋点日志采集

启动 zipkin 后,只剩下最后一步:将业务服务的机器上埋点日志,通过某种方式将数据传送到 zipkin 。目前支持基于 HTTP 请求传送及通过消息队列传送的方式。

http方式

基于 http 协议,加入如下依赖和配置

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

spring.zipkin.baseUrl=http://${zipkin-server-ip}:${zipkin-server-port}

zipkin 的组件将会在请求结束之后,异步地将埋点的日志信息以 http 的方式传送给 zipkin。
虽然是异步的,但是性能消耗还是比较大,更好的方式就是通过消息队列传送了。

消息队列方式

基于消息队列传送,这里以 kafka 为例子,业务服务端需要加入如下依赖和配置

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

spring.sleuth.sampler.percentage=1.0
spring.cloud.stream.kafka.binder.brokers=192.168.0.2:9092,192.168.0.3:9092
spring.cloud.stream.kafka.binder.zkNodes=192.168.0.2:2181,192.168.0.3:2181

基于消息队列传送,这里以 kafka 为例子,zipkin 服务端需要加入如下依赖和配置

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

spring.sleuth.enabled=false
spring.sleuth.sampler.percentage=1.0
spring.cloud.stream.kafka.binder.brokers=192.168.0.2:9092,192.168.0.3:9092
spring.cloud.stream.kafka.binder.zkNodes=192.168.0.2:2181,192.168.0.3:2181

这里的 brokers 和 zkNodes 地址和端口是随手写的,实际使用中,还需要更换成自身搭建的kafka和zk的地址。

其他依赖

当使用消息队列时,kafka 这类消息队列也需要自己搭建。
zipkin 默认将数据存储在内存中。实际使用中,为了达到数据持久化和提升查找效率的目的,还需要配置数据库存储和 ElasticSearch 等。

Sleuth VS EagleEye

EDAS EagleEye 的开箱即用的特点,简单可靠,省去了您自身搭建日志分析服务、消息队列、存储等维护的成本,提升了您的开发效率。

不建议同时使用 Sleuth 和 EagleEye ,虽然目前版本我们做了一定的兼容,但是不保证后续版本会兼容。而且多个链路跟踪的存在,容易引起性能上损耗,影响服务性能及稳定性。

两者其实都是基于 Google 的分布式调用跟踪系统 Dapper 实现,EagleEye 会提供 Sleuth 所涵盖的功能的支持。同时,结合阿里内部的 EagleEye 分析系统 以及 业务实时监控服务 ARMS 等系统,还可对服务进行全息排查,全方位实时监控您的业务。

时间: 2024-08-18 10:00:37

Spring Cloud 接入 EDAS 之全链路跟踪的相关文章

Spring Cloud 接入 EDAS 之服务发现篇

目前 EDAS 已经完全支持 Spring Cloud 应用的部署了,您可以直接将 Spring Cloud 应用部署到 EDAS 中. 同时,为了更好地将阿里中间件的功能以云服务的方式提供给大家,我们也对 Spring Cloud 中的一些组件进行了加强或替换的工作. 让我们先来聊聊服务发现.我们知道原生的 Spring Cloud 支持多种服务注册与发现的方式,Eureka . Consul . Zookeeper 等,目前使用最多最广的就是 Eureka了,那我们就先从一个简单的 Eure

服务链路追踪(Spring Cloud Sleuth)

这篇文章主要讲述服务追踪组件zipkin,spring Cloud Sleuth集成了zipkin组件. 一.简介 Add sleuth to the classpath of a Spring Boot application (see below for Maven and Gradle examples), and you will see the correlation data being collected in logs, as long as you are logging re

spring cloud 学习(8) - sleuth &amp; zipkin 调用链跟踪

业务复杂的微服务架构中,往往服务之间的调用关系比较难梳理,一次http请求中,可能涉及到多个服务的调用(eg: service A -> service B -> service C...),如果想分析各服务间的调用关系,以及各服务的响应耗时,找出有性能瓶颈的服务,这时zipkin就派上用场,它是Twitter公司开源的一个tracing系统,官网地址为: http://zipkin.io/ , spring cloud可以跟它无疑集成. 使用步骤: 一.微服务方 1.1 添加依赖jar包 c

从 Spring Cloud 开始,聊聊微服务架构实践之路

本文讲的是从 Spring Cloud 开始,聊聊微服务架构实践之路[编者的话]随着公司业务量的飞速发展,平台面临的挑战已经远远大于业务,需求量不断增加,技术人员数量增加,面临的复杂度也大大增加.在这个背景下,平台的技术架构也完成了从传统的单体应用到微服务化的演进. 系统架构的演进过程 单一应用架构(第一代架构) 这是平台最开始的情况,当时流量小,为了节约成本,并将所有应用都打包放到一个应用里面,采用的架构为 .NET SQL Server: 表示层:位于最外层(最上层),最接近用户.用于显示数

利用Zipkin对Spring Cloud应用进行服务追踪分析

设想这么一种情况,如果你的微服务数量逐渐增大,服务间的依赖关系越来越复杂,怎么分析它们之间的调用关系及相互的影响? 服务追踪分析 一个由微服务构成的应用系统通过服务来划分问题域,通过REST请求服务API来连接服务来完成完整业务.对于入口的一个调用可能需要有多个后台服务协同完成,链路上任何一个调用超时或出错都可能造成前端请求的失败.服务的调用链也会越来越长,并形成一个树形的调用链. 随着服务的增多,对调用链的分析也会越来越负责.设想你在负责下面这个系统,其中每个小点都是一个微服务,他们之间的调用

阿里10年分布式技术沉淀:阿里高可用体系核心缔造者、全链路压测创始人告诉你!

本次活动看点十足,大咖齐聚.纯正干货,下面给大家做下详解介绍,相信看后定会让你动心! 议题详情 双11核武器全链路压测--张军 / 阿里巴巴中间件高级技术专家 阿里巴巴双11备战期间,保障系统稳定性最大的难题在于容量规划,而容量规划最大的难题在于准确评估从用户登录到完成购买的整个链条中,核心页面和交易支付的实际承载能力.全链路压测的诞生改变了这一现状,通过对双11进行模拟,支持线上不影响正常用户访问的集群读写压测,获得最真实的线上承载能力数据.全链路压测开启了大促稳定性保障的新纪元,被誉为备战核

《Spring Cloud与Docker微服务架构实战》配套代码

不才写了本使用Spring Cloud玩转微服务架构的书,书名是<Spring Cloud与Docker微服务架构实战> - 周立,已于2017-01-12交稿.不少朋友想先看看源码,现将代码放出. 本次放出的代码: 共计70+个DEMO 覆盖Eureka.Ribbon.Feign.Hystrix.Zuul.Spring Cloud Config.Spring Cloud Bus.Spring Cloud Sleuth.Docker.Docker Compose等. 1-11章代码地址: ht

基于阿里云产品的全链路评估

什么是全链路评估 在突发流量场景或者是新业务上线的场景,在未来某个特定的日期或者时间点将会有一轮大流量的用户请求的时候,由于没有真实生产环境运行时候的历史信息做参考,就特别需要通过链路评估来对系统承载能力进行评估,从而保证系统的可靠稳定运行. 我们理解的链路评估,是从访问入口开始,对整条链路的所有潜在的瓶颈点,进行全方位的测量,通过改造链路结构和容量配比,达到提升整体链路性能和可靠性的目的. 这里面的链路评估是相对单系统调优来说的,单系统调优重点关注的是在"机器操作"的微观级别上做具体

从架构演进的角度聊聊Spring Cloud都做了些什么?

Spring Cloud作为一套微服务治理的框架,几乎考虑到了微服务治理的方方面面,之前也写过一些关于Spring Cloud文章,主要偏重各组件的使用,本次分享主要解答这两个问题:Spring Cloud在微服务的架构中都做了哪些事情?Spring Cloud提供的这些功能对微服务的架构提供了怎样的便利? 这也是我写Spring Cloud三部曲的最后一篇文章,前两面篇内容如下: 中小型互联网公司微服务实践-经验和教训 Spring Cloud在国内中小型公司能用起来吗? 我们先来简单回顾一下