使用 Java 构建 HTTP 服务
用 JDK 内置 HttpServer 构建可测最小 HTTP 服务:路由、状态码与优雅关闭入口。
#type / howto
#status / growing
#tech / dev
#resource / java
[!info] 关联笔记
- 所属 MOC:Web 后端 · 学习路线
- 前置概念:异常 · 线程池 · JSON
- 后续概念:HttpClient · Spring Web · 优雅关闭
- 容易混淆:生产仍常选成熟服务器/框架
使用 Java 构建 HTTP 服务
目标
- 启动本机 HTTP 端口
- 实现健康检查与简单业务 GET
- 返回正确状态码
- 能关闭服务器
这个场景为什么出现
先不引入 Spring,也能理解请求-响应、线程与路由。框架是装配加速器;HTTP 语义是底座。
[!abstract] 一句话理解 用
com.sun.net.httpserver.HttpServer(JDK 自带)绑定端口与上下文处理器,完成最小可测服务闭环。
最小可运行示例
场景:订单查询服务提供 /health 与 /orders/{id}
import com.sun.net.httpserver.HttpServer;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.nio.charset.StandardCharsets;
import java.util.Map;
import java.util.concurrent.Executors;
public class MiniOrderServer {
public static void main(String[] args) throws Exception {
Map<String, String> db = Map.of("1", "PAID", "2", "CREATED");
HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);
server.createContext("/health", ex -> write(ex, 200, "ok"));
server.createContext("/orders/", ex -> {
String path = ex.getRequestURI().getPath(); // /orders/1
String id = path.substring("/orders/".length());
String status = db.get(id);
if (status == null) write(ex, 404, "not-found");
else write(ex, 200, status);
});
server.setExecutor(Executors.newFixedThreadPool(4));
server.start();
System.out.println("listening 8080");
// 演示环境:主线程阻塞;生产应接入关闭钩子
Thread.currentThread().join();
}
static void write(com.sun.net.httpserver.HttpExchange ex, int code, String body) throws IOException {
byte[] bytes = body.getBytes(StandardCharsets.UTF_8);
ex.sendResponseHeaders(code, bytes.length);
try (OutputStream os = ex.getResponseBody()) { os.write(bytes); }
}
}
javac MiniOrderServer.java
# 另开终端:curl -s localhost:8080/health
期望:/health → ok;/orders/1 → PAID;未知 id → 404。
注:
com.sun.net.httpserver适合学习与内部工具;大规模生产常选 Jetty/Netty/框架。
结合场景再看三个关注点
- 状态码是契约。
- 线程池执行请求。
- 关闭钩子在工程篇完善。
核心步骤与准确模型
- 选择服务器抽象(JDK/框架)
- 定义路由与媒体类型
- 注入业务服务
- 错误映射
- 观测与关闭
工程实践
- 超时、请求体大小限制。
- 统一 JSON 错误体。
- 健康检查与就绪检查分离。
- 再引入 Spring 对照。
本节总结
- 标准路径先跑通 HTTP
- 框架后置
- 状态码/线程/关闭是核心
自测题
- 404 与 500 如何分工?
- 为什么处理器里要限制 body 大小?
参考答案
- 404 资源不存在;500 服务器未处理异常。
- 防 OOM/慢请求攻击。
延伸阅读与资料来源
| 资料 | 类型 | 支撑内容 |
|---|---|---|
| HttpServer API | API | JDK 服务器 |