Spring Boot + Spring Cloud 实现权限管理系统 后端篇(二十二):链路追踪(Sleuth、Zipkin)
在线演示
演示地址:http://139.196.87.48:9002/kitty
用户名:admin 密码:admin
技术背景
在微服务架构中,随着业务发展,系统拆分导致系统调用链路愈发复杂,一个看似简单的前端请求可能最终需要调用很多次后端服务才能完成,那么当整个请求出现问题时,我们很难得知到底是哪个服务出了问题导致的,这时就需要解决一个问题,如何快速定位服务故障点,于是,分布式系统调用链追踪技术就此诞生了。
ZipKin
Zipkin 是一个由Twitter公司提供并开放源代码分布式的跟踪系统,它可以帮助收集服务的时间数据,以解决微服务架构中的延迟问题,包括数据的收集、存储、查找和展现。
每个服务向zipkin报告定时数据,zipkin会根据调用关系通过Zipkin UI生成依赖关系图,展示了多少跟踪请求经过了哪些服务,该系统让开发者可通过一个 Web 前端轻松的收集和分析数据,例如用户每次请求服务的处理时间等,可非常方便的监测系统中存在的瓶颈。
Zipkin提供了可插拔数据存储方式:In-Memory、MySql、Cassandra以及Elasticsearch。我们可以跟根据需求选择不同的存储方式,生成环境一般都需要持久化。我们这里采用elasticsearch作为zipkin的数据存储器。
Spring Cloud Sleuth
一般而言,一个分布式服务追踪系统,主要有三部分组成:数据收集、数据存储和数据展示。
Spring Cloud Sleuth为服务之间的调用提供链路追踪,通过Sleuth可以很清楚的了解到一个服务请求经过了哪些服务,每个服务处理花费了多长。从而让我们可以很方便的理清各微服务间的调用关系。此外,Sleuth还可以帮助我们:
耗时分析: 通过Sleuth可以很方便的了解到每个采样请求的耗时,从而分析出哪些服务调用比较耗时。
可视化错误: 对于程序未捕捉的异常,可以通过集成Zipkin服务界面上看到。
链路优化: 对于调用比较频繁的服务,可以针对这些服务实施一些优化措施。
spring cloud sleuth可以结合zipkin,将信息发送到zipkin,利用zipkin的存储来存储信息,利用zipkin ui来展示数据。
实现案例
在早前的Spring Cloud版本里是需要自建zipkin服务端的,但是从SpringCloud2.0 以后,官方已经不支持自建Server了,改成提供编译好的jar包供用户使用。因为我用的是2.0以后的版本,自建Servcer的方式请自行百度。这里我们是使用docker方式部署zipkin服务,并采用elasticsearch作为zipkin的数据存储器。
下载镜像
此前请先安装好docker环境,使用以下命令分别拉取zipkin和elasticsearch镜像。
docker pull openzipkin/zipkin
docker pull docker.elastic.co/elasticsearch/elasticsearch:6.3.0
通过 docker images 查看下载镜像。

编写启动文件
在本地创建如下文件夹结构, data目录用来存放elasticsearch存储的数据。
dockerfile
|- elasticsearch
| |- data
|- docker-compose.yml
编写docker-compose文件,主要作用是批量启动容器,避免在使用多个容器的时候逐个启动的繁琐。
docker-compose.yml
version: "3"
services: elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:6.3.0
container_name: elasticsearch
restart: always
networks:
- elk
ports:
- "9200:9200"
- "9300:9300"
volumes:
- ../elasticsearch/data:/usr/share/elasticsearch/data zipkin:
image: openzipkin/zipkin:latest
container_name: zipkin
restart: always
networks:
- elk
ports:
- "9411:9411"
environment:
- STORAGE_TYPE=elasticsearch
- ES_HOSTS=elasticsearch networks:
elk:
关于docker-compose.yml 文件格式及相关内容请自行百度了解。
启动服务
命令模式进入dockerfile目录,执行启动命令如下。
docker-compose up -d
执行过程如下图所示。

