注:本文已发布超过一年,请注意您所使用工具的相关版本是否适用
本系列为 Go 进阶训练营 笔记,访问 博客: Go进阶训练营, 即可查看当前更新进度,部分文章篇幅较长,使用 PC 大屏浏览体验更佳。
在前面的几篇文章当中我们聊到了 隔离设计、令牌桶算法、漏桶算法、自适应限流和熔断,可用性的建设远不止这些,这一部分的内容在进阶训练营中也讲了 7 个小时,其他部分如果感兴趣的话推荐购买源课程观看。
由于前面的文章大部分都在讲限流相关的内容,所以我们先看一下不同的限流方式的对比
| 类型 | 实现 | 优点 | 缺点 | 文章 |
|---|---|---|---|---|
| 单机限流 | 令牌桶 | 1. 稳定可靠,实现简单,性能高 2. 支持突发流量应对 | 1. 流量不均匀会导致误限制 2. 阈值设置较为困难,需要提前压测 | Go可用性(二) 令牌桶原理及使用 Go可用性(三) 令牌桶的实现 rate/limit |
| 漏桶 | 1. 稳定可靠,实现简单,性能高 | 1. 流量不均匀会导致误限制 2. 阈值设置较为困难,需要提前压测 3. 不支持突发流量 | Go可用性(四) 漏桶算法 | |
| 自适应限流: BBR | 1. 根据服务状态进行动态限流 2. 阈值设置简单,无需提前进行压测 3. 服务扩容无需手动调整阈值 | 1. 需要主动采集相关指标数据(cpu等) 2. 客户端善意限流 3. 应用场景较小 | Go可用性(五) 自适应限流 | |
| 全局限流 | - | 1. 应用场景丰富 2. 流量不均不会误触限流,有全局数据,可以合理进行分配 3. 服务扩容无需手动调整阈值 | 1. 实现较为复杂 2. 配置也较为复杂 | - |
接下来我们就一起来串联我们之前讲到的和课程上讲到的一些内容总结一下可用性应该怎么做。

如上图所示,我们从一个简单的用户访问出发,用户访问到我们的服务一般是先通过我们的移动客户端或者是浏览器,然后请求再依次通过 CDN、防火墙、API网关、BFF以及各个后端服务,整条链路还是比较长的。
我们上图其实已经一部分体现了隔离设计,所以后面我就不再提了。
客户端是触及用户的第一线,所以这一层做的可用性优化尤为的重要
BFF 是我们后端服务的桥头堡,当请求来到 BFF 层的时候,BFF 既是服务端,又是客户端,因为它一般需要请求很多其他的后端服务来完成数据的编排,提供客户端想要的数据
max_con 是 500ms,这时候就不能用 500ms 作为超时时间,得用 min(请求剩余的超时时间,max_con)也就是 400ms 作为我们的超时时间,同样我们请求下游的服务也需要将超时时间携带到 header 信息里面,这样下游服务就可以继承上游的超时时间来进行超时判断。BFF 其实也是服务端,但是为了流畅的讲解,主要将其作为了客户端的角色。服务端主要的是限流的措施,当流量从 BFF 来到我们的服务之后,我们会使用令牌桶算法尝试获取 token,如果 token 不够就丢弃,如果 token 足够就完成请求逻辑。
我们的 token 是从哪里来的呢?
拦截器会定时的向 Token Server 上报心跳数据,包含了一些统计信息,同时从 Token Server 获取一定数量的 Token,当 Token Server 接受到请求之后会通过最大最小公平分享的算法,根据每个服务实例上报的统计信息进行 Token 的分配。
这个其实就是之前没有讲到的分布式限流的思路,在单个服务实例上又使用了单机限流的算法
到这里我们的可用性相关的知识点就算是告一段落了,前面的文章主要讲解了限流的相关知识点,虽然其他的没有细说,但是这一篇总结也算是都涉及到了,包括隔离设计、限流(单机限流、自适应限流、分布式限流)、超时控制、降级、熔断、负载均衡、重试,如果想要了解细节内容,可以区报名毛大的课程。OK,话不多说,我们下篇文章见。
注:本文已发布超过一年,请注意您所使用工具的相关版本是否适用
本系列为 Go 进阶训练营 笔记,访问 博客: Go进阶训练营, 即可查看当前更新进度,部分文章篇幅较长,使用 PC 大屏浏览体验更佳。
在前面的几篇文章当中我们聊到了 隔离设计、令牌桶算法、漏桶算法、自适应限流和熔断,可用性的建设远不止这些,这一部分的内容在进阶训练营中也讲了 7 个小时,其他部分如果感兴趣的话推荐购买源课程观看。
由于前面的文章大部分都在讲限流相关的内容,所以我们先看一下不同的限流方式的对比
| 类型 | 实现 | 优点 | 缺点 | 文章 |
|---|---|---|---|---|
| 单机限流 | 令牌桶 | 1. 稳定可靠,实现简单,性能高 2. 支持突发流量应对 | 1. 流量不均匀会导致误限制 2. 阈值设置较为困难,需要提前压测 | Go可用性(二) 令牌桶原理及使用 Go可用性(三) 令牌桶的实现 rate/limit |
| 漏桶 | 1. 稳定可靠,实现简单,性能高 | 1. 流量不均匀会导致误限制 2. 阈值设置较为困难,需要提前压测 3. 不支持突发流量 | Go可用性(四) 漏桶算法 | |
| 自适应限流: BBR | 1. 根据服务状态进行动态限流 2. 阈值设置简单,无需提前进行压测 3. 服务扩容无需手动调整阈值 | 1. 需要主动采集相关指标数据(cpu等) 2. 客户端善意限流 3. 应用场景较小 | Go可用性(五) 自适应限流 | |
| 全局限流 | - | 1. 应用场景丰富 2. 流量不均不会误触限流,有全局数据,可以合理进行分配 3. 服务扩容无需手动调整阈值 | 1. 实现较为复杂 2. 配置也较为复杂 | - |
接下来我们就一起来串联我们之前讲到的和课程上讲到的一些内容总结一下可用性应该怎么做。

