微服务架构将原先业务链条中的各个环节(节点或过程),如用户、产品、订单、支付拆分实现成独立的服务运行,一定程度上提高了系统的容错能力,例如支付服务失败时,用户依然可以通过产品及订单服务,达到查看订单和浏览产品的目的。随着微服务应用开发框架(如springboot)和容器技术(如K8)越来越成熟,微服务的开发和运维趋于标准化。这些都是微服务的愈发流行的原因。同时,随着业务复杂度的提高,越来越多的微服务被开发和集成进来,服务管理的重要性不言而喻。本文以服务调用的链路管理为题,浅谈微服务治理中链路管理的主流技术如何实践。
链路管理,主要指记录服务的调用链路,通常用来定位不合理的服务设计,如链路过长带来的服务耗时问题、链路过长带来的服务稳定性风险、循环依赖等。链路管理,需要考虑哪些方面的问题,如何实现?
有了这个思路之后,我们再来看目前主流的链路解决方案,Twitter的Zipkin,以及Apache的在孵化项目Skwalking。当然还有些比较热的方案,如韩国的开源项目Pinpoint和美团的CAT。这些方案从实现技术上大致可分为两个派系,拦截派,字节码增强派。拦截派做法通过代理类拦截请求,将链路信息发送给服务器,Zipkin和CAT都属于这种类型,不过CAT需要代码侵入,即代码中增加埋点,而Zipkin直接通过SpringCloud的Sleuth无缝对接SpringBoot的微服务。字节码增强技术,通过JVMTI接口提供的javaagent(区别于JDK动态代理和CGLIB代理),利用字节码操作技术(ASM),在类加载并实例化之前对class进行转换,之后运行中将信息采集并发送给代理服务器(探针),如skwalking的Agent服务。关于两种方式的比较,小结如下:
| 类型 | zipkin | sk*walking |
|---|---|---|
| 基本原理 | 拦截请求,发送(HTTP,mq)数据至zipkin服务 | java探针,字节码增强 |
| 接入方式 | 基于linkerd或者sleuth方式,引入配置即可 | avaagent字节码 |
| 支持OpenTracing | 是 | 是 |
| 颗粒度 | 接口级(类级别) | 方法级 |
| 存储 | ES,mysql,Cassandra,内存 | ES,H2,TIDB |
| agent到collector的协议 | http,MQ | http,gRPC |
先看下Zipkin运行架构
左侧应用服务,同时也是Zipkin-clinet,Eureka-client, 中间是依赖,包括Zipkin-server和Eureka-server,最右侧是WebUI展示及开发接口。
原文:https://blog.51cto.com/10705830/2433647