网络相关知识整理
负载均衡
负载均衡(Load Balancing)是一种分布式系统技术,核心作用是将网络流量、计算任务或数据请求均匀分配到多个服务器(或资源节点),避免单个节点因负载过高而性能下降或崩溃,从而提升系统的整体吞吐量、可用性和稳定性。
一、为什么需要负载均衡?
在高并发场景下(如电商促销、热门 APP 访问高峰),单台服务器的处理能力(CPU、内存、带宽等)有限:
- 若请求集中到一台服务器,会导致响应变慢、超时甚至宕机(“单点故障”)。
- 多台服务器协同工作时,若流量分配不均(部分服务器过载,部分空闲),会造成资源浪费。
负载均衡本质是 “合理分配压力”,让所有服务器 “各司其职”,既不闲置也不过载。
二、软件负载均衡
- 原理:通过软件程序(运行在通用服务器上)实现负载均衡逻辑。
- 常见工具:
- Nginx:轻量高效,支持 HTTP/HTTPS(七层)和 TCP/UDP(四层)负载均衡,适合中小型应用。
- HAProxy:高性能,专注于四层和七层负载均衡,支持复杂的负载策略,常用于高并发场景。
- LVS(Linux Virtual Server):基于 Linux 内核的四层负载均衡,性能接近硬件,适合底层流量分发。
- 特点:成本低(开源免费)、灵活易配置,是中小团队的主流选择。
Nginx
Nginx(发音为 “engine x”)是一款高性能的 HTTP 服务器、反向代理服务器,同时也支持 TCP/UDP 代理、负载均衡、缓存等功能。它以轻量级、高并发处理能力、稳定性强著称,是现代 Web 架构中最常用的服务器之一(全球超过 30% 的网站使用 Nginx,包括淘宝、京东、Netflix 等)。
二、Nginx 的核心功能
1. HTTP 服务器(Web 服务器)
Nginx 可直接作为 Web 服务器,托管静态资源(HTML、CSS、JS、图片、视频等),支持:
- 虚拟主机(一台服务器部署多个网站,通过
server_name
区分)。 - URL 重写(通过
rewrite
指令实现 URL 跳转、伪静态)。 - 压缩传输(
gzip
模块压缩资源,减少网络传输量)。 - 访问控制(限制 IP、密码保护等)。
2. 反向代理
反向代理是 Nginx 最常用的功能之一:
- 正向代理:客户端→代理服务器→目标服务器(如 VPN,代理客户端访问外部资源)。
- 反向代理:客户端→代理服务器(Nginx)→后端服务器(如 Tomcat、Node.js)。
作用:隐藏后端服务器 IP,增强安全性;统一入口,方便管理;配合负载均衡分发流量。
3. 负载均衡
Nginx 可作为负载均衡器,将客户端请求均匀分配到多台后端服务器,避免单节点过载:
- 支持多种负载均衡算法(轮询、加权轮询、IP 哈希、最少连接数等)。
- 支持健康检查(自动剔除故障服务器,恢复后自动加入)。
4. 动静分离
将静态资源(CSS、JS、图片)和动态资源(如 PHP、Java 接口)的请求分开处理:
- 静态资源直接由 Nginx 处理(效率高)。
- 动态资源通过反向代理转发给后端应用服务器(如 Tomcat、PHP-FPM)。
优势:减轻后端服务器压力,提高整体响应速度。
5. SSL/TLS 终结
Nginx 可处理 HTTPS 加密和解密工作(SSL 握手、证书验证),后端服务器只需处理明文数据:
- 减少后端服务器的加密计算开销。
- 统一管理 SSL 证书,简化配置。
四、典型应用场景
- 静态资源服务器:直接托管网站的 HTML、CSS、JS、图片等,配合
gzip
和缓存配置优化加载速度。 - 反向代理 + 负载均衡:作为前端流量入口,将请求分发到后端多台应用服务器(如 Java、Python 服务),支撑高并发。
- 微服务网关:在微服务架构中,作为 API 网关,处理路由、认证、限流、监控等通用逻辑。
- CDN 节点:作为 CDN(内容分发网络)的边缘节点,缓存静态资源,加速用户访问。
- 反向代理 WebSocket:支持 WebSocket 协议代理,用于实时通讯应用(如聊天、弹幕)。
五、Nginx 基本配置示例
Nginx 的配置文件(通常是nginx.conf
)是文本文件,结构清晰,以下是几个典型配置场景:
1. 作为静态 Web 服务器
nginx
# 一个server块代表一个虚拟主机
server {listen 80; # 监听端口server_name www.example.com; # 绑定域名root /var/www/example; # 静态资源存放目录index index.html index.htm; # 默认首页# 访问日志配置access_log /var/log/nginx/example_access.log;error_log /var/log/nginx/example_error.log;
}
2. 反向代理(转发动态请求到后端服务器)
nginx
server {listen 80;server_name api.example.com;# 将所有请求转发到后端Node.js服务器location / {proxy_pass http://127.0.0.1:3000; # 后端服务器地址proxy_set_header Host $host; # 传递原始主机名proxy_set_header X-Real-IP $remote_addr; # 传递客户端真实IP}
}
3. 负载均衡(分发流量到多台后端服务器)
nginx
# 定义后端服务器集群(upstream块)
upstream backend_servers {server 192.168.1.101:8080 weight=3; # 权重3,处理更多请求server 192.168.1.102:8080 weight=1; # 权重1server 192.168.1.103:8080 backup; # 备用服务器(主服务器故障时启用)
}server {listen 80;server_name www.example.com;# 将请求转发到后端集群(使用负载均衡)location / {proxy_pass http://backend_servers;proxy_set_header Host $host;}
}
六、常用 Nginx 命令
bash
nginx -v # 查看版本
nginx # 启动Nginx
nginx -s stop # 快速停止
nginx -s quit # 优雅停止(处理完当前请求再停止)
nginx -s reload # 重新加载配置(热部署)
nginx -t # 检查配置文件是否正确
总结
Nginx 凭借高性能、轻量级和多功能,成为现代 Web 架构的核心组件。无论是作为静态服务器、反向代理,还是负载均衡器,它都能高效支撑从中小型网站到超大规模分布式系统的需求。掌握 Nginx 的配置和使用,是前端、后端和运维工程师的重要技能。
架构
“架构”(Architecture)是一个跨领域的通用概念,核心是指对一个复杂系统的结构化设计与组织方式—— 即如何将系统拆分为多个组件、组件之间如何协作、以及如何通过这种设计满足系统的核心目标(如性能、可靠性、可扩展性等)。
简单来说,架构就是 “系统的骨架”:它不关注具体的实现细节(比如代码怎么写),而是回答 “系统由什么组成”“组件之间怎么配合”“如何支撑业务需求” 这三个核心问题。
一、架构的核心本质
- 结构化拆分:将复杂系统拆解为更小、更易管理的 “组件”(或模块),降低复杂度。例如:
- 建筑架构中,将大楼拆分为地基、承重墙、楼板、屋顶等组件。
- 软件架构中,将应用拆分为用户界面、业务逻辑、数据存储等组件。
- 定义协作规则:明确组件之间的交互方式(如依赖关系、通信协议、数据流转路径),确保组件协同工作形成完整系统。
- 平衡多方需求:架构设计需在业务目标(如功能、迭代速度)、技术约束(如性能、成本)、质量属性(如可靠性、安全性)之间找到最优平衡。
软件架构
一、软件架构的核心要素
软件架构不关注具体代码实现,而是回答三个关键问题:
- 由什么组成?(组件拆分):将系统拆分为哪些核心模块 / 服务(如 “用户模块”“订单模块”)。
- 如何协作?(交互规则):组件之间通过什么方式通信(如函数调用、API 接口、消息队列),数据如何流转。
- 支撑什么目标?(质量属性):通过设计确保系统具备所需的特性(如 “支持 10 万用户并发”“允许功能模块独立升级”)。
二、软件架构的分层视角
复杂软件系统的架构通常可从 “业务→应用→技术→数据” 四个层次拆解,每层关注不同维度:
1. 业务架构:对齐业务目标
- 核心任务:梳理业务领域、流程和边界,确保技术设计与业务目标一致。
- 示例:电商系统的业务架构需明确 “商品上架→用户下单→支付→物流→售后” 的全流程,以及每个环节的核心角色(如用户、商家、仓库)。
- 输出:业务流程图、领域模型(如 “商品”“订单” 等核心业务实体及关系)。
2. 应用架构:拆分与组织应用
- 核心任务:将业务流程拆分为独立的应用 / 服务,定义应用间的依赖关系和协作方式。
- 示例:电商业务可拆分为 “用户中心”“商品管理”“订单系统”“支付系统” 等应用,其中 “订单系统” 需调用 “支付系统” 完成支付,调用 “商品管理” 查询库存。
- 关键原则:高内聚(一个应用专注于一类业务)、低耦合(应用间通过标准接口通信,不依赖内部实现)。
3. 技术架构:支撑应用运行
- 核心任务:选择技术栈、基础设施和中间件,为应用提供运行环境和通用能力。
- 包含内容:
- 开发框架(如 Java 用 Spring Boot,前端用 React);
- 部署环境(如物理机、虚拟机、容器 Kubernetes);
- 中间件(如数据库 MySQL、缓存 Redis、消息队列 Kafka);
- 基础能力(如负载均衡 Nginx、服务注册发现 Nacos、监控 Prometheus)。
- 示例:高并发系统的技术架构可能包含 “Nginx 负载均衡→API 网关→微服务集群→Redis 缓存→MySQL 主从” 的技术链。
4. 数据架构:设计数据生命周期
- 核心任务:定义数据的存储、流转、同步和治理方式,确保数据一致性、安全性和可用性。
- 包含内容:
- 数据存储选择(如结构化数据用 MySQL,非结构化用 MongoDB,日志用 Elasticsearch);
- 数据流转路径(如订单数据从 “订单系统” 写入 MySQL,同时同步到数据仓库供分析);
- 数据一致性保障(如分布式事务、最终一致性方案)。
三、常见软件架构模式(按演进顺序)
软件架构模式随技术和业务需求发展而迭代,每种模式有其适用场景:
1. 单体架构(Monolith)
- 特点:所有功能模块(如 UI、业务逻辑、数据访问)打包为一个应用,部署在单一进程中,共享一个数据库。
- 优势:简单直接,开发、部署、调试成本低。
- 劣势:代码量大后维护困难,单模块升级需整体重启,无法针对局部扩容。
- 适用场景:小型应用(如企业内部工具、个人博客)、业务简单且稳定的系统。
2. 分层架构(Layered Architecture)
- 特点:在单体架构基础上按 “职责” 纵向分层,典型为 “三层架构”:
- 表现层(UI):处理用户交互(如网页、APP 界面);
- 业务逻辑层(Service):实现核心业务规则(如订单生成、支付验证);
- 数据访问层(DAO):与数据库交互(如查询、插入数据)。
- 优势:职责清晰,便于团队分工(如前端开发专注表现层,后端专注业务层)。
- 劣势:仍属单体应用,扩展性受限;层间依赖可能过强(如表现层直接调用数据层)。
- 适用场景:传统企业应用(如 ERP、CRM 系统)、中等规模且业务稳定的系统。
3. 微服务架构(Microservices)
- 特点:按业务领域拆分为独立部署的小型服务(如 “用户服务”“订单服务”),每个服务有自己的数据库和进程,通过 API 或消息队列通信。
- 优势:服务独立扩展(如订单服务压力大时单独扩容)、技术栈灵活(不同服务可用不同语言)、故障隔离(单服务崩溃不影响整体)。
- 劣势:分布式复杂性(如服务调用超时、数据一致性难保证)、运维成本高(需管理数十上百个服务)。
- 适用场景:大型复杂系统(如电商、金融)、业务迭代快、团队规模大的场景。
4. 云原生架构(Cloud-Native)
- 特点:专为云环境设计,基于容器化、编排和微服务,强调 “弹性扩展”“自愈能力” 和 “DevOps 自动化”。
- 核心组件:
- 容器化(Docker 打包应用,确保环境一致性);
- 编排工具(Kubernetes 自动管理容器的部署、扩缩容、故障恢复);
- 服务网格(Istio 管理服务间通信,处理限流、熔断、监控);
- Serverless(如 AWS Lambda,按需运行函数,无需管理服务器)。
- 优势:极致弹性(流量高峰时自动扩容,低谷时缩容节省成本)、高可用(自动替换故障实例)。
- 适用场景:互联网大规模应用、流量波动大的业务(如直播、电商促销)。
5. 事件驱动架构(Event-Driven)
- 特点:服务通过 “事件”(如 “订单创建”“库存扣减”)异步通信,而非直接调用。一个服务产生事件,其他服务订阅并响应。
- 优势:服务解耦彻底(服务间无需知道对方存在)、抗峰值能力强(事件可暂存队列,逐步处理)。
- 劣势:数据一致性需通过 “最终一致性” 保障(可能短暂不一致)、调试复杂(事件链路长)。
- 适用场景:异步业务流程(如订单状态变更后通知物流、短信、积分系统)、跨系统协作场景。
微服务架构
后端集群
Spring Boot
开发框架
中间件
高并发系统的技术架构可能包含 “Nginx 负载均衡→API 网关→微服务集群→Redis 缓存→MySQL 主从” 的技术链。
Docker
分布式