gitbook/全链路压测实战30讲/docs/430223.md
2022-09-03 22:05:03 +08:00

129 lines
8.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 04 | 核心链路:如何梳理符合真实业务场景的核心链路?
你好,我是高楼。
上一讲,我给你展示了我认为一个完整的全链路压测方案应该具有的样子。在项目的选择上,我们使用的是开源微服务电商项目。这个项目采用的技术栈,是当前技术市场中流行的主流微服务技术栈,所以很可能对你也有借鉴意义。
这节课,我们还是用这个项目来讲讲,怎么梳理出符合真实业务场景的核心链路。
我们知道,在完整的企业级系统中,业务逻辑是非常复杂的。为了清晰地把业务实现到技术层面,就需要一层层地分析。
可是对一线做技术的人来说,这种做法常常会让人陷到细节里无法自拔,从而丧失全局观。所以,在做技术细节的同时,我们也很有必要再转换一下思维,从更全面的视角来观察系统。
再具体到全链路压测来看,因为我们面对的是一个完整而又复杂的线上系统,所以我们就要从架构的视角出发来分析业务链路。
不过提到架构,很多人对它并没有明确的概念,另一些人又觉得架构是个宏观的东西,无法把控。
## 从架构聊起
既然如此,我们就先来聊一聊,架构是个什么东西?
简单来说,架构就是一个系统的抽象描述,它包括系统中的组成元素以及元素与元素之间的关系。
既然是抽象那不同的视角抽象出来的东西就不一样。像RUP 4+1视图它就包括逻辑视图、开发视图、进程视图和物理视图而场景则是用来描述他们之间的关系的。
在逻辑层面,我们经常聊到的业务架构、技术架构、部署架构等,这些都是架构的不同视角。
在实现层面我们经常聊到的单体架构、SOA架构、微服务分布式架构、分层架构、微核架构、云架构等这些都是从不同的技术层面来分类的。
上面说的都还只是架构的一些具体的分类。更系统地来看,技术发展到现在,已经把一个系统、完整的架构分为了四个大类,它们分别是:应用架构、技术架构、数据架构、安全架构。这是从不同的实现视角来承接业务架构的。但是这样的视角还必须落到系统中,还需要再细化到逻辑架构和物理层面,才可以最终落地。
讲了这么多架构的分类,你可能要问了,它和我们梳理业务核心链路有什么关系呢?其实讲这些是因为,链路要在架构上来画才能描述得更清楚。
那从哪种架构开始梳理业务链路更清楚呢。先来看一下,我们这个系统应用架构的逻辑图。
![](https://static001.geekbang.org/resource/image/46/32/46ae02d0f31af5831382216700a75632.jpg?wh=1920x1453)
像这种框框画出来的图,是不是让人看一眼大概就能知道里面有什么东西了?但这张图还没有表示出具体的部署情况。如果你觉得这个图不好看,我再放一个这样的图。
![图片](https://static001.geekbang.org/resource/image/2f/4b/2f032901efyy2d9f9e3df8f123e8534b.png?wh=1673x926)
这个图是不是看起来逻辑架构清晰一点了?这张图虽然看起来和上一张图差不多,都是一些小方框,但已经开始偏向部署视角了。不过,我还没有画出服务之间的关系。
我们再换一个视角。
![](https://static001.geekbang.org/resource/image/ab/9e/abd7df412998461cd240fe314104a99e.jpg?wh=1920x1590)
这样看起来是不是又清楚了一点?没错,这张图已经把部署视角很清晰地描绘出来了。
我这么详细地给你描述架构的不同视角,是希望你能够理解我下面的动作。我希望你能够分清楚各种不同架构的目的,因为只有理解架构才能理解链路。
## 梳理核心业务链路
但是,我们要梳理的是核心业务链路,上面的图却没有办法体现调用关系。那业务链路要怎么从这样的视角体现出来呢。
这时候我们就要祭出APM工具了。打个比方对当前比较主流的微服务分布式架构来说它的链路图是这样的。
![图片](https://static001.geekbang.org/resource/image/cf/74/cf08a14529f7a888a3ddb1348c9f1c74.png?wh=1920x1143)
在SOA架构的时代链路图都是记在脑子里的。因为服务没有那么多倒也记得住。但是在微服务架构中你很难记得住那么多服务。为了更有条理地梳理核心链路我们就要借助链路监控工具了。
只有链路图还不行,要想梳理核心业务链路,还得知道什么是核心业务。核心业务的特点其实主要就两个:一、用得多;二、利润高。
我们先看符合“用得多”这个特点的业务。
先做一个业务接口访问的统计。
![图片](https://static001.geekbang.org/resource/image/fa/b9/fa9716d8514b597995ba008cc3ebbeb9.png?wh=252x340)
截图中展示的是统计出来的业务接口,梳理下来就是这样的业务内容。
![](https://static001.geekbang.org/resource/image/ff/82/ffeb1ca2f370f317d671bfacb946b182.jpg?wh=1920x917)
知道了是哪些业务,关键的一步就来了:你要在架构图上画出对应的链路。
我们先拿生成订单信息(在这个系统中,这个接口是最复杂的)的这个接口来说。从接口路径/order/generateOrder上来看显然是直接访问的order接口。我们来看一下这个接口的泳道图。
![图片](https://static001.geekbang.org/resource/image/8d/8e/8da29a39eda07e833760d8a95b41698e.png?wh=1920x2554)
这张图是不是乍一看相当复杂?但如果仔细分析一下,你会发现它清晰明了。
从泳道图上你可以直观地看到和order直接相关的服务。因为这个图比较大看不清楚我们细看其中一段。
![图片](https://static001.geekbang.org/resource/image/ec/6e/ecf1d18ea4295f7411868ce89dfbe06e.png?wh=1023x730)
从细节图中可以看出这个接口调用了Cart服务和Member服务。这样一来这个链路就可以画成下面这样了。
![](https://static001.geekbang.org/resource/image/e2/b0/e2aabb4b9185d6f304ea73df5fb429b0.jpg?wh=1920x794)
如果接着往下分析你就能知道这个接口调用的所有链路了。但是从代码中一点点去翻链路关系显然是不理智的借助APM工具SkyWalking我们就可以得到下面这样的图。
![图片](https://static001.geekbang.org/resource/image/c2/50/c2bf12532f7bd2caf09314bc0ee73a50.png?wh=1007x680)
具体用哪种APM工具你可以根据自己的习惯和需要来选只要看到相应的结构即可。比如用Zipkin梳理出的链路图是这样的。
![图片](https://static001.geekbang.org/resource/image/28/d0/2861380c4fbda55d3bbfe14842c5a1d0.png?wh=1920x1043)
在这些链路图中,你可以看到所有相关的服务,包括数据库、缓存等。不过,直晃晃地给一个图出来,还是没有办法说明链路。你还要画出箭头表示调用方向。
![图片](https://static001.geekbang.org/resource/image/af/83/af9e53bb6c993852e5bbb377011f2683.jpg?wh=1920x1297)
为了配合上面泳道图中的内容,我只画了相关的服务。这样我们就有了一个接口的链路图了。
用这样的方法把所有的接口都梳理一遍,你会得到一组完整的调用链路关系。
![](https://static001.geekbang.org/resource/image/43/d3/438832ce2a5a276151917068d89480d3.jpg?wh=1920x1080)
这样,我们就把核心业务链路都罗列出来了。
对于有第三方调用的链路你可以直接Mock。因为全链路压测中要屏蔽到第三方系统性能对自身系统的影响在这一点上不用纠结。我看有些企业为了让全链路真的全起来将第三方系统也纳入到了压测范围。从技术上说不是不可以但是从协调上来说就要考虑一下项目进度的风险和协调的难度了。
## 总结
好了,到这里,这节课的主要内容就讲完了。对于梳理核心业务链路来说,重点就是去看一个业务涉及到了哪些服务,这些服务又有哪些对应的技术组件。你可以遵照下面的思路:
* 先看架构图,看架构图是为了了解一个系统里有哪些具体的服务和组件。
* 再看调用链路,看调用链路是为了明确一个业务接口涉及到的具体服务和组件。
* 最后将所有流量大的业务接口统计出来,对应每一个业务接口梳理出调用链路。这样,我们就可以确定混合容量场景会涉及到的所有服务和组件了。
这些都是我们在后续的全链路压测过程中要重点关注的部分。
## 课后题
在结束今天的学习之前,我还给你留了两个小问题:
1. 你知道哪些确定业务接口的链路的方法?
2. 对不同的容量场景是否需要独立做业务统计?
欢迎你在留言区与我交流讨论,我们下节课再见!