阿里云Kubernetes SpringCloud 实践进行时(4): 分布式链路追踪

简介

为了更好地支撑日益增长的庞大业务量,我们常常需要把服务进行整合、拆分,使我们的服务不仅能通过集群部署抵挡流量的冲击,又能根据业务在其上进行灵活的扩展。随着分布式的普及、服务的快速增长与云计算技术的进步,微服务架构也因其特有的优势而备受关注。微服务架构的本质,是把整体的业务拆分成很多有特定明确功能的服务,通过很多分散的小服务之间的配合,去解决更大,更复杂的问题。对被拆分后的服务进行分类和管理,彼此之间使用统一的接口来进行交互。

本系列讲述了在阿里云Kubernetes容器服务基础之上,如何快速搭建基于Spring Cloud的微服务架构中的基础设施:

本文是系列中的第四篇,着重介绍分布式追踪系统Zipkin。

微服务的特点决定了一次请求可能少则经过几次服务调用完成,多则跨越几十个甚至是上百个服务节点。以往在单应用环境下,所有的业务都在同一个服务器上,如果服务器出现错误和异常,只要盯住一个点,就可以快速定位和处理问题。

但是在微服务的架构下,如何分析服务链路的瓶颈并对其进行调优,如何快速进行服务链路的故障发现,如何跟踪业务流的处理顺序和结果,等等。这些在单应用下看起来较容易处理的事情,在微服务架构下却成为了一个大问题。

Dapper与Zipkin

为了应对自身大规模的复杂集群环境,Google公司提出了一套分布式跟踪系统的理论机制,并发表了论文《Dapper, a Large-Scale Distributed Systems Tracing Infrastructure》,给行业内分布式跟踪的实现提供了非常有价值的参考。当前该论文也成为了当前分布式跟踪系统的理论基础。

Zipkin是一款开源的分布式实时数据追踪系统,基于 Google Dapper的论文设计而来,由 Twitter 公司开发贡献。其主要功能是聚集来自各个异构系统的实时监控数据。

各业务系统在彼此调用时,将特定的跟踪消息传递至zipkin,zipkin在收集到跟踪信息后将其聚合处理、存储、展示等,用户可通过web UI方便获得网络延迟、调用链路、系统依赖等等。

Zipkin主要包括四个模块:

  • Collector 接收或收集各应用传输的数据
  • Storage 存储接受或收集过来的数据,当前支持Memory,MySQL,Cassandra,ElasticSearch等,默认存储在内存中。
  • API(Query) 负责查询Storage中存储的数据,提供简单的JSON API获取数据,主要提供给web UI使用
  • Web 提供简单的web界面

Spring Cloud与Zipkin

为了更好地支持集成分布式追踪系统,Spring Cloud实现了一个名为Sleuth的项目,使得开发人员只需要少量代码即可实现与Zipkin等系统的集成。

下面讲述一下在阿里云Kubernetes容器服务基础之上,如何快速搭建一套分布式追踪系统。

准备Kubernetes环境

阿里云容器服务Kubernetes 1.9.3目前已经上线,可以通过容器服务管理控制台非常方便地快速创建 Kubernetes 集群。具体过程可以参考创建Kubernetes集群

体验通过应用目录简便部署

Zipkin的存储和收集可以根据实际情况进行配置,默认情况下,存储使用了内存方式,收集则是使用了http post (/api/v1/spans)方式。监听端口默认为9411。这种方式仅限于开发测试环境,因为一旦重启之后,内存中的数据将会消失,不能得到有效保存。

点击左侧的应用目录,在右侧选中ack-springcloud-zipkin,如下:

阿里云Kubernetes SpringCloud 实践进行时(4): 分布式链路追踪

点击参数, 可以通过修改参数配置进行定制化,例如指定数据库MySQL的root用户访问密码、创建数据库新用户、指定数据库名称等等。修改之后,在右侧选择对应的集群、命名空间,指定发布名称,然后点击部署。

replicaCount: 2
image:
  repository: registry.cn-hangzhou.aliyuncs.com/aliacs-app-catalog/zipkin
  tag: 1.5.13.RELEASE
  pullPolicy: Always

service:
  enabled: true
  type: LoadBalancer
  externalPort: 9411
  internalPort: 9411

mysql:
  image: "registry.cn-hangzhou.aliyuncs.com/aliacs-app-catalog/mysql"
  imageTag: "5.7.20"
  ## Specify password for root user
  ##
  ## Default: random 10 character string
  # mysqlRootPassword: testing

  ## Create a database user
  ##
  mysqlUser: mysqluser
  mysqlPassword:

  ## Allow unauthenticated access, uncomment to enable
  ##
  # mysqlAllowEmptyPassword: true

  ## Create a database
  ##
  mysqlDatabase: mydb

其中,

  • 指定mysql.mysqlRootPassword为mysql服务创建时指定的root用户密码,不填写时会自动分配一个随机密码;
  • 指定mysql.mysqlUser为mysql服务创建时指定的用户名称
  • 指定mysql.mysqlPassword为mysql服务创建时指定的用户密码,不填写时会自动分配一个随机密码;
  • 指定mysql.db为mysql服务创建时指定的数据库名称

修改之后,在右侧选择对应的集群、命名空间,指定发布名称,然后点击部署。

几分钟之后,一个挂载了mysql数据库的Zipkin实例就可以创建出来。

体验Zipkin Server

点击左侧的服务,在右侧点击刚创建的Zipkin服务提供的访问地址,

阿里云Kubernetes SpringCloud 实践进行时(4): 分布式链路追踪

在打开的Zipkin界面中,点击上部的菜单 - Dependencies,再点击Find a trace,就可以快速验证Zipkin是否启动成功。
如果点击查询,可以看到如下类似的trace内容,则证明Zipkin Server已正常启动。

阿里云Kubernetes SpringCloud 实践进行时(4): 分布式链路追踪

开发微服务并集成Zipkin

如下图所示,提供了4个基于Spring Boot开发的微服务示例,具体代码请参阅: https://github.com/AliyunContainerService/spring-cloud-k8s-sample

阿里云Kubernetes SpringCloud 实践进行时(4): 分布式链路追踪

切换到每个Spring Boot项目的根目录,执行mvn spring-boot:run启动服务。确保4个服务项目都正常启动之后,在浏览器或者postman中访问: http://localhost:8031/service1/test1

打开Zipkin控制台界面,选择service1搜索就可以看到如下所示的调用链路:

阿里云Kubernetes SpringCloud 实践进行时(4): 分布式链路追踪

点击每一项可以查看具体的调用详情,如服务间的调用关系、消耗时间等,如下图所示:

阿里云Kubernetes SpringCloud 实践进行时(4): 分布式链路追踪

总结

我们可以利用阿里云Kubernetes容器服务,快速搭建一套分布式追踪系统,为应用引入和配置Zipkin服务。欢迎大家使用阿里云上的容器服务,快速搭建一套分布式追踪系统Zipkin,比较简单地集成到自己项目的微服务开发中。

上一篇:转换Json到XML的JavaScript实现


下一篇:从零开始学习jQuery (十一) 实战表单验证与自动完成提示插件