分布式常见概念

发布于:2025-05-28 ⋅ 阅读:(20) ⋅ 点赞:(0)

反向代理

“反向代理”(Reverse Proxy)之所以叫“反向”,是相对于“正向代理”(Forward Proxy)而言的。我们先理解“正向代理”,然后对比就能明白“反向代理”名字的来源。


正向代理 vs 反向代理(对比理解名称)

代理类型 客户端视角 服务端视角 功能方向(代理谁) 示例用途
正向代理 代理客户端 服务端不知道真实客户端 代理客户端向服务器发请求 科学上网、访问被屏蔽网站
反向代理 客户端不知道真实服务器 代理服务器接收请求 代理服务器代理真实服务器 负载均衡、隐藏源站、加速网站

正向代理示意(“我去帮你拿数据”)

  • 用户(客户端)配置一个代理服务器。
  • 用户的请求先发给代理服务器,由代理代替用户向目标网站发起请求。
  • 代理收到响应后,再返回给用户。

📌 特点:客户端知道自己用的是代理,服务器不知道谁是原始请求者。


反向代理示意(“你找我,我替你联系内部服务器”)

  • 用户访问网站,请求发给一个代理服务器。
  • 代理服务器决定将请求转发给哪个后端服务器(真实源站)。
  • 用户不直接接触后端服务器,只与代理打交道。

📌 特点:客户端不知道后端服务器的存在,感觉就像访问的是反向代理本身。


为什么叫“反向”?

  • 在正向代理中,客户端知道代理存在并主动使用它,代理代表“客户端”去访问外部世界。
  • 在反向代理中,客户端无感知,代理是服务器部署的“防线”,代表“服务器”处理外部请求。

所以,“反向代理”这个名字强调的是方向变了:

正向代理是 客户端→代理→服务器
反向代理是 客户端→代理(看似服务器)→真实服务器


如果你还想知道反向代理和负载均衡、防火墙等功能模块的细节关系,我可以进一步展开。是否需要?

API网关

API 网关(API Gateway)是一个位于客户端与一组后端服务之间的服务器,作为所有客户端请求的唯一入口点。它的主要作用是接收客户端的 API 请求,路由到合适的后端服务,聚合结果,并返回给客户端。


一、为什么需要 API 网关?

在现代微服务架构中,一个系统通常由多个小的服务组成。如果客户端直接访问每个服务,会带来以下问题:

  • 客户端需要维护多个服务的地址和通信逻辑;
  • 每个服务可能有不同的认证、限流、安全要求;
  • 请求可能需要访问多个服务来聚合数据,客户端需要承担复杂逻辑;
  • 服务迁移或重构时客户端容易受到影响。

API 网关解决了这些问题。


二、API 网关的核心功能

功能 描述
路由请求 根据 URL 或请求内容,把请求转发给相应的后端服务
请求聚合 聚合多个服务的响应,形成一个统一的返回结果
身份验证与授权 在统一入口进行用户身份认证(如 OAuth、JWT)、权限检查等
日志与监控 记录访问日志、请求耗时、错误信息,便于监控和调试
限流与熔断 控制请求频率,防止系统过载,提升系统稳定性
协议转换 如 HTTP 转 gRPC,或 SOAP 转 REST
缓存 对一些频繁访问的数据进行缓存,提升响应速度
CORS处理 统一处理跨域资源共享(Cross-Origin Resource Sharing)问题

三、工作流程示意图(简化):

客户端
   |
   v
[ API 网关 ]
   |    \
   |     ---> 微服务 A
   |     ---> 微服务 B
   |     ---> 微服务 C
   v
  返回聚合结果

四、常见的 API 网关实现

名称 特点
Nginx 可作为轻量级 API 网关,需手动编写配置
Kong 基于 Nginx,功能强大,支持插件机制
Apigee Google 提供的企业级网关,集成分析、认证等
AWS API Gateway 云原生服务,与 AWS 服务集成紧密
Spring Cloud Gateway Java生态,适用于 Spring 微服务架构
Zuul Netflix 开源的旧网关,已逐步被替代

五、举例说明

假设你有三个微服务:

  • 用户服务 /user/info
  • 商品服务 /product/list
  • 订单服务 /order/create

如果没有网关,客户端需要分别请求这三个服务。使用 API 网关后,只需请求统一入口,如:

GET /api/user/info   --> 转发到用户服务
GET /api/product/list --> 转发到商品服务
POST /api/order/create --> 转发到订单服务

当然可以,以下是完整内容的重新编排版,结构更加清晰,从概念、作用,到各类型负载均衡的原理、对比、工具和应用建议,一步步递进:


负载均衡(Load Balancing)

负载均衡是指将来自客户端的请求合理分发到多个后端服务器(或节点)上,以提升系统的可用性、吞吐能力和响应速度,避免单点故障或过载。


