关键词:
参考:方志朋的专栏
1. 简介
微服务架构上通过业务来划分服务的,通过REST调用,对外暴露的一个接口,可能需要很多个服务协同才能完成这个接口功能,如果链路上任何一个服务出现问题或者网络超时,都会导致接口调用失败。随着业务的不断扩张,服务之间互相调用会越来越复杂。随着服务的越来越多,对调用链的分析会越来越复杂。
Spring Cloud Sleuth服务链路跟踪功能就可以帮助我们快速的发现错误根源以及监控分析每条请求链路上的性能等等。
相关术语:
- 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注解的过程图形化:
2. 构建工程
本文的案例主要有三个工程组成:一个server-zipkin,它的主要作用使用ZipkinServer 的功能,收集调用数据,并展示;一个service-hi,对外暴露hi接口;一个service-miya,对外暴露miya接口;这两个service可以相互调用;并且只有调用了,server-zipkin才会收集数据的,这就是为什么叫服务追踪了。
2.1 构建server-zipkin
在Spring Cloud为F版本的时候,已不需要自己构建Zipkin Server了,只需要下载jar即可,下载地址:https://dl.bintray.com/openzipkin/maven/io/zipkin/java/zipkin-server/ 。
下载完毕,执行命令运行
java -jar zipkin-server-2.12.9-exec.jar
访问:localhost:9411
2.2 创建service-hi
通过引入spring-cloud-starter-zipkin依赖和设置spring.zipkin.base-url即可,步骤如下:
在其pom引入起步依赖spring-cloud-starter-zipkin:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zipkin</artifactId> </dependency>
在其配置文件application.yml指定zipkin server的地址,头通过配置“spring.zipkin.base-url”指定:
server.port=8988
spring.application.name=service-hi
spring.zipkin.base-url=http://localhost:9411
对外暴露接口:
import brave.sampler.Sampler; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; import java.util.logging.Level; import java.util.logging.Logger; @SpringBootApplication @RestController public class ServiceHiApplication { public static void main(String[] args) { SpringApplication.run(ServiceHiApplication.class, args); } private static final Logger LOG = Logger.getLogger(ServiceHiApplication.class.getName()); @Autowired private RestTemplate restTemplate; @Bean public RestTemplate getRestTemplate(){ return new RestTemplate(); } @RequestMapping("/hi") public String callHome(){ LOG.log(Level.INFO, "calling trace service-hi "); return restTemplate.getForObject("http://localhost:8989/miya", String.class); } @RequestMapping("/info") public String info(){ LOG.log(Level.INFO, "calling trace service-hi "); return "i'm service-hi"; } @Bean public Sampler defaultSampler() { return Sampler.ALWAYS_SAMPLE; } }
2.3 创建service-miya
创建过程同service-hi,引入相同的依赖,配置下spring.zipkin.base-url。
对外暴露接口:
import brave.sampler.Sampler; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; import java.util.logging.Level; import java.util.logging.Logger; @SpringBootApplication @RestController public class ServiceMiyaApplication { public static void main(String[] args) { SpringApplication.run(ServiceMiyaApplication.class, args); } private static final Logger LOG = Logger.getLogger(ServiceMiyaApplication.class.getName()); @RequestMapping("/hi") public String home(){ LOG.log(Level.INFO, "hi is being called"); return "hi i'm miya!"; } @RequestMapping("/miya") public String info(){ LOG.log(Level.INFO, "info is being called"); return restTemplate.getForObject("http://localhost:8988/info",String.class); } @Autowired private RestTemplate restTemplate; @Bean public RestTemplate getRestTemplate(){ return new RestTemplate(); } @Bean public Sampler defaultSampler() { return Sampler.ALWAYS_SAMPLE; } }
3. 追踪服务调用
依次启动上面的工程,此时测试几次调用:如访问:http://localhost:8989/miya 或 http://localhost:8988/hi,浏览器出现:
此时访问http://localhost:9411/的界面,点击依赖,可以发现服务的依赖关系:
查找页面可对
点击具体服务调用,可以看到具体服务相互调用的数据。
查看服务详情,可跟踪其调用期间发生的问题。
springcloud教程——hystrix(f版本)
...一个个的服务,服务与服务之间可以相互调用(RPC),在SpringCloud可以用RestTemplate+Ribbon和Feign来调用。为了保证其高可用,单个服务通常会集群部署。由于网络原因或者自身的原因,服务并不能保证100%可用,如果单个服务出现问... 查看详情
springcloud教程——ribbon和feign(f版本)
参考自:方志朋的专栏1. Ribbon 1.1Ribbon简介SpringCloudRibbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于NetflixRibbon实现。通过SpringCloud的封装,可以让我们轻松地将面向服务的REST模版请求自动转换成客户端负载均衡的服... 查看详情
springcloud整合分布式链路追踪系统sleuth和zipkin实战,分析系统瓶颈
...哪里出问题了,巴拉巴拉....,回归正题,今天我们使用SpringCloud组件,来分析一下微服务架构中系统调用的瓶颈问题~SpringCloud链路追踪组件Sleuth实战官网 主要功能:做日志埋点什么是Sleuth 专门用于追踪每个请求的完整调... 查看详情
springcloud链路追踪sleuth+twitterzipkin中zipkin服务
2021年5月15日随笔springboot2.2.x版本以上,不建议自己写服务了,我尝试了很多方法没有成功,各种问题,所以需要下载它的jar包然后执行 下载地址:https://repo1.maven.org/maven2/io/zipkin/zipkin-server/2.23.2/zipkin-server-2.23.2-exec.jar下载完... 查看详情
springcloud学习之sleuth+zipkin
一、什么是Sleuth 为服务之间调用提供链路追踪。通过Sleuth可以很清楚的了解到一个服务请求经过了哪些服务,每个服务处理花费了多长。从而让我们可以很方便的理清各微服务间的调用关系。二、Sleuth作用 2.1:耗时分析... 查看详情
springcloud集成sleuth(代码片段)
Springcloud集成SleuthSleuth是什么Sleuth之zipkin搭建安装Sleuth链路监控展现Sleuth是什么为什么会出现这个技术?要解决哪些问题?在微服务框架中,一个由客户端发起的请求在后端系统中会经过多个不同的的服务节点调用来... 查看详情
springcloud第二季之stream,sleuth学习笔记(代码片段)
目录 83.Stream为什么被引入84.Stream是什么及Binder介绍85.Stream的设计思想86.Stream编码常用注解简介87.Stream消息驱动之生产者88.Stream消息驱动之消费者89.Stream之消息重复消费90.Stream之group解决消息重复消费91.Stream之消息持久化92.Sleuth... 查看详情
sleuth+zipkin实现springcloud链路追踪(代码片段)
文章目录一、前言二、应用架构图三、快速了解Sleuth四、准备工作1、搭建Zipkin单机环境2、搭建naocos单机环境五、微服务整合Sleuth1、创建SpringBoot工程2、配置文件3、实现核心代码六、集成Zipkin1、引入客户端2、配置文件3、运行效... 查看详情
从零搭建一个springcloud项目之sleuth+zipkin(代码片段)
在需要加监控的服务上进行以下操作一、加入Sleuth加依赖<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-sleuth</artifactId></dependency>二、加入Zipkin2.1使 查看详情
springcloud之链路追踪整合sleuth(十三)
前言SpringCloud是微服务中的翘楚,最佳的落地方案。在一个完整的微服务架构项目中,服务之间的调用是很复杂的,当其中某一个服务出现了问题或者访问超时,很难直接确定是由哪个服务引起的,所以就有了SpringCloudSleuth链路... 查看详情
springcloud(16)——链路追踪工具sleuth(代码片段)
追踪工具SleuthSpringCloudSleuth可以用来追踪微服务请求中的整个请求,通过它可以记录各个请求之间的耗时、异常等情况。使用SpringCloudSleuth时一般会跟Zipkin一起使用。SpringCloudSleuth收集到的一些跟踪信息可以发送给Zipkin,Zipkin提供... 查看详情
springcloud笔记八sleuthzipkin(代码片段)
zipkin服务端环境启动zipkin下载,进入github,找到Quick-start下载最新版本https://github.com/openzipkin/zipkin管理页面端口:9411在项目中配置sleuth、zipkinpom.xml <!--包含zipkin和sleuth--><dependency><groupId> 查看详情
springcloud系列之sleuth链路追踪
随着微服务架构的流行,服务按照不同的维度进行拆分,一次请求往往需要涉及到多个服务。互联网应用构建在不同的软件模块集上,这些软件模块,有可能是由不同的团队开发、可能使用不同的编程语言来实现、有可能布在了... 查看详情
springcloud-sleuth分布式请求链路跟踪
...,链路的任何一个环节出了差错就会导致整个请求的失败SpringCloudSleuth提供了一套完整的服务跟踪的解决方案,并兼容支持了zipkin,为了方便监控,我们需要安装一下Zipkin安装Zipkin监控平台SpringCloud 查看详情
springcloud-config&bus&stream&sleuth+zipkin
SpringCloud-configSpringCloud-busSpringCloud-streamSpringCloud-sleuth、zipkin##Config>概念:分布式配置中心>作用:统一管理各个服务、环境配置、实现动态配置(优点:维护方便、灵活度比较高)>>![image-20200605101411241](imgimage-20200605101411 查看详情
5.springcloud--配置中心config消息总线bus链路追踪sleuth配置中心nacos(代码片段)
5.SpringCloud--配置中心Config、消息总线Bus、链路追踪Sleuth、配置中心Nacos一、引入配置中心1.1问题与解决二、配置中心--Config2.1Config是什么?(1)Config是什么?(2)Config功能2.2搭建配置中心(ConfigServer... 查看详情
微服务实践之全链路追踪(sleuth,zipkin)详解-springcloud(2021.0.x)-4(代码片段)
...自由转载出自:shusheng007文章目录前言链路追踪理论SpringCloud的实现方案Zipkin服务引入依赖配置使用总结源码前言本文将介绍微服务架构中关于链路追踪相关组件Sleuth与Zipkin的在SpringCloud入门使用。链路追踪为什么要进行链路... 查看详情
springcloud分布式链路跟踪sleuth+zipkin+elasticsear
...一个具体的实例来体会一把微服务链路追踪:本文使用的SpringCloudFinch 查看详情