执行完成之后,通过 docker ps 命令查看,发现zipkin和elasticsearch确实启动起来了。

到这里,zipkin服务端就搭建起来了,访问 http://localhost:9411,效果如下,因为还没有客户端,所以还没有数据。

注意:
这里我们采用了elasticsearch作为存储方式,如果想简单通过内存方式启动,无须安装elasticsearch,直接启动一个zipkin容器即可。
docker run -d -p : openzipkin/zipkin
如果想使用其他如数据库等方式存储,请查询相关配置文档。
zipkin服务端已经搭建完成了,接下来我们来实现客户端。
添加依赖
修改 kitty-consumer 项目Maven配置,添加zipkin依赖。
pom.xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
配置文件
修改配置文件,添加如下zipkin配置。
spring:
zipkin:
base-url: http://localhost:9411/
sleuth:
sampler:
probability: 1 #样本采集量,默认为0.1,为了测试这里修改为1,正式环境一般使用默认值。
application.yml
server:
port: 8005
spring:
application:
name: kitty-consumer
cloud:
consul:
host: localhost
port: 8500
discovery:
serviceName: ${spring.application.name} # 注册到consul的服务名称
boot:
admin:
client:
url: "http://localhost:8000"
zipkin:
base-url: http://localhost:9411/
sleuth:
sampler:
probability: 1 #样本采集量,默认为0.1,为了测试这里修改为1,正式环境一般使用默认值。
# 开放健康检查接口
management:
endpoints:
web:
exposure:
include: "*"
endpoint:
health:
show-details: ALWAYS
#开启熔断器
feign:
hystrix:
enabled: true
测试效果
先后启动注册中心、服务监控、服务提供者、服务消费者。
反复访问几次 http://localhost:8005/feign/call,产生zipkin数据。

再次访问 http://localhost:9411, 发现出现了我们刚刚访问的服务,选择并点击追踪。

点击追踪之后,页面显示了相关的服务调用信息。

点击调用记录查看详情页面,可以看到每一个服务所耗费的时间和顺序。

