SpringCloud实战十六:Spring Cloud Sleuth + Zipkin 调用链监控

桃扇骨 2022-03-20 14:14 415阅读 0赞
1.为什么需要调用链监控?

  随着系统规模越来越大,服务数目增加,各微服务间的调用关系也越来越错综复杂,通常一个客户端发起的请求在后端系统中会经过多个不同的微服务调用来协同产生结果并返回,在复杂的微服务架构系统中,几乎每一个前端请求都会形成一条复杂的分布式服务调用链路,在每条链路中任何一个依赖服务出现延迟过高或错误的时候都会引起请求最后的失败,这时候,对于每一个请求,调用链的跟踪就变得越来越重要,通过实现对请求调用的跟踪可以帮助我们快速发现错误以及监控分析每条链路上的性能瓶颈,现今业界分布式服务跟踪的理论基础主要来自于 Google 的一篇论文《Dapper, a Large-Scale Distributed Systems Tracing Infrastructure》。

2.应用监控缺失会出现哪些问题
  • 线上发布服务后,怎么知道这些服务是正常的
  • 大量报错,根源在哪里
  • 人工配置错误,查找起来要很久很久
  • 会不会最后都把问题归根于“网络问题”
  • 任何可能出错的地方都会出错,因此微服务需要监控
3.Spring Cloud Sleuth

Spring Cloud Sleuth也是依据Dapper论文而诞生的,它的核心概念是:

  • Trace:一次分布式调用的链路踪迹
  • Span:一个方法(局部或远程)调用踪迹
  • Annotation:附着在Spane上的日志信息
  • Sampling:采样率(0-1,1是全采样)
  • 引用Sleuth官方提供的示意图(Sletuh官网地址),将Span和Trace在一个系统中使用Zipkin注解的过程图形化:
    在这里插入图片描述
    在这里插入图片描述
4.Zipkin

Zipkin 是一个开放源代码分布式的跟踪系统,由Twitter公司开源,它致力于收集服务的定时数据,以解决微服务架构中的延迟问题,包括数据的收集、存储、查找和展现,Zipkin的设计是基于谷歌的Google Dapper论文。
Zipkin的服务端已经打包成了一个 jar,使用 java -jar zipkin-server.jar 启动,访问 localhost:9411 查看zipkin主页
在这里插入图片描述
Zipkin官网地址:https://zipkin.io/

5.Spring Cloud Sleuth 与 Zipkin 的关系

Zipkin收集 Sleuth 产生的数据,并以界面的形式呈现出来

6.代码实践

请求流程:请求先到达service1,再到service2,由service2分别调用service3和service4,最后响应回去
在这里插入图片描述
所需环境:eureka,zipkin-server,4个服务

  • 1.eureka使用之前博客中的,直接启动
  • 2.启动zipkin-server,端口在9411
  • 3.新建4个服务,引用都是一样的,下面以 service-a 服务为例(service-a 对应上面的 service1):
    在这里插入图片描述
  • 4.项目依赖:


    org.springframework.boot
    spring-boot-starter-web


    org.springframework.cloud
    spring-cloud-starter-netflix-eureka-client


    org.springframework.cloud
    spring-cloud-starter-sleuth


    org.springframework.cloud
    spring-cloud-starter-zipkin
  • 5.配置文件:

    server:
    port: 8071
    spring:
    application:

    1. name: service-a

    sleuth:

    1. web:
    2. enabled: true
    3. sampler:
    4. probability: 1.0

    zipkin:

    1. base-url: http://localhost:9411

    注册中心配置

    eureka:
    instance:

    1. prefer-ip-address: true
    2. hostname: localhost

    client:

    1. service-url:
    2. defaultZone: http://zy:zy123@localhost:10025/eureka/
  • 6.启动类:

    @EnableDiscoveryClient
    @SpringBootApplication
    public class ServiceAApplication {

    1. public static void main(String[] args) {
    2. SpringApplication.run(ServiceAApplication.class, args);
    3. }
    4. @Bean
    5. @LoadBalanced
    6. public RestTemplate restTemplate(){
    7. return new RestTemplate();
    8. }

    }

  • 7.添加控制器,开始远程调用

    @RestController
    public class IndexController {

    1. @Autowired private RestTemplate restTemplate;
    2. @RequestMapping("/index")
    3. public String index(){
    4. //远程调用service-b的方法,service-b分别调用service-c、service-b
    5. String result = remoteCallServiceB();
    6. return " service-a start ," + result;
    7. }
    8. //远程调用service-b
    9. private String remoteCallServiceB(){
    10. String url = "http://service-b/Second";
    11. String result = restTemplate.getForObject(url , String.class);
    12. return result;
    13. }

    }

  • 8.分别启动4个服务
    在这里插入图片描述

  • 9.访问 http://localhost:8071/index ,看到请求从 service-a 开始,service-d为止,最后正确返回
    在这里插入图片描述
  • 10.再访问 http://localhost:9411/ ,点击蓝色的 Find Traces 按钮 ,可以看到本次请求的详细信息与耗时:
    在这里插入图片描述
    上面是本次请求经过了4个服务,每个服务的耗时,下面是每个服务的耗时,点击某个服务看详细
    在这里插入图片描述
    点击service-b,查看详情
    在这里插入图片描述
    以上是正常请求的展示过程,再模拟一个错误请求,看zipkin监控页面能否查看到

手动把 service-c 停掉,那么服务调用时,会出现错误,在zipkin监控页面能看到有一个请求是红色的错误提示
在这里插入图片描述
可以看到请求到 service-b 就停止了,没有到 service-c,点击最后那个service-b,可以看到详细错误信息
在这里插入图片描述
详细错误信息页面如下,service-b 调用 service-c 时,因停了 service-c ,所以没有发现可用实例
在这里插入图片描述
我们还可以在 zipkin 监控页面查看请求流程图,点击 Dependencies
在这里插入图片描述

好了,Spring Cloud Sleuth + Zipkin 调用链监控功能就完成了

代码已上传至码云:

  • eureka-server
  • sleuth

在团队小,业务量小时,为了快速开发,使用 Spring Cloud Sleuth + Zipkin可以快速进行微服务监控,但是 Zipkin 有些缺点

美团-大众点评在git上开源了 CAT 监控工具,有使用教程,超过8000课星,有业界一线的互联网公司接入(很成熟了,一些坑已经被踩了),在服务规模大时,接入 CAT 监控是个不错的选择
CAT 地址:https://github.com/dianping/cat
在这里插入图片描述
网友对 CAT 、Zipkin、Pinpoint等监控组件进行了对比
在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,415人围观)

还没有评论,来说两句吧...

相关阅读