在现代 Web 开发(特别是基于 Spring Boot 的 HTTP 接口服务)中,常见的部署模式或运行方式可以从以下几个角度进行归纳和区分:
1. 从 Servlet 模型 vs. Reactive 模型 来看
1.1 Servlet 模型(经典同步 / 异步)
- 特点:
- 基于 Servlet 规范(HTTP 同步阻塞 I/O);
- 常见容器:Tomcat、Jetty、Undertow(Servlet 模式);
- Spring Boot 通常依赖
spring-boot-starter-web
,默认内置 Tomcat 作为容器,也可切换到 Jetty/Undertow; - 具备 Servlet 3.0+ 异步能力(
DeferredResult
、AsyncContext
、WebAsyncTask
等),但其本质仍是 Servlet 异步,与 Reactive Streams 不同; - 适用于大多数传统 HTTP 短链接或中小规模服务场景,生态成熟。
- 典型部署方式:
- 可执行 JAR:直接
java -jar myapp.jar
,使用 Spring Boot 内置容器(Tomcat/Jetty/Undertow); - WAR 包:把应用打包成
war
部署到外部容器(Tomcat/Jetty/…)上。传统企业可能习惯这种方式; - 容器化:在 Docker 映像中运行内置容器或外部容器,再上云或 K8s 等。
1.2 Reactive 模型(WebFlux)
- 特点:
- 基于 Reactor (或其他 Reactive 库),使用非阻塞 I/O;
- 通常依赖
spring-boot-starter-webflux
; - 默认内置 Reactor Netty 作为服务器,也可以使用 Jetty/Undertow 的 Reactive 版;
- 完整支持 Reactive Streams 背压与取消 (
.doOnCancel()
); - 适合处理高并发、流式推送(SSE、WebSocket)或需要非阻塞的场景,减少线程资源占用。
- 典型部署方式:
- 同样可以 可执行 JAR 方式,内置 Netty (或其他) 服务器;
- 同样可 容器化 后部署到 Docker / K8s 等;
- 以 WAR 方式部署到支持 Reactive 的服务器并不常见(大多数是直接可执行 Jar 运行 Netty)。
注意: Tomcat/Jetty/Undertow 在 Servlet 模式下是同步阻塞 IO;在 WebFlux Reactive 模式下(Netty/Undertow/Jetty Reactive 版本)是非阻塞 IO,二者有着本质区别。
2. 从 应用打包形态 来看
2.1 内置容器(Embedded Server)
- Spring Boot
jar
文件中已经内置了 Tomcat/Jetty/Netty 等服务器; - 启动时只需
java -jar app.jar
即可,对运维而言比较方便; - 常用方式:
spring-boot-starter-web
+ Embedded Tomcat 或spring-boot-starter-webflux
+ Embedded Netty。
2.2 外置容器(External Server)
- 将应用打包为
war
或者独立可执行文件,但不包含容器; - 部署到已有的 Tomcat、JBoss、WebSphere、Jetty 等服务器上;
- 传统大型企业常见部署方式,容器运维、配置、管理和应用相对分离;
- Spring Boot 虽支持,但相比嵌入式方式少了些“开箱即用”的便利。
3. 从 操作环境 / 基础设施 来看
3.1 直接在物理机 / 虚拟机上跑
- 最简单的方式:在 Linux/Windows 上安装好 JDK 和服务器容器或直接运行 jar;
- 常见于中小团队或传统企业无容器化时。
3.2 容器化 (Docker)
- 打包应用为 Docker 镜像,容器内自带 JDK + (Tomcat/Netty...);
- 运行时通过
docker run
启动容器,对外暴露端口; - 易于和 CI/CD 流程对接,便于移植和快速部署。
3.3 编排 / 云上托管 (Kubernetes / Cloud Service)
- 将 Docker 容器推送到私有/公有镜像仓库,通过 K8s 部署一组 Pod 副本;
- 使用 Ingress / Service 暴露 HTTP 接口给外部;
- 或者使用云厂商提供的容器服务(ECS、EKS、ACK、GKE等)或无服务器平台(如 AWS Fargate 等)托管;
- 适合弹性扩缩容、高可用的微服务体系。
3.4 服务器 + 负载均衡 / 反向代理
- 无论是物理机、VM 还是 Docker,都通常会结合 Nginx / HAProxy / F5 等做反向代理、负载均衡、HTTPS termination 等工作;
- Spring Boot 应用只需在后端监听局域网端口,Nginx 等代理对外暴露域名 + 443 端口;
- 这种模式非常常见,方便做 SSL/TLS 配置和多实例负载均衡。
4. 从 整体架构 看
4.1 单体应用 (Monolith)
- 所有业务模块都在一个 Spring Boot 项目里;
- 部署一个或多个副本,用负载均衡来分流;
- 适用于中小体量、功能内聚的场景。
4.2 微服务 / 分布式
- 将业务拆分为多个独立服务(如用户服务、订单服务、支付服务等);
- 各服务分别是一个 Spring Boot (或其他框架) 应用,分别部署;
- 通过注册中心 (Eureka/Nacos/Consul),或通过 K8s Service 发现通信;
- 常常会用 API Gateway (Spring Cloud Gateway / Nginx / Kong 等) 作为统一入口。
4.3 Serverless / FaaS
- 例如部署到 AWS Lambda、Azure Functions、阿里云函数计算等;
- 用户只需编写函数式代码,不再显式管理服务器或容器;
- 适用于事件驱动、弹性需求极大的场景,但和传统 Java 应用启动时间/冷启动会有折衷。
5. 总结
在 网页服务开发(HTTP 接口服务) 中,常见的关键维度有:
- Servlet 同步/异步 vs Reactive WebFlux
- 前者使用
spring-boot-starter-web
(Tomcat/Jetty/Undertow),后者使用spring-boot-starter-webflux
(Netty/Undertow Reactive/Jetty Reactive)。 - Reactive 模式能实现真正的背压、取消机制;Servlet 模式更适合兼容传统生态。
- 可执行 JAR(Embedded) vs WAR(External)
- Spring Boot 内置服务器 vs. 外部容器。
- 内置容器是“约定优于配置”的现代主流;外部容器是传统大型企业常见部署方式。
- 部署到物理机 / 虚拟机 / 容器 / 云
- 直接在机器上跑、或打包成 Docker 镜像、或在 K8s 中编排;
- 结合负载均衡、反向代理、API Gateway 等进行流量管理和安全控制;
- 还可进一步上云 (Serverless / FaaS) 做弹性扩容。
- 单体 vs. 微服务
- 单体:所有逻辑集中在一个应用中;
- 微服务:拆分为多服务或多容器,利用服务间通信(HTTP/gRPC/RPC/消息队列)互相协作。