菜单

服务器 API (Bun.serve)

相关源文件

本文档涵盖了 Bun 高性能的 HTTP/WebSocket 服务器 API,包括 Bun.serve() 函数、请求路由机制、WebSocket 升级处理以及底层服务器架构。有关 HTTP 客户端功能,请参阅 HTTP 客户端和 Fetch API。有关更底层的套接字 API,请参阅 套接字 API 和网络协议

概述

Bun.serve() API 提供了一个基于 µWebSockets (uWS) 构建的高性能 HTTP 和 WebSocket 服务器。该服务器支持 HTTP 和 HTTPS 协议、自动 WebSocket 升级、静态文件服务、动态路由以及用于可扩展性的插件系统。

服务器架构

核心服务器类型

Bun 使用通用的 NewServer 函数实现服务器,该函数根据协议和模式创建不同的服务器变体

来源src/bun.js/api/server.zig423-447

服务器生命周期

服务器生命周期涉及初始化、路由设置、监听和请求处理

来源src/bun.js/api/server.zig1-50 src/deps/libuwsockets.cpp26-37

请求处理管道

请求上下文管理

每个传入请求都会创建一个 RequestContext 来管理请求生命周期

来源src/bun.js/api/server.zig445 src/bun.js/webcore/streams.zig679-708

请求处理流程

服务器通过多个阶段处理请求

来源src/bun.js/api/server.zig67-187 src/bun.js/api/server.zig606-608

路由系统

路由类型

Bun 支持多种路由机制,通过 AnyRoute 联合

路由类型目的实现
静态静态文件服务StaticRoute
htmlHTML 包服务HTMLBundle.Route
framework_router文件系统路由FrameworkRouter

来源src/bun.js/api/server.zig67-87

静态路由解析

静态路由将 URL 模式直接映射到响应或文件

来源src/bun.js/api/server.zig62-63 src/http.zig37

框架路由器

框架路由器实现了类似 Next.js 的基于文件系统的路由

来源src/bun.js/api/server.zig146-182

WebSocket 升级机制

升级流程

HTTP 连接可以通过 upgrade() 方法升级为 WebSocket 连接

来源src/bun.js/api/server.zig656-921

WebSocket 配置

WebSocket 行为通过 websocket 配置选项进行配置

来源src/bun.js/api/server.zig48 src/bun.js/api/server/WebSocketServerContext.zig

配置选项

服务器配置结构

ServerConfig 结构定义了所有服务器选项

来源src/bun.js/api/server/ServerConfig.zig

完整的配置选项

选项类型目的
port数字要监听的端口
hostname字符串要绑定的主机
fetch函数请求处理程序
websocket(WebSocket)对象WebSocket 配置
tls对象TLS/SSL 配置
development布尔值启用开发功能
maxRequestBodySize数字最大请求正文大小
lowMemoryMode布尔值针对低内存进行优化

来源src/bun.js/api/server/ServerConfig.zig

插件系统

插件加载架构

服务器可以异步加载插件以扩展功能

来源src/bun.js/api/server.zig193-415

插件集成点

插件与多个服务器组件集成

来源src/bun.js/api/server.zig243-376

性能特征

内存管理

服务器为高性能运行实现了细致的内存管理

  • 请求上下文通过 RequestContextStackAllocator 进行池化和重用
  • 静态路由使用引用计数进行内存生命周期管理
  • HTML 包进行去重以减少内存使用
  • 流式响应最小化内存复制

来源src/bun.js/api/server.zig457 src/bun.js/api/server.zig555-560

网络层

该服务器基于 µWebSockets 构建,以实现高性能网络

  • 尽可能进行零拷贝操作
  • 软写(Corked writes)用于批量处理小响应
  • 自动背压处理
  • 高效的头部解析和路由

来源src/deps/libuwsockets.cpp134-144 packages/bun-uws/src/HttpContext.h224-260