提升微服务高可用性的秘诀:API 服务治理之限流、熔断、降级

更新时间 3/29/2024

前言

现如今微服务架构已经成为 IT 架构的主流选择,它的灵活和可扩展等特性使企业更加容易应对快速变化的业务需求。然而,确保微服务的高可用性成为架构设计中亟待解决的关键问题。在此背景下,API 服务治理中的三大核心策略——限流、熔断和降级,显得尤为重要。

API 网关作为微服务架构中的重要基础组件,在服务治理方面扮演着至关重要的角色,Apache APISIX 作为新一代的云原生 API 网关不仅具备极高的性能和安全能力,也为我们提供了丰富的流量管理功能。接下来,我们将深入探讨 API 服务治理的“三板斧”,并详细解析如何在 APISIX 中运用这些策略,以确保我们服务的高可用性。

提升微服务高可用性的“三板斧”

限流

限流,顾名思义,即为对流量实施的一种限制性机制,其核心宗旨在于防范流量过大所引发的系统过载乃至崩溃现象。其设计核心理念在于对特定时间段内的请求量进行调控,仅允许满足特定约束条件的请求访问系统,以保障微服务和整个系统的稳定运行。在现实生活中,限流的概念亦有所体现,例如高峰时段乘坐地铁时,安检口通过设置多个门禁,以引导人流有序、平稳地排队通行。

限流可以通过多种方式来实现,比如常见的:

  • 基于请求计数:统计每个时间段内的请求数量,并限制在一定阈值范围内。例如,每秒最多处理 100 个请求。

  • 基于请求频率:限制每个客户端或每个 IP 地址的请求频率,防止异常过多的请求。可以设置每分钟内最多允许发起 10 次请求。

  • 基于连接数:限制同时建立的连接数量,避免因连接过多而消耗系统资源。例如,最多允许同时建立 100 个连接。

不同的限流策略可以让我们应对不同的场景需求,比如我们有一些珍贵的 API 资源,我们可以限制每一分钟内,只能请求 10 次。或者当我们为了提升服务的高可用性,我们可以限制并发请求数量,减少服务的的响应时间等等场景。运用好这些限流策略可以帮助我们在高并发和突发流量的场景下,确保服务的正常运行。

熔断

在微服务架构中,各个服务之间可能存在互相调用的情况。一旦其中某个服务出现故障,整个链路都会受到影响,随着时间的增长,导致越来越多的服务不可用,甚至造成整个系统的瘫痪,这种现象被形象地称为“雪崩效应”。熔断机制作为应对微服务雪崩效应的一种保护机制,用于防止故障的扩散。当某个微服务发生异常或延迟时,熔断机制会自动触发,暂时阻断对该服务的请求,从而确保整个系统的稳定性不受影响。

熔断机制的核心原理是根据监测服务的响应时间或错误率来自动的触发熔断机制。一旦这些指标超过预设的阈值,熔断机制将自动启动,迅速终止对故障服务的请求,直至该服务恢复正常。待服务恢复稳定后,熔断器将自动关闭,重新恢复对该服务的访问。这一机制类似于电路中的电阻器,当电压超出其承受范围时,电阻器会自动断开电路,以防止过大的电流对其他电子元件造成损害。在检查和修复电路后,电阻器将重新闭合,电路恢复正常工作。

通过引入熔断机制,微服务架构在高压场景下能够更好地应对服务间相互调用可能引发的雪崩效应问题,确保系统的稳定性和可靠性。

降级

降级作为一种应对系统高负载的有效策略,其核心在于通过暂时屏蔽部分非核心或可暂时舍弃的功能,或者适当降低部分服务质量,从而确保核心功能的持续、稳定运作。以视频会议为例,当网络带宽受限时,我们可以通过降低视频传输质量或暂时关闭视频功能,以确保音频通话的清晰与稳定,从而保障会议的基本沟通需求。

常见的策略有:

  • 功能降级:通过暂时关闭或限制某些功能的访问,以保证系统的核心服务正常运行。例如,一个社交媒体应用可以在高峰期间暂时关闭点赞或评论功能,以保证用户可以正常浏览内容。

  • 质量降级:在系统高负载时,降低某些服务或功能的质量要求。例如,我们上面提到的降低视频的清晰度或帧率,以保证视频的流畅播放。

API 治理“三板斧”在 APISIX 中的应用

如何使用 APISIX 中启用上述三大策略,以提升微服务的高可用性?以下仅列举几个常见的应用实例,以作简要说明:

限流插件:limit-count

APISIX 内置了多种流量管理的插件,如 limit-countlimit-reqlimit-conn 等,我们可以根据实际需求选择合适的方式进行流量控制,以 limit-count 插件为例子,它会限制特定时间间隔内的总请求数,并在 HTTP 标头中传回剩余请求数。

1curl -i http://127.0.0.1:9080/apisix/admin/routes/1 \
2-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
3{
4    "uri": "/get",
5    "plugins": {
6        "limit-count": {
7            "count": 3,
8            "time_window": 60,
9            "rejected_code": 429,
10            "key_type": "var",
11            "key": "remote_addr"
12        }
13    },
14    "upstream": {
15        "type": "roundrobin",
16        "nodes": {
17            "httpbin.org:80": 1
18        }
19    }
20}'

熔断插件:api-breaker

APISIX 的 api-breaker 插件可以你根据设定的阈值,自动触发熔断机制防止雪崩效应的发生。当上游服务连续返回 3 次 500 或者 503 状态码时,触发熔断机制,当上游返回 1 次 200 状态码时恢复访问。

1curl "http://127.0.0.1:9180/apisix/admin/routes/1" \
2-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
3{
4    "plugins": {
5        "api-breaker": {
6            "break_response_code": 502,
7            "unhealthy": {
8                "http_statuses": [500, 503],
9                "failures": 3
10            },
11            "healthy": {
12                "http_statuses": [200],
13                "successes": 1
14            }
15        }
16    },
17    "upstream": {
18        "type": "roundrobin",
19        "nodes": {
20            "httpbin.org:80": 1
21        }
22    },
23    "uri": "/get",
24}'

降级插件:fault-injection

APISIX 提供的 fault-injectionmocking 插件支持设置降级策略,可以在系统负载过高时,暂时关闭部分功能或直接返回预设的数据,以保证系统的稳定性。以 fault-injection 插件为例,它将直接返回指定的 HTTP 状态码和 Body 值给客户端。

1curl http://127.0.0.1:9180/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
2{
3    "plugins": {
4       "fault-injection": {
5           "abort": {
6              "http_status": 200,
7              "body": "Fault Injection!"
8           }
9       }
10    },
11    "upstream": {
12       "nodes": {
13           "httpbin.org:80": 1
14       },
15       "type": "roundrobin"
16    },
17    "uri": "/get"
18}'

结论

限流、熔断和降级,作为微服务架构中至关重要的服务治理手段,在提升微服务的高可用性方面扮演着无可替代的角色。它们如同坚实的盾牌,为微服务架构抵御各种潜在风险和挑战。面对纷繁复杂的业务场景,我们应灵活且审慎地运用这些手段,以确保微服务架构的稳定性和可靠性得到最佳保障。

微信咨询

获取方案