AltasProxy:整体架构设计

本章来讲讲AltasProxy整体架构设计以及为什么这么设计,初衷和理由是什么?

1.整体架构:
8fb8104fdd5d12f2b876902d87d65f5e
首先代理会收到来自客户端发送的http请求,epoll作为性能强大的I/O复用,和select相比较的优点是select会有一个上限,可能是1024,达到这个监听上限之后就要重新重置了,所以会影响效率。epoll充分解决了这一痛点。

本项目采用的Reactor架构是高性能网络编程领域的核心事件驱动模型,其本质是通过“事件驱动 + I/O多路复用”机制,摒弃了传统“一连接一线程”的阻塞式I/O模型弊端,核心解决高并发场景下线程资源耗尽与I/O等待导致的性能浪费问题,而项目中具体落地的MainReactor+SubReactor主从架构则是基础Reactor模型的进阶优化版本,专门适配高并发连接建立与高吞吐数据处理的业务需求;该架构的核心由Reactor(反应器)、Handler(处理器)、Acceptor(接受器)三大组件构成,其中Reactor作为整个架构的“大脑”,通过Linux下的epoll(或FreeBSD的kqueue、通用的select/poll)等I/O多路复用接口,实现单线程(或少量线程)监听成千上万个连接的I/O状态(如可读、可写、连接建立),并将触发的事件分发给对应的Handler处理,Handler则是事件处理的具体实现者,绑定到特定I/O事件(如socket可读),以非阻塞方式完成数据读取、协议解析、业务逻辑处理、响应返回等核心操作,避免单个连接的I/O耗时阻塞整个事件循环,Acceptor作为特殊的Handler,仅负责处理TCP的accept事件(新连接建立),完成连接建立后会将新连接注册到Reactor的事件监听列表中;在MainReactor+SubReactor的主从架构分工中,MainReactor作为整个系统的“连接入口”,通常单线程运行(无需多线程,因连接建立频率远低于数据读写),唯一职责是监听并快速接受客户端新连接,不参与任何数据读写和业务处理,从根源避免连接建立过程阻塞后续请求,而SubReactor则采用多线程部署,每个SubReactor绑定独立线程,MainReactor接受新连接后会将其分配给某个SubReactor接管,由SubReactor负责该连接后续所有的读写事件分发与处理,多SubReactor的设计实现了I/O并行处理,能充分利用多核CPU资源,大幅提升系统并发处理能力;从完整的请求处理链路来看,客户端发起HTTP请求后,连接首先到达服务端,MainReactor捕获accept事件并建立新连接,随即把新连接分配给某一个SubReactor线程,SubReactor会持续监听该连接的可读事件,当事件触发后,先由TcpServer/Connection模块读取数据,再通过HttpParser解析HTTP报文并封装为HttpRequest对象,接着由ProxyServer作为代理核心,协调LoadBalancer选择后端服务器、BackendManager管理后端连接池、TcpClient与选中的后端建立连接并转发请求,待后端响应返回后,经HttpResponse封装,再由SubReactor将响应写回客户端,甚至连后端连接管理、HealthChecker健康检查的探活请求等非核心路径的I/O事件,也统一由SubReactor管理,保证整个系统事件驱动逻辑的一致性。

2.Reactor和Proactor架构的差异和使用场景。
Reactor架构:
image
其实就是上面说的三大组件:Reactor,Acceptor和Handler,实现了接收,连接和处理独立进行。让架构更清晰明了。
他的模式是灵活多变的,Reactor的数量可以只有一个,也可以有很多个。处理资源池也可以是单个或者多个进程/线程。排列组合一些其实一共就有四种方案:
单 Reactor 单进程 / 线程;
单 Reactor 多进程 / 线程;
多 Reactor 单进程 / 线程;
多 Reactor 多进程 / 线程;

Proactor架构:
image
上面的Reactor架构是非阻塞同步网络模式,Proactor是异步网络模式。

