文档章节

利用Zipkin对Spring Cloud应用进行服务追踪分析

voole
 voole
发布于 2017/02/25 09:07
字数 1396
阅读 1296
收藏 4

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

服务追踪分析

一个由微服务构成的应用系统通过服务来划分问题域,通过REST请求服务API来连接服务来完成完整业务。对于入口的一个调用可能需要有多个后台服务协同完成,链路上任何一个调用超时或出错都可能造成前端请求的失败。服务的调用链也会越来越长,并形成一个树形的调用链。

trace_tree

随着服务的增多,对调用链的分析也会越来越负责。设想你在负责下面这个系统,其中每个小点都是一个微服务,他们之间的调用关系形成了复杂的网络。

internal_services

有密集恐惧症的同学就忽略吧。

针对服务化应用全链路追踪的问题,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的概念图。

springcloud_sleuth_trace_id

服务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/repositories
VOLUME /tmp
ADD build/libs/*.jar app.jar
RUN sh -c 'touch /app.jar'
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

构建容器镜像的步骤如下:

cd tracedemo
./gradlew build
docker build -t zipkin-demo-frontend .

cd ../tracebackend
./gradlew build
docker 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次服务调用。

trace1

点击其中任意一个trace,可以看到请求链路上不同span所花费的时间。

trace2

进入Dependencies页面,还可以看到服务之间的依赖关系。

trace3

从这个过程可以看出,Zipkin和Spring Cloud的集成做得很好。而且对服务追踪分析的可视化也很直观。

注意的是,在生产环境中还需要为Zipkin配置数据库,这里就不详细介绍了。

本文的示例代码在此:https://github.com/binblee/zipkin-demo

小节

本文简单介绍了如何利用Zipkin对SpringCloud应用进行服务分析。在实际的应用场景中,Zipkin可以结合压力测试工具一起使用,分析系统在大压力下的可用性和性能。这部分内容未来会在DevOps系列中继续介绍。

本文转载自:https://yq.aliyun.com/articles/60165

共有 人打赏支持
voole

voole

粉丝 14
博文 88
码字总数 4329
作品 1
海淀
私信 提问
springcloud(十二):使用Spring Cloud Sleuth和Zipkin进行分布式链路跟踪

随着业务发展,系统拆分导致系统调用链路愈发复杂一个前端请求可能最终需要调用很多次后端服务才能完成,当整个请求变慢或不可用时,我们是无法得知该请求是由某个或某些后端服务引起的,这时...

ityouknow
10/28
0
0
史上最简单的SpringCloud教程 | 第九篇: 服务链路追踪(Spring Cloud Sleuth)(Finchley版本)

版权声明:本文为博主原创文章,欢迎转载,转载请注明作者、原文超链接 ,博主地址:http://blog.csdn.net/forezp。 https://blog.csdn.net/forezp/article/details/81041078 转载请标明出处...

方志朋
07/14
0
0
Steeltoe之Distributed Tracing篇

Steeltoe里的分布式追踪功能与Spring Cloud Sleuth一样,支持在日志中记录追踪数据,或者上传到远端的服务,比如Zipkin。 Logging 在Steeltoe中使用日志时需要引入其特有的日志包。 之后还需...

Ken.W
09/29
0
0
服务化改造实践(三) | Dubbo + Zipkin

随着业务的发展,应用的规模不断的扩大,传统的应用架构无法满足诉求,服务化架构改造势在必行,以 Dubbo 为代表的分布式服务框架成为了服务化改造架构中的基石。随着微服务理念逐渐被大众接...

阿里云云栖社区
10/24
0
0
史上最简单的SpringCloud教程 | 第九篇: 服务链路追踪(Spring Cloud Sleuth)

转载请标明出处: http://blog.csdn.net/forezp/article/details/70162074 本文出自方志朋的博客 这篇文章主要讲述服务追踪组件zipkin,Spring Cloud Sleuth集成了zipkin组件。 一、简介 Ad...

forezp
2017/04/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

小白带你认识netty(三)之NioEventLoop的线程(或者reactor线程)启动(一)

在第一章中,我们看关于NioEventLoopGroup的初始化,我们知道了NioEventLoopGroup对象中有一组EventLoop数组,并且数组中的每个EventLoop对象都对应一个线程FastThreadLocalThread,那么这个...

天空小小
今天
3
0
PHP动态扩展Redis模块

查看已有模块 [root@test-a ~]# /usr/local/php/bin/php -m[PHP Modules]bz2Core...zlib[Zend Modules] 下载包,解压,生成configure文件 [root@test-a ~]# cd /usr/local/src/[ro......

野雪球
今天
3
0
在Ignite中使用线性回归算法

在本系列前面的文章中,简单介绍了一下Ignite的机器学习网格,下面会趁热打铁,结合一些示例,深入介绍Ignite支持的一些机器学习算法。 如果要找合适的数据集,会发现可用的有很多,但是对于...

李玉珏
今天
4
0
Mybatis应用学习——简单使用示例

1. 传统JDBC程序中存在的问题 1. 一个简单的JDBC程序示例: public class JDBCDemo {public static void main(String[] args) {Connection con=null;PreparedStatement statemen...

江左煤郎
今天
4
0
使用JavaScript编写iOS应用业务逻辑

JSAUIKitCocoa使你可以使用JavaScript编写对性能要求不高但可能变动性很大的iOS应用的业务逻辑部分,View组件、需要多线程支持的Model等则直接使用原生对象。 编写方式与React Native相似,但...

neal01
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部