为了更好地支撑日益增长的庞大业务量,我们常常需要把服务进行整合、拆分,使我们的服务不仅能通过集群部署抵挡流量的冲击,又能根据业务在其上进行灵活的扩展。随着分布式的普及、服务的快速增长与云计算技术的进步,微服务架构也因其特有的优势而备受关注。微服务架构的本质,是把整体的业务拆分成很多有特定明确功能的服务,通过很多分散的小服务之间的配合,去解决更大,更复杂的问题。对被拆分后的服务进行分类和管理,彼此之间使用统一的接口来进行交互。
本系列讲述了在阿里云Kubernetes容器服务基础之上,如何快速搭建基于Spring Cloud的微服务架构中的基础设施:
本文是系列中的第四篇,着重介绍分布式追踪系统Zipkin。
微服务的特点决定了一次请求可能少则经过几次服务调用完成,多则跨越几十个甚至是上百个服务节点。以往在单应用环境下,所有的业务都在同一个服务器上,如果服务器出现错误和异常,只要盯住一个点,就可以快速定位和处理问题。
但是在微服务的架构下,如何分析服务链路的瓶颈并对其进行调优,如何快速进行服务链路的故障发现,如何跟踪业务流的处理顺序和结果,等等。这些在单应用下看起来较容易处理的事情,在微服务架构下却成为了一个大问题。
为了应对自身大规模的复杂集群环境,Google公司提出了一套分布式跟踪系统的理论机制,并发表了论文《Dapper, a Large-Scale Distributed Systems Tracing Infrastructure》,给行业内分布式跟踪的实现提供了非常有价值的参考。当前该论文也成为了当前分布式跟踪系统的理论基础。
Zipkin是一款开源的分布式实时数据追踪系统,基于 Google Dapper的论文设计而来,由 Twitter 公司开发贡献。其主要功能是聚集来自各个异构系统的实时监控数据。
各业务系统在彼此调用时,将特定的跟踪消息传递至zipkin,zipkin在收集到跟踪信息后将其聚合处理、存储、展示等,用户可通过web UI方便获得网络延迟、调用链路、系统依赖等等。
Zipkin主要包括四个模块:
为了更好地支持集成分布式追踪系统,Spring Cloud实现了一个名为Sleuth的项目,使得开发人员只需要少量代码即可实现与Zipkin等系统的集成。
下面讲述一下在阿里云Kubernetes容器服务基础之上,如何快速搭建一套分布式追踪系统。
阿里云容器服务Kubernetes 1.9.3目前已经上线,可以通过容器服务管理控制台非常方便地快速创建 Kubernetes 集群。具体过程可以参考创建Kubernetes集群。
Zipkin的存储和收集可以根据实际情况进行配置,默认情况下,存储使用了内存方式,收集则是使用了http post (/api/v1/spans)方式。监听端口默认为9411。这种方式仅限于开发测试环境,因为一旦重启之后,内存中的数据将会消失,不能得到有效保存。
点击左侧的应用目录
,在右侧选中ack-springcloud-zipkin
,如下:
点击参数
, 可以通过修改参数配置进行定制化,例如指定数据库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服务提供的访问地址,
在打开的Zipkin界面中,点击上部的菜单 - Dependencies
,再点击Find a trace
,就可以快速验证Zipkin是否启动成功。
如果点击查询,可以看到如下类似的trace内容,则证明Zipkin Server已正常启动。
如下图所示,提供了4个基于Spring Boot开发的微服务示例,具体代码请参阅: https://github.com/AliyunContainerService/spring-cloud-k8s-sample
切换到每个Spring Boot项目的根目录,执行mvn spring-boot:run启动服务。确保4个服务项目都正常启动之后,在浏览器或者postman中访问: http://localhost:8031/service1/test1
打开Zipkin控制台界面,选择service1搜索就可以看到如下所示的调用链路:
点击每一项可以查看具体的调用详情,如服务间的调用关系、消耗时间等,如下图所示:
我们可以利用阿里云Kubernetes容器服务,快速搭建一套分布式追踪系统,为应用引入和配置Zipkin服务。欢迎大家使用阿里云上的容器服务,快速搭建一套分布式追踪系统Zipkin,比较简单地集成到自己项目的微服务开发中。