一、负载均衡的作用

  1. 提升系统吞吐量:多个服务器并发处理请求,提升整体性能
  2. 提高系统可用性:某台服务器宕机,其它服务器接管请求,保障连续性
  3. 增强可扩展性:可随需扩容或缩容服务器节点
  4. 加快响应速度:流量分配至负载较轻或地理更近的服务器,提升体验

二、负载均衡的分类

按照实现方式和网络层级,常见的负载均衡可分为三类:

分类 层级 实现位置
DNS 负载均衡 L3/L4 DNS 服务器
硬件负载均衡 L4/L7 网络硬件设备(如 F5)
软件负载均衡 L4/L7 普通服务器或容器中运行的软件

三、DNS 负载均衡(基于域名系统)

DNS 服务器为一个域名配置多个 IP 地址(A 记录),客户端每次解析域名时会得到不同 IP,实现“伪轮询”。

example.com → [192.168.1.1, 192.168.1.2, 192.168.1.3]

✅ 优点:

  • 成本低、实现简单
  • 全球 CDN 常用,可结合 GeoDNS 实现地域调度

❌ 缺点:

  • 缓存延迟高(TTL 问题)
  • 无法判断服务器健康状态
  • 不支持权重、会话保持等策略

四、硬件负载均衡(如 F5、Citrix、H3C)

使用专用硬件设备,将外部流量按特定策略转发到后端服务器,通常支持:

  • L4:基于 IP+端口 的 TCP/UDP 分发
  • L7:基于 HTTP 的 URI、Host、Header、Cookie 等转发

✅ 优点:

  • 高性能、高吞吐、超低延迟
  • 支持高级安全功能、DDoS 防护、SSL 卸载等
  • 适合大型企业、金融系统等核心业务

❌ 缺点:

  • 成本昂贵,维护复杂
  • 扩展性差,不易集成到云原生架构中

五、软件负载均衡(运行在普通服务器或容器中)

通过通用软件(如 Nginx、HAProxy、Envoy、Traefik)处理和转发流量,可作为独立组件运行或嵌入微服务体系。

🔥 常见软件对比:

软件 特点
Nginx 高性能反向代理,支持 TCP/UDP,配置简单,静态场景优先
HAProxy 专业级负载均衡器,稳定性强,支持丰富策略和健康检查
Envoy 云原生友好,支持 gRPC、服务发现、熔断、链路追踪等
Traefik 动态配置,适用于 K8s 和 Docker 等容器编排环境

✅ 优点:

  • 支持动态服务发现,配置灵活
  • 适配微服务与云环境,自动路由、自动注册
  • 支持复杂的 L4/L7 策略(如权重、Header 路由等)

❌ 缺点:

  • 高并发下需调优
  • 依赖宿主资源,性能略逊硬件方案

六、对比总结表

类型 网络层级 成本 灵活性 健康检查 缓存延迟 适用场景
DNS 负载均衡 L3/L4 ❌ 无 简单服务分发、CDN 地域分流
硬件负载均衡 L4/L7 ✅ 支持 金融、政企、大型数据中心入口流量管控
软件负载均衡 L4/L7 低 ~ 中 ✅ 支持 微服务架构、云原生环境、Kubernetes 集群

七、常见负载均衡工具和平台

工具/平台 类型 说明
Nginx 软件 轻量级,支持静态资源代理、反向代理等
HAProxy 软件 高可靠、性能优异,适用于金融、电商、高并发系统
Envoy 软件 服务网格核心组件,支持动态发现、gRPC、指标采集等
Traefik 软件 云原生场景中首选,自动配置、支持热更新
F5 BIG-IP 硬件 企业级设备,支持 SSL 卸载、会话保持等高级特性
LVS(Linux Virtual Server) 内核模块 高性能,内核态转发,适合高吞吐部署
Kubernetes Ingress 云原生组件 集群服务访问入口,支持基于域名/路径的转发规则

八、实际部署组合建议

现代架构常采用多种负载均衡方式的组合部署,以兼顾性能、灵活性和高可用:

  • DNS + 软件负载均衡:DNS 将请求解析至多个 Nginx/HAProxy 节点,再由其进行转发
  • 硬件负载均衡 + 云原生集群:使用 F5 作为集群入口,内部通过 Ingress 控制器管理流量
  • 服务网格(如 Istio + Envoy):实现微服务间的透明通信与负载均衡,配合流控、链路追踪等能力

九、典型应用场景

  • 网站访问分发:均匀调度用户请求至多台 Web 服务器,缓解热点
  • 微服务调用控制:服务间调用通过 Envoy、Traefik 等实现自动路由与容错
  • 高可用集群容灾:自动剔除宕机节点,保障业务连续性和用户体验


网站公告

今日签到

点亮在社区的每一天
去签到