对比一下:
Reactor 是非阻塞同步网络模式,感知的是就绪可读写事件。在每次感知到有事件发生(比如可读就绪事件)后,就需要应用进程主动调用 read 方法来完成数据的读取,也就是要应用进程主动将 socket 接收缓存中的数据读到应用进程内存中,这个过程是同步的,读取完数据后应用进程才能处理数据。
Proactor 是异步网络模式, 感知的是已完成的读写事件。在发起异步读写请求时,需要传入数据缓冲区的地址(用来存放结果数据)等信息,这样系统内核才可以自动帮我们把数据的读写工作完成,这里的读写工作全程由操作系统来做,并不需要像 Reactor 那样还需要应用进程主动发起 read/write 来读写数据,操作系统完成读写工作后,就会通知应用进程直接处理数据。

再直白点就是Reactor可以理解成来了事件操作系统通知应用进程,让应用进程来处理。Proactor可以理解为来了事件操作系统来处理,处理完再通知应用进程。

3.项目目录:
AtlasProxy-main/
|
+-- AtlasProxy/ # 主项目目录
| |
| +-- build_and_test.sh # 构建与测试脚本
| +-- CMakeLists.txt # CMake 配置
| +-- README # 项目说明
| +-- REQUIREMENTS.md # 需求文档
| |
| +-- build/ # CMake 构建输出目录 (可忽略)
| |
| +-- config/
| | +-- config.json # 配置文件
| |
| +-- docs/
| | +-- 需求分析.md # 需求分析文档
| |
| +-- include/ # 头文件
| | +-- common/
| | | +-- Buffer.h
| | | +-- Error.h
| | | +-- Types.h
| | +-- http/
| | | +-- HttpHeader.h
| | | +-- HttpParser.h
| | | +-- HttpRequest.h
| | | +-- HttpResponse.h
| | +-- network/
| | | +-- Connection.h
| | | +-- Epoll.h
| | | +-- MainReactor.h
| | | +-- Reactor.h
| | | +-- SubReactor.h
| | | +-- TcpClient.h
| | | +-- TcpServer.h
| | +-- proxy/
| | | +-- BackendManager.h
| | | +-- HealthChecker.h
| | | +-- LoadBalancer.h
| | | +-- ProxyServer.h
| | | +-- RateLimiter.h
| | +-- utils/
| | +-- Config.h
| | +-- Logger.h
| | +-- MemoryPool.h
| | +-- SignalHandler.h
| | +-- Timer.h
| |
| +-- src/ # 源文件
| | +-- main.cpp
| | +-- common/
| | | +-- Buffer.cpp
| | | +-- Error.cpp
| | | +-- Types.cpp
| | +-- http/
| | | +-- HttpHeader.cpp
| | | +-- HttpParser.cpp
| | | +-- HttpRequest.cpp
| | | +-- HttpResponse.cpp
| | +-- network/
| | | +-- Connection.cpp
| | | +-- Epoll.cpp
| | | +-- MainReactor.cpp
| | | +-- Reactor.cpp
| | | +-- SubReactor.cpp
| | | +-- TcpClient.cpp
| | | +-- TcpServer.cpp
| | +-- proxy/
| | | +-- BackendManager.cpp
| | | +-- HealthChecker.cpp
| | | +-- LoadBalancer.cpp
| | | +-- ProxyServer.cpp
| | | +-- RateLimiter.cpp
| | +-- utils/
| | +-- Config.cpp
| | +-- Logger.cpp
| | +-- MemoryPool.cpp
| | +-- SignalHandler.cpp
| | +-- Timer.cpp
| |
| +-- test/ # 单元测试
| +-- health_checker_test.cpp
| +-- http_parser_test.cpp
| +-- load_balancer_test.cpp
| +-- memory_pool_test.cpp
| +-- network_test.cpp
| +-- proxy_server_test.cpp
| +-- rate_limiter_test.cpp
|
+-- AtlasProxy.xcodeproj/ # Xcode 工程
| +-- project.pbxproj
| +-- project.xcworkspace/
| +-- xcuserdata/
|
+-- config/
| +-- config.json

posted on 2026-03-02 14:12  cyusouyiku  阅读(2)  评论(0)    收藏  举报