利用Zipkin对Spring Cloud应用进行服务追踪分析
设想这么一种情况,如果你的微服务数量逐渐增大,服务间的依赖关系越来越复杂,怎么分析它们之间的调用关系及相互的影响?
服务追踪分析
一个由微服务构成的应用系统通过服务来划分问题域,通过REST请求服务API来连接服务来完成完整业务。对于入口的一个调用可能需要有多个后台服务协同完成,链路上任何一个调用超时或出错都可能造成前端请求的失败。服务的调用链也会越来越长,并形成一个树形的调用链。
随着服务的增多,对调用链的分析也会越来越负责。设想你在负责下面这个系统,其中每个小点都是一个微服务,他们之间的调用关系形成了复杂的网络。
有密集恐惧症的同学就忽略吧。
针对服务化应用全链路追踪的问题,Google发表了Dapper论文,介绍了他们如何进行服务追踪分析。其基本思路是在服务调用的请求和响应中加入ID,标明上下游请求的关系。利用这些信息,可以可视化地分析服务调用链路和服务间的依赖关系。
Spring Cloud Sleuth和Zipkin
对应Dpper的开源实现是Zipkin,支持多种语言包括JavaScript,Python,Java, Scala, Ruby, C#, Go等。其中Java由多种不同的库来支持。
在这个示例中,我们准备开发两个基于Spring Cloud的应用,利用Spring Cloud Sleuth来和Zipkin进行集成。Spring Cloud Sleuth是对Zipkin的一个封装,对于Span、Trace等信息的生成、接入HTTP Request,以及向Zipkin Server发送采集信息等全部自动完成。
这是Spring Cloud Sleuth的概念图。
服务REST调用
本次演示的服务有两个:tracedemo做为前端服务接收用户的请求,tracebackend为后端服务,tracedemo通过http协议调用后端服务。
利用RestTemplate进行HTTP请求调用
tracedemo应用通过restTemplate调用后端tracedemo服务,注意,URL中指明tracedemo的地址为backend。
@RequestMapping("/")
public String callHome(){
LOG.log(Level.INFO, "calling trace demo backend");
return restTemplate.getForObject("http://backend:8090", String.class);
}
后端服务响应HTTP请求,输出一行日志后返回经典的“hello world”。
@RequestMapping("/")
public String home(){
LOG.log(Level.INFO, "trace demo backend is being called");
return "Hello World.";
}
引入Sleuth和Zipkin依赖包
可以看到,这是典型的两个spring应用通过RestTemplate进行访问的方式,哪在HTTP请求中注入追踪信息并把相关信息发送到Zipkin Server呢?答案在两个应用所加载的JAR包里。
本示例采用gradle来构建应用,在build.gradle中加载了sleuth和zipkin相关的JAR包:
dependencies {
compile('org.springframework.cloud:spring-cloud-starter-sleuth')
compile('org.springframework.cloud:spring-cloud-sleuth-zipkin')
testCompile('org.springframework.boot:spring-boot-starter-test')
}
Spring应用在监测到Java依赖包中有sleuth和zipkin后,会自动在RestTemplate的调用过程中向HTTP请求注入追踪信息,并向Zipkin Server发送这些信息。
哪么Zipkin Server的地址又是在哪里指定的呢?答案是在application.properties中:
spring.zipkin.base-url=http://zipkin-server:9411
注意Zipkin Server的地址为zipkin-server。
构建Docker镜像
为这两个服务创建相同的Dockerfile,用于生成Docker镜像:
FROM java:8-jre-alpine
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/'/etc/apk/repositoriesVOLUME /tmpADD build/libs/*.jar app.jarRUN sh -c 'touch /app.jar'ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
构建容器镜像的步骤如下:
cd tracedemo
./gradlew builddocker build -t zipkin-demo-frontend .cd ../tracebackend
./gradlew builddocker build -t zipkin-demo-backend .
构建镜像完成后用docker push命令上传到你的镜像仓库。
Zipkin Server
利用Annotation声明方式创建Zipkin
在build.gradle中引入Zipkin依赖包。
dependencies {
compile('org.springframework.boot:spring-boot-starter')
compile('io.zipkin.java:zipkin-server')
runtime('io.zipkin.java:zipkin-autoconfigure-ui')
testCompile('org.springframework.boot:spring-boot-starter-test')
}
在主程序Class增加一个注解@EnableZipkinServer
@SpringBootApplication
@EnableZipkinServer
public class ZipkinApplication {public static void main(String[] args) {
SpringApplication.run(ZipkinApplication.class, args);
}
}
在application.properties将端口指定为9411。
server.port=9411
构建Docker镜像
Dockerfile和前面的两个服务一样,这里就不重复了。
在阿里云容器服务上部署
创建docker-compose.yml文件,内容如下:
version: "2"
services:
zipkin-server:
image: registry.cn-hangzhou.aliyuncs.com/jingshanlb/zipkin-demo-server
labels:
aliyun.routing.port_9411: http://zipkin
restart: alwaysfrontend:
image: registry.cn-hangzhou.aliyuncs.com/jingshanlb/zipkin-demo-frontend
labels:
aliyun.routing.port_8080: http://frontend
links:
- zipkin-server
- backend
restart: alwaysbackend:
image: registry.cn-hangzhou.aliyuncs.com/jingshanlb/zipkin-demo-backend
links:
- zipkin-server
restart: always
在阿里云容器服务上使用编排模版创建应用,访问zipkin端点,可以看到服务分析的效果。
访问前端应用3次,页面显示3次服务调用。
点击其中任意一个trace,可以看到请求链路上不同span所花费的时间。
进入Dependencies页面,还可以看到服务之间的依赖关系。
从这个过程可以看出,Zipkin和Spring Cloud的集成做得很好。而且对服务追踪分析的可视化也很直观。
注意的是,在生产环境中还需要为Zipkin配置数据库,这里就不详细介绍了。
本文的示例代码在此:
https://github.com/binblee/zipkin-demo
利用Zipkin对Spring Cloud应用进行服务追踪分析相关推荐
- Spring Cloud 的微服务架构分析实战
前言 Spring Cloud 是一个相对比较新的微服务框架,2016 年才推出 1.0 的 release 版本. 虽然 Spring Cloud 时间最短, 但是相比 Dubbo 等 RPC 框架 ...
- 2022最新基于 Spring Cloud 的微服务架构分析,java 技术经理岗位职责
构建在开发团队之外的 API 网关必须具备负载均衡能力,可以配置多个 IP 地址.通过该 API 网关也最好具备和 Docker 容器扩展后的服务自动注册和地址加入扩展能力. Eureka 的竞品分析 ...
- 基于 Spring Cloud 的微服务架构分析
- 前言 - Spring Cloud是一个相对比较新的微服务框架,2016年才推出1.0的release版本. 虽然Spring Cloud时间最短, 但是相比Dubbo等RPC框架, ...
- 基于Spring Cloud的微服务架构分析
点击关注公众号,实用技术文章及时了解 来源:blog.caogo.cn/2021/06/20/ 基于Spring-Cloud的微服务架构分析 Spring Cloud是一个相对比较新的微服务框架,20 ...
- (十二)java版b2b2c社交电商spring cloud分布式微服务:使用Spring Cloud Sleuth和Zipkin进行分布式链路跟踪...
Spring Cloud Sleuth Spring cloud b2b2c电子商务社交平台源码请加企鹅求求:一零三八七七四六二六.一般的,一个分布式服务跟踪系统,主要有三部分:数据收集.数据存储和数 ...
- Spring Cloud构建微服务架构:分布式服务跟踪(整合zipkin)【Dalston版】
通过上一篇<分布式服务跟踪(整合logstash)>,我们虽然已经能够利用ELK平台提供的收集.存储.搜索等强大功能,对跟踪信息的管理和使用已经变得非常便利.但是,在ELK平台中的数据分析 ...
- 《深入理解 Spring Cloud 与微服务构建》第十四章 服务链路追踪 Spring Cloud Sleuth
<深入理解 Spring Cloud 与微服务构建>第十四章 服务链路追踪 Spring Cloud Sleuth 文章目录 <深入理解 Spring Cloud 与微服务构建> ...
- 《深入理解 Spring Cloud 与微服务构建》第三章 Spring Cloud
<深入理解 Spring Cloud 与微服务构建>第三章 Spring Cloud 文章目录 <深入理解 Spring Cloud 与微服务构建>第三章 Spring Clo ...
- 搭建基于Spring Cloud的微服务应用
原文链接 在2017云栖大会-上海峰会上阿里云技术专家李斌做了题为<搭建基于spring Cloud的微服务应用>的分享.随着时代的发展,用户对于应用服务的要求越来越高,单体应用已经无法满 ...
最新文章
- 谷歌搜索喜迎20年,为手机主页添加信息流!
- php5.6.11编译安装报错configure: error: Don't know how to define struct flock on this system
- 深入浅出解释FFT(七)——fft求频谱图和功率谱密度图
- Apache Kafka源码分析 – Log Management
- 12 个最佳的免费学习编程的游戏网站【转】
- 从这篇文章可以看出有些错误,由此可以看出,还是看msdn要好的多,这是我的经验
- 极致的线上产品设计与终极数据分析工具,两者缺一不可(中)
- Java IO - 字符流
- 最近整理关于SQL Server2005性能优化技巧
- 45行代码AC_2017年第八届蓝桥杯C/C++ A组第二题(广搜模板+解题报告)
- Cloudera发布全球企业数据成熟度报告,混合云趋势中有效数据战略是关键
- Java:实验四第6题
- centOS下JDK1.8的安装
- 1,python基础入门
- android开发框架 xui,简介 - 正确使用XUI的姿势 - 《XUI - Android 原生 UI 框架》 - 书栈网 · BookStack...
- js 检测浏览器开发者控制台是否被打开
- 使用addClass和removeClass完成内容切换
- Numpy掩码数组masked arrays
- 数据库被攻击 怎么解决
- 秉火429笔记之七位带操作
热门文章
- 网站页面间脚本传值 sessionStorage
- 启动 Eclipse 弹出“Failed to load the JNI shared library jvm.dll”错误的解决方法!在eclipse.ini中为eclipse指定jdk启动...
- HTTPS 加密算法原理详解
- AngularJS内置指令 ng-xxx
- Bower介绍及用法(转)
- 编译内核出错:invalid option `abi=aapcs-linux'
- 战“疫”日记②|火神山小分队:像听到发令枪一样;徐碧江带勇士集结长沙“小汤山”...
- Python项目实战:爬取斗图网表情包图片
- CSS实现水平垂直居中的方法总结
- 每日一拍:linux升级python2.x到python3.x