如上图所示,我们从一个简单的用户访问出发,用户访问到我们的服务一般是先通过我们的移动客户端或者是浏览器,然后请求再依次通过 CDN、防火墙、API网关、BFF以及各个后端服务,整条链路还是比较长的。
我们上图其实已经一部分体现了隔离设计,所以后面我就不再提了。
客户端是触及用户的第一线,所以这一层做的可用性优化尤为的重要
BFF 是我们后端服务的桥头堡,当请求来到 BFF 层的时候,BFF 既是服务端,又是客户端,因为它一般需要请求很多其他的后端服务来完成数据的编排,提供客户端想要的数据
max_con 是 500ms,这时候就不能用 500ms 作为超时时间,得用 min(请求剩余的超时时间,max_con)也就是 400ms 作为我们的超时时间,同样我们请求下游的服务也需要将超时时间携带到 header 信息里面,这样下游服务就可以继承上游的超时时间来进行超时判断。BFF 其实也是服务端,但是为了流畅的讲解,主要将其作为了客户端的角色。服务端主要的是限流的措施,当流量从 BFF 来到我们的服务之后,我们会使用令牌桶算法尝试获取 token,如果 token 不够就丢弃,如果 token 足够就完成请求逻辑。
我们的 token 是从哪里来的呢?
拦截器会定时的向 Token Server 上报心跳数据,包含了一些统计信息,同时从 Token Server 获取一定数量的 Token,当 Token Server 接受到请求之后会通过最大最小公平分享的算法,根据每个服务实例上报的统计信息进行 Token 的分配。
这个其实就是之前没有讲到的分布式限流的思路,在单个服务实例上又使用了单机限流的算法
到这里我们的可用性相关的知识点就算是告一段落了,前面的文章主要讲解了限流的相关知识点,虽然其他的没有细说,但是这一篇总结也算是都涉及到了,包括隔离设计、限流(单机限流、自适应限流、分布式限流)、超时控制、降级、熔断、负载均衡、重试,如果想要了解细节内容,可以区报名毛大的课程。OK,话不多说,我们下篇文章见。