反向代理与负载均衡的原理与实现
字数 550 2025-11-05 23:47:38
反向代理与负载均衡的原理与实现
题目描述
反向代理和负载均衡是现代后端架构中的核心组件。反向代理作为服务器的网关,接收客户端请求并转发到后端服务;负载均衡则负责将流量合理分配到多个服务器实例。理解其工作原理对设计高可用系统至关重要。
核心原理
- 反向代理:位于客户端和后端服务器之间,隐藏真实服务器信息,提供统一入口
- 负载均衡:通过特定算法将请求分发到多个服务器,提高系统吞吐量和可靠性
实现细节
第一步:反向代理基础实现
# 简易反向代理示例
import http.server
import socketserver
import requests
class ReverseProxyHandler(http.server.BaseHTTPRequestHandler):
backend_servers = ['http://localhost:8001', 'http://localhost:8002']
def do_GET(self):
# 选择后端服务器(简单轮询)
backend = self.backend_servers.pop(0)
self.backend_servers.append(backend)
# 转发请求
resp = requests.get(f"{backend}{self.path}")
# 返回响应给客户端
self.send_response(resp.status_code)
for key, value in resp.headers.items():
self.send_header(key, value)
self.end_headers()
self.wfile.write(resp.content)
第二步:负载均衡算法演进
- 轮询(Round Robin):
class RoundRobinBalancer:
def __init__(self, servers):
self.servers = servers
self.index = 0
def get_server(self):
server = self.servers[self.index]
self.index = (self.index + 1) % len(self.servers)
return server
- 加权轮询(Weighted Round Robin):
class WeightedRoundRobinBalancer:
def __init__(self, server_weights):
self.servers = []
for server, weight in server_weights.items():
self.servers.extend([server] * weight)
self.index = 0
def get_server(self):
server = self.servers[self.index]
self.index = (self.index + 1) % len(self.servers)
return server
- 最少连接(Least Connections):
class LeastConnectionsBalancer:
def __init__(self, servers):
self.server_connections = {server: 0 for server in servers}
def get_server(self):
return min(self.server_connections.items(), key=lambda x: x[1])[0]
def release_connection(self, server):
if server in self.server_connections:
self.server_connections[server] -= 1
第三步:健康检查机制
import threading
import time
class HealthChecker:
def __init__(self, servers, check_interval=30):
self.servers = servers
self.healthy_servers = set(servers)
self.check_interval = check_interval
def check_server(self, server):
try:
resp = requests.get(f"{server}/health", timeout=5)
return resp.status_code == 200
except:
return False
def start_checking(self):
def check_loop():
while True:
for server in self.servers:
is_healthy = self.check_server(server)
if is_healthy and server not in self.healthy_servers:
self.healthy_servers.add(server)
elif not is_healthy and server in self.healthy_servers:
self.healthy_servers.remove(server)
time.sleep(self.check_interval)
thread = threading.Thread(target=check_loop)
thread.daemon = True
thread.start()
第四步:会话保持(Session Affinity)
class SessionAwareBalancer:
def __init__(self, servers):
self.servers = servers
self.session_map = {} # session_id -> server
def get_server(self, session_id=None):
if session_id and session_id in self.session_map:
return self.session_map[session_id]
server = self.servers[len(self.session_map) % len(self.servers)]
if session_id:
self.session_map[session_id] = server
return server
第五步:完整实现示例
class AdvancedLoadBalancer:
def __init__(self, servers):
self.servers = servers
self.balancer = LeastConnectionsBalancer(servers)
self.health_checker = HealthChecker(servers)
self.session_balancer = SessionAwareBalancer(servers)
self.health_checker.start_checking()
def handle_request(self, request):
# 检查会话粘性
session_id = request.cookies.get('session_id')
if session_id:
server = self.session_balancer.get_server(session_id)
else:
server = self.balancer.get_server()
# 转发请求
self.balancer.server_connections[server] += 1
try:
return self.forward_request(server, request)
finally:
self.balancer.release_connection(server)
关键技术点
- 连接池管理:复用后端连接减少开销
- 超时控制:设置连接和读取超时避免阻塞
- 故障转移:自动检测失败请求并重试其他服务器
- 动态配置:支持运行时添加/移除后端服务器
实际应用场景
- Nginx:基于事件驱动的反向代理实现
- HAProxy:专业的TCP/HTTP负载均衡器
- 云服务:AWS ALB、GCP Load Balancer等托管服务
这种架构通过分散请求压力和提高容错能力,显著提升系统可用性和性能。