热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【SpringCloud】第九篇:服务链路追踪(SpringCloudSleuth)

前言:必需学会SpringBoot基础知识简介:springcloud为开发人员提供了快速构建分布式系统的一些工具,包括配置管理、服务发现、断路器、路由、微代理、事件总

前言:

必需学会SpringBoot基础知识

简介:

spring cloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等。它运行环境简单,可以在开发人员的电脑上跑。

工具:

JDK8

apache-maven-3.5.2

IntelliJ IDEA 2018.1 x64

 

一、简介

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 requests.

—— 摘自官网

Spring Cloud Sleuth 主要功能就是在分布式系统中提供追踪解决方案,并且兼容支持了 zipkin,你只需要在pom文件中引入相应的依赖即可。

二、服务追踪分析

微服务架构上通过业务来划分服务的,通过REST调用,对外暴露的一个接口,可能需要很多个服务协同才能完成这个接口功能,如果链路上任何一个服务出现问题或者网络超时,都会形成导致接口调用失败。随着业务的不断扩张,服务之间互相调用会越来越复杂。

                                SpringCloud_配置中心9-1

随着服务的越来越多,对调用链的分析会越来越复杂。它们之间的调用关系也许如下:

                                 SpringCloud_配置中心9-2

 

三、术语

  • Span:基本工作单元,例如,在一个新建的span中发送一个RPC等同于发送一个回应请求给RPC,span通过一个64位ID唯一标识,trace以另一个64位ID表示,span还有其他数据信息,比如摘要、时间戳事件、关键值注释(tags)、span的ID、以及进度ID(通常是IP地址)
    span在不断的启动和停止,同时记录了时间信息,当你创建了一个span,你必须在未来的某个时刻停止它。
  • Trace:一系列spans组成的一个树状结构,例如,如果你正在跑一个分布式大数据工程,你可能需要创建一个trace。
  • Annotation:用来及时记录一个事件的存在,一些核心annotations用来定义一个请求的开始和结束
    • cs - Client Sent -客户端发起一个请求,这个annotion描述了这个span的开始
    • sr - Server Received -服务端获得请求并准备开始处理它,如果将其sr减去cs时间戳便可得到网络延迟
    • ss - Server Sent -注解表明请求处理的完成(当请求返回客户端),如果ss减去sr时间戳便可得到服务端需要的处理请求时间
    • cr - Client Received -表明span的结束,客户端成功接收到服务端的回复,如果cr减去cs时间戳便可得到客户端从服务端获取回复的所有所需时间
      将Span和Trace在一个系统中使用Zipkin注解的过程图形化:

将Span和Trace在一个系统中使用Zipkin注解的过程图形化:

    SpringCloud_配置中心9-3

 

四、构建工程

基本知识讲解完毕,下面我们来实战,本文的案例主要有三个工程组成:一个eureka-server-zipkin,它的主要作用使用ZipkinServer 的功能,收集调用数据,并展示;一个eureka-server-zipkin-client,对外暴露hi接口;一个eureka-server-zipkin-eddie,对外暴露eddie接口;这两个service可以相互调用;并且只有调用了,eureka-server-zipkin才会收集数据的,这就是为什么叫服务追踪了。

理论差不多, 就不继续探讨, 都是那句老话: 师傅带入门, 本领看自己
4.1 创建 eureka-server-zipkin

pom引入依赖:


    
        org.springframework.boot
        spring-boot-starter
    

    
        org.springframework.boot
        spring-boot-starter-web
    
    
        org.springframework.boot
        spring-boot-starter-test
        test
    

    
        io.zipkin.java
        zipkin-server
    

    
        io.zipkin.java
        zipkin-autoconfigure-ui
    




    
        
            org.springframework.cloud
            spring-cloud-dependencies
            Edgware.SR2
            pom
            import
        
    

 

在其程序入口类, 加上注解@EnableZipkinServer,开启ZipkinServer的功能:

package com.lwc;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import zipkin.server.EnableZipkinServer;


/**
 * @author Eddie
 */
@EnableZipkinServer
@SpringBootApplication
public class EurekaServerZipkinApplication {

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

在配置文件application.yml指定服务端口为:

server:
port: 9411
4.2 创建 eureka-server-zipkin-client

在其pom引入起步依赖spring-cloud-starter-zipkin,代码如下:



    
        org.springframework.boot
        spring-boot-starter-web
    

    
        org.springframework.cloud
        spring-cloud-starter-zipkin
    

    
        org.springframework.boot
        spring-boot-starter-test
        test
    

    
        org.projectlombok
        lombok
    



    
        
            org.springframework.cloud
            spring-cloud-dependencies
            Edgware.SR2
            pom
            import
        
    

在其配置文件application.yml指定zipkin server的地址,头通过配置“spring.zipkin.base-url”指定:

server:
  port: 8988
spring:
  zipkin:
    base-url: http://localhost:9411
  application:
    name: eureka-server-zipkin-client

通过引入spring-cloud-starter-zipkin依赖和设置spring.zipkin.base-url就可以了。

对外暴露接口:

package com.lwc.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

/**
 * @author eddie.lee
 * @Package com.lwc.controller
 * @ClassName ZipkinController
 * @description
 * @date created in 2018-04-09 13:55
 * @modified by
 */
@Slf4j
@RestController
public class ZipkinController {


    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/hi")
    public String callHome() {
        log.info(" callHome() ==> calling trace eureka-server-zipkin-client");
        return restTemplate.getForObject("http://localhost:8989/eddie", String.class);
    }

