diff --git a/docs/cs-basics/network/other-network-questions2.md b/docs/cs-basics/network/other-network-questions2.md index 057278d3..50137158 100644 --- a/docs/cs-basics/network/other-network-questions2.md +++ b/docs/cs-basics/network/other-network-questions2.md @@ -140,6 +140,24 @@ IP 地址过滤是一种简单的网络安全措施,实际应用中一般会 - **ICMPv6(Internet Control Message Protocol for IPv6)**:IPv6 中的 ICMPv6 相较于 IPv4 中的 ICMP 有了一些改进,如邻居发现、路径 MTU 发现等功能的改进,从而提升了网络的可靠性和性能。 - …… +### 如何获取客户端真实 IP? + +获取客户端真实 IP 的方法有多种,主要分为应用层方法、传输层方法和网络层方法。 + +**应用层方法** : + +通过 [X-Forwarded-For](https://en.wikipedia.org/wiki/X-Forwarded-For) 请求头获取,简单方便。不过,这种方法无法保证获取到的是真实 IP,这是因为 X-Forwarded-For 字段可能会被伪造。如果经过多个代理服务器,X-Forwarded-For 字段可能会有多个值(附带了整个请求链中的所有代理服务器 IP 地址)。并且,这种方法只适用于 HTTP 和 SMTP 协议。 + +**传输层方法**: + +利用 TCP Options 字段承载真实源 IP 信息。这种方法适用于任何基于 TCP 的协议,不受应用层的限制。不过,这并非是 TCP 标准所支持的,所以需要通信双方都进行改造。也就是:对于发送方来说,需要有能力把真实源 IP 插入到 TCP Options 里面。对于接收方来说,需要有能力把 TCP Options 里面的 IP 地址读取出来。 + +也可以通过 Proxy Protocol 协议来传递客户端 IP 和 Port 信息。这种方法可以利用 Nginx 或者其他支持该协议的反向代理服务器来获取真实 IP 或者在业务服务器解析真实 IP。 + +**网络层方法**: + +隧道 +DSR 模式。这种方法可以适用于任何协议,就是实施起来会比较麻烦,也存在一定限制,实际应用中一般不会使用这种方法。 + ### NAT 的作用是什么? **NAT(Network Address Translation,网络地址转换)** 主要用于在不同网络之间转换 IP 地址。它允许将私有 IP 地址(如在局域网中使用的 IP 地址)映射为公有 IP 地址(在互联网中使用的 IP 地址)或者反向映射,从而实现局域网内的多个设备通过单一公有 IP 地址访问互联网。 @@ -185,6 +203,7 @@ ARP 协议,全称 **地址解析协议(Address Resolution Protocol)**, - 《图解 HTTP》 - 《计算机网络自顶向下方法》(第七版) - 什么是 Internet 协议(IP)?: +- 透传真实源 IP 的各种方法 - 极客时间: - What Is NAT and What Are the Benefits of NAT Firewalls?: diff --git a/docs/high-availability/limit-request.md b/docs/high-availability/limit-request.md index d809b64e..1f7fd5fc 100644 --- a/docs/high-availability/limit-request.md +++ b/docs/high-availability/limit-request.md @@ -67,6 +67,20 @@ category: 高可用 令牌桶算法可以限制平均速率和应对突然激增的流量,还可以动态调整生成令牌的速率。不过,如果令牌产生速率和桶的容量设置不合理,可能会出现问题比如大量的请求被丢弃、系统过载。 +## 针对什么来进行限流? + +实际项目中,还需要确定限流对象,也就是针对什么来进行限流。常见的限流对象如下: + +- IP :针对 IP 进行限流,适用面较广,简单粗暴。 +- 业务 ID:挑选唯一的业务 ID 以实现更针对性地限流。例如,基于用户 ID 进行限流。 +- 个性化:根据用户的属性或行为,进行不同的限流策略。例如, VIP 用户不限流,而普通用户限流。根据系统的运行指标(如 QPS、并发调用数、系统负载等),动态调整限流策略。例如,当系统负载较高的时候,控制每秒通过的请求减少。 + +针对 IP 进行限流是目前比较常用的一个方案。不过,实际应用中需要注意用户真实 IP 地址的正确获取。常用的真实 IP 获取方法有 X-Forwarded-For 和 TCP Options 字段承载真实源 IP 信息。虽然 X-Forwarded-For 字段可能会被伪造,但因为其实现简单方便,很多项目还是直接用的这种方法。 + +除了我上面介绍到的限流对象之外,还有一些其他较为复杂的限流对象策略,比如阿里的 Sentinel 还支持 [基于调用关系的限流](https://github.com/alibaba/Sentinel/wiki/流量控制#基于调用关系的流量控制)(包括基于调用方限流、基于调用链入口限流、关联流量限流等)以及更细维度的 [热点参数限流](https://github.com/alibaba/Sentinel/wiki/热点参数限流)(实时的统计热点参数并针对热点参数的资源调用进行流量控制)。 + +另外,一个项目可以根据具体的业务需求选择多种不同的限流对象搭配使用。 + ## 单机限流怎么做? 单机限流针对的是单体架构应用。 @@ -241,7 +255,11 @@ rateLimiter.acquire(1); boolean res = rateLimiter.tryAcquire(1, 5, TimeUnit.SECONDS); ``` -## 相关阅读 +## 总结 + +这篇文章主要介绍了常见的限流算法、限流对象的选择以及单机限流和分布式限流分别应该怎么做。 + +## 参考 - 服务治理之轻量级熔断框架 Resilience4j: - 超详细的 Guava RateLimiter 限流原理解析: