使用 Java 构建 HTTP 服务

用 JDK 内置 HttpServer 构建可测最小 HTTP 服务:路由、状态码与优雅关闭入口。

#type / howto #status / growing #tech / dev #resource / java

[!info] 关联笔记

使用 Java 构建 HTTP 服务

目标

  1. 启动本机 HTTP 端口
  2. 实现健康检查与简单业务 GET
  3. 返回正确状态码
  4. 能关闭服务器

这个场景为什么出现

先不引入 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

期望:/healthok/orders/1PAID;未知 id → 404。

注:com.sun.net.httpserver 适合学习与内部工具;大规模生产常选 Jetty/Netty/框架。

结合场景再看三个关注点

  1. 状态码是契约
  2. 线程池执行请求
  3. 关闭钩子在工程篇完善。

核心步骤与准确模型

  1. 选择服务器抽象(JDK/框架)
  2. 定义路由与媒体类型
  3. 注入业务服务
  4. 错误映射
  5. 观测与关闭

工程实践

  1. 超时、请求体大小限制。
  2. 统一 JSON 错误体。
  3. 健康检查与就绪检查分离。
  4. 再引入 Spring 对照。

本节总结

  • 标准路径先跑通 HTTP
  • 框架后置
  • 状态码/线程/关闭是核心

自测题

  1. 404 与 500 如何分工?
  2. 为什么处理器里要限制 body 大小?
参考答案
  1. 404 资源不存在;500 服务器未处理异常。
  2. 防 OOM/慢请求攻击。

延伸阅读与资料来源

资料类型支撑内容
HttpServer APIAPIJDK 服务器
创建于 2026/7/15 更新于 2026/7/15