设想这么一种情况,如果你的微服务数量逐渐增大,服务间的依赖关系越来越复杂,怎么分析它们之间的调用关系及相互的影响?

服务追踪分析

一个由微服务构成的应用系统通过服务来划分问题域,通过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: always

frontend:
    image: registry.cn-hangzhou.aliyuncs.com/jingshanlb/zipkin-demo-frontend
    labels:
      aliyun.routing.port_8080: http://frontend
    links:
      - zipkin-server
      - backend
    restart: always

backend:
    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应用进行服务追踪分析相关推荐

  1. Spring Cloud 的微服务架构分析实战

    前言 Spring Cloud 是一个相对比较新的微服务框架,2016 年才推出 1.0 的 release 版本. 虽然 Spring Cloud 时间最短, 但是相比 Dubbo 等 RPC 框架 ...

  2. 2022最新基于 Spring Cloud 的微服务架构分析,java 技术经理岗位职责

    构建在开发团队之外的 API 网关必须具备负载均衡能力,可以配置多个 IP 地址.通过该 API 网关也最好具备和 Docker 容器扩展后的服务自动注册和地址加入扩展能力. Eureka 的竞品分析 ...

  3. 基于 Spring Cloud 的微服务架构分析

    -     前言    - Spring Cloud是一个相对比较新的微服务框架,2016年才推出1.0的release版本. 虽然Spring Cloud时间最短, 但是相比Dubbo等RPC框架, ...

  4. 基于Spring Cloud的微服务架构分析

    点击关注公众号,实用技术文章及时了解 来源:blog.caogo.cn/2021/06/20/ 基于Spring-Cloud的微服务架构分析 Spring Cloud是一个相对比较新的微服务框架,20 ...

  5. (十二)java版b2b2c社交电商spring cloud分布式微服务:使用Spring Cloud Sleuth和Zipkin进行分布式链路跟踪...

    Spring Cloud Sleuth Spring cloud b2b2c电子商务社交平台源码请加企鹅求求:一零三八七七四六二六.一般的,一个分布式服务跟踪系统,主要有三部分:数据收集.数据存储和数 ...

  6. Spring Cloud构建微服务架构:分布式服务跟踪(整合zipkin)【Dalston版】

    通过上一篇<分布式服务跟踪(整合logstash)>,我们虽然已经能够利用ELK平台提供的收集.存储.搜索等强大功能,对跟踪信息的管理和使用已经变得非常便利.但是,在ELK平台中的数据分析 ...

  7. 《深入理解 Spring Cloud 与微服务构建》第十四章 服务链路追踪 Spring Cloud Sleuth

    <深入理解 Spring Cloud 与微服务构建>第十四章 服务链路追踪 Spring Cloud Sleuth 文章目录 <深入理解 Spring Cloud 与微服务构建> ...

  8. 《深入理解 Spring Cloud 与微服务构建》第三章 Spring Cloud

    <深入理解 Spring Cloud 与微服务构建>第三章 Spring Cloud 文章目录 <深入理解 Spring Cloud 与微服务构建>第三章 Spring Clo ...

  9. 搭建基于Spring Cloud的微服务应用

    原文链接 在2017云栖大会-上海峰会上阿里云技术专家李斌做了题为<搭建基于spring Cloud的微服务应用>的分享.随着时代的发展,用户对于应用服务的要求越来越高,单体应用已经无法满 ...

最新文章

  1. 谷歌搜索喜迎20年,为手机主页添加信息流!
  2. php5.6.11编译安装报错configure: error: Don't know how to define struct flock on this system
  3. 深入浅出解释FFT(七)——fft求频谱图和功率谱密度图
  4. Apache Kafka源码分析 – Log Management
  5. 12 个最佳的免费学习编程的游戏网站【转】
  6. 从这篇文章可以看出有些错误,由此可以看出,还是看msdn要好的多,这是我的经验
  7. 极致的线上产品设计与终极数据分析工具,两者缺一不可(中)
  8. Java IO - 字符流
  9. 最近整理关于SQL Server2005性能优化技巧
  10. 45行代码AC_2017年第八届蓝桥杯C/C++ A组第二题(广搜模板+解题报告)
  11. Cloudera发布全球企业数据成熟度报告,混合云趋势中有效数据战略是关键
  12. Java:实验四第6题
  13. centOS下JDK1.8的安装
  14. 1,python基础入门
  15. android开发框架 xui,简介 - 正确使用XUI的姿势 - 《XUI - Android 原生 UI 框架》 - 书栈网 · BookStack...
  16. js 检测浏览器开发者控制台是否被打开
  17. 使用addClass和removeClass完成内容切换
  18. Numpy掩码数组masked arrays
  19. 数据库被攻击 怎么解决
  20. 秉火429笔记之七位带操作

热门文章

  1. 网站页面间脚本传值 sessionStorage
  2. 启动 Eclipse 弹出“Failed to load the JNI shared library jvm.dll”错误的解决方法!在eclipse.ini中为eclipse指定jdk启动...
  3. HTTPS 加密算法原理详解
  4. AngularJS内置指令 ng-xxx
  5. Bower介绍及用法(转)
  6. 编译内核出错:invalid option `abi=aapcs-linux'
  7. 战“疫”日记②|火神山小分队:像听到发令枪一样;徐碧江带勇士集结长沙“小汤山”...
  8. Python项目实战:爬取斗图网表情包图片
  9. CSS实现水平垂直居中的方法总结
  10. 每日一拍:linux升级python2.x到python3.x