    @GetMapping("/info2")
    public String info2() {
        log.info(" info2() ==> calling trace eureka-server-zipkin-client");
        return "this is eureka-server-zipkin-client";

    }

}

4.3 创建 eureka-server-zipkin-eddie

创建过程 eureka-server-zipkin-client,引入相同的依赖,配置下spring.zipkin.base-url。

对外暴露接口:

package com.lwc.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

/**
 * @author eddie.lee
 * @Package com.lwc.controller
 * @ClassName EddieController
 * @description
 * @date created in 2018-04-09 15:56
 * @modified by
 */
@Slf4j
@RestController
public class EddieController {

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/hi")
    public String home(){
        log.info("==> hi is being called");
        return "hi i'm eddie.lee!";
    }

    @GetMapping("/eddie")
    public String info(){
        log.info("==> info is being called");
        return restTemplate.getForObject("http://localhost:8988/info2",String.class);
    }
}

4.4 启动工程,演示追踪

依次启动上面的三个工程,打开浏览器访问:http://localhost:9411/,会出现以下界面:

                   image

访问:http://localhost:8989/eddie,浏览器出现:

this is eureka-server-zipkin-client

 

再打开http://localhost:9411/的界面,点击 依赖分析 ,可以发现服务的依赖关系:

                  image

点击 查找  可以看到具体服务相互调用的数据:

                image

 

PS: 在网上很多出现依赖找不到, 或者是WEB UI查看不到依赖分析等情况, 请按本文章对应代码参考, 欢迎评论;

 

源码下载:

标签 9-1

https://github.com/eddie-code/SpringCloudDemo


推荐阅读
  • 深入解析Spring Cloud微服务架构与分布式系统实战
    本文详细介绍了Spring Cloud在微服务架构和分布式系统中的应用,结合实际案例和最新技术,帮助读者全面掌握微服务的实现与优化。 ... [详细]
  • 深入解析Serverless架构模式
    本文将详细介绍Serverless架构模式的核心概念、工作原理及其优势。通过对比传统架构,探讨Serverless如何简化应用开发与运维流程,并介绍当前主流的Serverless平台。 ... [详细]
  • 并发编程 12—— 任务取消与关闭 之 shutdownNow 的局限性
    Java并发编程实践目录并发编程01——ThreadLocal并发编程02——ConcurrentHashMap并发编程03——阻塞队列和生产者-消费者模式并发编程04——闭锁Co ... [详细]
  • 本文深入探讨了MySQL中常见的面试问题,包括事务隔离级别、存储引擎选择、索引结构及优化等关键知识点。通过详细解析,帮助读者在面对BAT等大厂面试时更加从容。 ... [详细]
  • Spring Cloud学习指南:深入理解微服务架构
    本文介绍了微服务架构的基本概念及其在Spring Cloud中的实现。讨论了微服务架构的主要优势,如简化开发和维护、快速启动、灵活的技术栈选择以及按需扩展的能力。同时,也探讨了微服务架构面临的挑战,包括较高的运维要求、分布式系统的复杂性、接口调整的成本等问题。最后,文章提出了实施微服务时应遵循的设计原则。 ... [详细]
  • Spring Cloud Config 使用 Vault 作为配置存储
    本文探讨了如何在Spring Cloud Config中集成HashiCorp Vault作为配置存储解决方案,基于Spring Cloud Hoxton.RELEASE及Spring Boot 2.2.1.RELEASE版本。文章还提供了详细的配置示例和实践建议。 ... [详细]
  • 前言无论是对于刚入行工作还是已经工作几年的java开发者来说,面试求职始终是你需要直面的一件事情。首先梳理自己的知识体系,针对性准备,会有事半功倍的效果。我们往往会把重点放在技术上 ... [详细]
  • EasyMock实战指南
    本文介绍了如何使用EasyMock进行单元测试,特别是当测试对象的合作者依赖于外部资源或尚未实现时。通过具体的示例,展示了EasyMock在模拟对象行为方面的强大功能。 ... [详细]
  • PostgreSQL 最新动态 —— 2022年4月6日
    了解 PostgreSQL 社区的最新进展和技术分享 ... [详细]
  • 深入解析 Android IPC 中的 Messenger 机制
    本文详细介绍了 Android 中基于消息传递的进程间通信(IPC)机制——Messenger。通过实例和源码分析,帮助开发者更好地理解和使用这一高效的通信工具。 ... [详细]
  • 远程过程调用(RPC)是一种允许客户端通过网络请求服务器执行特定功能的技术。它简化了分布式系统的交互,使开发者可以像调用本地函数一样调用远程服务,并获得返回结果。本文将深入探讨RPC的工作原理、发展历程及其在现代技术中的应用。 ... [详细]
  • Java多重继承的替代方案及设计考量
    本文探讨了Java为何不支持多重继承,并深入分析了其背后的原理和替代方案。通过理解Java的设计哲学,开发者可以更好地利用接口和其他特性来实现复杂的类结构。 ... [详细]
  • 深入解析Hadoop的核心组件与工作原理
    本文详细介绍了Hadoop的三大核心组件:分布式文件系统HDFS、资源管理器YARN和分布式计算框架MapReduce。通过分析这些组件的工作机制,帮助读者更好地理解Hadoop的架构及其在大数据处理中的应用。 ... [详细]
  • 本文探讨了现代分布式架构的多样性,包括高并发、多活数据中心、容器化、微服务、高可用性和弹性架构等,并介绍了与这些架构相关的重要管理技术,如DevOps、应用监控和自动化运维。文章还深入分析了分布式系统的核心概念、主要用途及类型,同时对比了单体应用与分布式服务化的优缺点。 ... [详细]
  • 本文探讨了大型服务端开发过程中常见的几个误区,包括异步任务处理不当、日志同步模式使用、网络操作未设置超时、缓存命中率及响应时间未统计、单一缓存模式、分布式缓存加锁不当以及团队管理上的误区,旨在帮助开发者避免这些常见错误。 ... [详细]
author-avatar
jysghyb
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有