源码下载
后端:https://gitee.com/liuge1988/kitty
前端:https://gitee.com/liuge1988/kitty-ui.git
作者:朝雨忆轻尘
出处:https://www.cnblogs.com/xifengxiaoma/
版权所有,欢迎转载,转载请注明原文作者及出处。
Spring Boot + Spring Cloud 实现权限管理系统 后端篇(二十二):链路追踪(Sleuth、Zipkin)的更多相关文章
- Spring Boot + Spring Cloud 实现权限管理系统 后端篇(十二):解决跨域问题
什么是跨域? 同源策略是浏览器的一个安全功能,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源. 同源策略是浏览器安全的基石. 如果一个请求地址里面的协议.域名和端口号都相同,就属于同源. ...
- Spring Boot + Spring Cloud 实现权限管理系统 后端篇(十九):服务消费(Ribbon、Feign)
技术背景 上一篇教程中,我们利用Consul注册中心,实现了服务的注册和发现功能,这一篇我们来聊聊服务的调用.单体应用中,代码可以直接依赖,在代码中直接调用即可,但在微服务架构是分布式架构,服务都运行 ...
- Spring Boot + Spring Cloud 实现权限管理系统 后端篇(十八):注册中心(Spring Cloud Consul)
什么是 Consul Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置.与其它分布式服务注册与发现的方案,Consul 的方案更“一站式”,内置了服务注册与 ...
- Spring Boot + Spring Cloud 实现权限管理系统 后端篇(十六):容器部署项目
容器部署项目 这一章我们引入docker,采用docker容器的方式部署我们的项目. 首先需要有一个linux环境,并且安装 java 和 maven 以及 docker 环境,这个教程多如牛毛,不再 ...
- Spring Boot + Spring Cloud 实现权限管理系统 后端篇(十五):系统服务监控
系统服务监控 新建监控工程 新建Spring Boot项目,取名 kitty-monitor,结构如下. 添加项目依赖 添加 spring boot admin 的相关依赖. pom.xml < ...
- Spring Boot + Spring Cloud 实现权限管理系统 后端篇(十四):项目打包部署
项目打包部署 安装MySQL镜像 注意:如果使用docker镜像安装MySQL,也需要在前端部署主机安装MySQL,因为备份还原功能是使用MySQL的本地命令进行操作的. 下载镜像 执行以下命令,拉取 ...
- Spring Boot + Spring Cloud 实现权限管理系统 后端篇(十):接口服务整理
通用操作 通用操作是指一般的增删改查操作,逻辑大体都是一致的,所以统一抽象到CURD接口,需要用到CURD的表直接实现接口就可以了. 通用操作主要有以下几个: 保存操作 /** * 保存操作 * @p ...
- Spring Boot + Spring Cloud 实现权限管理系统 后端篇(二十五):Spring Security 版本
在线演示 演示地址:http://139.196.87.48:9002/kitty 用户名:admin 密码:admin 技术背景 到目前为止,我们使用的权限认证框架是 Shiro,虽然 Shiro ...
- Spring Boot + Spring Cloud 实现权限管理系统 后端篇(一):Kitty 系统介绍
在线演示 演示地址:http://139.196.87.48:9002/kitty 用户名:admin 密码:admin 温馨提示: 有在演示环境删除数据的童鞋们,如果可以的话,麻烦动动小指,右键头像 ...
- Spring Boot + Spring Cloud 实现权限管理系统 后端篇(二十三):配置中心(Config、Bus)
在线演示 演示地址:http://139.196.87.48:9002/kitty 用户名:admin 密码:admin 技术背景 如今微服务架构盛行,在分布式系统中,项目日益庞大,子项目日益增多,每 ...
随机推荐
- Solidity合约间的调用-1
当调用其它合约的函数时,可以通过选项.value(),和.gas()来分别指定,要发送的ether量(以wei为单位),和gas值. pragma solidity ^; contract InfoF ...
- sqlserver 更新通过 select 查询出的结果集
update Babies set BirthOrder =tb.sn from Babies b1, (select ROW_NUMBER() over (partition by familyid ...
- Java代码获取spring 容器的bean几种方式
一.目的 写了一个项目,多个module,然后想在A模块中实现固定的config注入,当B模块引用A时候,能够直接填写相对应的配置信息就行了.但是遇到一个问题,B引用A时候,A的配置信息总是填充不了, ...
- Nginx学习笔记(反向代理&搭建集群)
一.前言 1.1 大型互联网架构演变历程 1.1.1 淘宝技术 淘宝的核心技术(国内乃至国际的 Top,这还是2011年的数据) 拥有全国最大的分布式 Hadoop 集群(云梯,2000左右节点,24 ...
- 【并发编程】IO模型
一.要点回顾 为了更好地了解IO模型,我们需要先回顾下几个概念:同步.异步.阻塞.非阻塞 同步: 一个进程在执行某个任务时,另外一个进程必须等待其执行完毕,才能继续执行.就是在发出一个功能调用时,在没 ...
- Linux环境下java开发环境搭建一 JDK搭建
第一步:下载jdk压缩文件 第二步:上传到家目录下的soft目录下,可以采用winscp,此处下载的是.tar.gz文件 第三步:解压压缩文件,并在/usr/local目录下创建一个jdk7的目录,并 ...
- js将数组根据条件分组
//将数组根据条件分组 function getTreeDateByParam(list, param, fun){ var data = {}; if(list && list.le ...
- python模块:configparser
"""Configuration file parser. A configuration file consists of sections, lead by a &q ...
- 利用ONENET平台透传电脑截图
这个仅供技术学习了 可以用在远程监控等行业,不用传统工具用的公网ip等比较坑爹的东西 还是比较方便的 需要的话请联系微信nbdx123
- [Python] networkx入门 转
networkx是python的一个第三方包,可以方便地调用各种图算法的计算. 通过调用python画图包matplotlib能实现图的可视化. 1.安装 正好整理一下python第三方包的安装方法. ...