Hutool基于JDK原生HttpServer封装,3行代码即可启动轻量级HTTP服务器并实现基础网关功能,支持路由转发、简易鉴权、请求头透传、轮询负载均衡及错误兜底处理。

Java 自带的轻量级 HTTP 服务器(com.sun.net.httpserver.HttpServer)本身不直接支持网关功能,但通过封装和扩展,可以快速构建一个**微型、无依赖、启动快、可定制**的网关服务。Hutool 的 HttpUtil.createServer() 正是基于它做的极简封装,无需 Spring、Tomcat 或 Undertow,3 行代码即可起步。
用 Hutool 快速实现基础路由转发
Hutool 将 JDK 原生 HttpServer 封装得足够友好,适合做简单网关原型:
- 添加 Maven 依赖(仅需 hutool-http):
<dependency><br> <groupId>cn.hutool</groupId><br> <artifactId>hutool-http</artifactId><br> <version>5.8.25</version><br></dependency>
- 写一个带路径匹配和后端转发的处理器:
HttpUtil.createServer(8080)<br> .addAction("/api/user/**", (req, res) -> {<br> String target = "http://localhost:8001" + req.getURI().getPath();<br> String body = HttpUtil.createGet(target).execute().body();<br> res.write(body, ContentType.JSON.toString());<br> })<br> .addAction("/api/order/**", (req, res) -> {<br> String target = "http://localhost:8002" + req.getURI().getPath();<br> String body = HttpUtil.createGet(target).execute().body();<br> res.write(body, ContentType.JSON.toString());<br> })<br> .start(); - 注意:这里用了
**模拟通配,实际需手动截取路径或用正则判断前缀,Hutool 不内置路径通配器,但够用。
添加简易鉴权与请求头透传
微型网关常需校验 token 或转发原始请求头:
- 检查 Authorization 头:
String auth = req.getHeader("Authorization");<br>if (StrUtil.isBlank(auth) || !auth.startsWith("Bearer ")) {<br> res.send401("Unauthorized");<br> return;<br>} - 透传关键头到后端(如 X-Request-ID、User-Agent):
HttpUtil.createGet(target)<br> .header("Authorization", auth)<br> .header("X-Request-ID", req.getHeader("X-Request-ID"))<br> .header("User-Agent", req.getHeader("User-Agent")) - 避免硬编码,建议把后端地址抽成 Map 或配置类,便于维护。
支持简单负载均衡(轮询)
不引入额外组件,也能实现最基础的多实例分发:
立即学习“Java免费学习笔记(深入)”;
- 定义服务列表:
List<String> services = Arrays.asList(<br> "http://localhost:8001",<br> "http://localhost:8002"<br>);<br>AtomicInteger counter = new AtomicInteger(0);
- 在路由中轮询选取:
int idx = counter.getAndIncrement() % services.size();<br>String target = services.get(idx) + req.getURI().getPath();
- 此方式无健康检查,仅适用于开发测试或固定可用节点场景。
静态资源与错误兜底处理
让网关更健壮,避免 404 暴露细节:
- 统一 404 响应:
.addAction("/**", (req, res) -> {<br> res.send404("{"error":"API not found",<br> "path":"" + req.getURI().getPath() + ""}");<br>}) - 若需托管前端资源(如 Swagger UI),可配合
FileUtil.readUtf8String()读取 HTML/JS 文件并设置Content-Type;但生产环境建议交由 Nginx。 - 日志建议加一行:
Console.log("→ {} {}", req.getMethod(), req.getURI()),便于调试。


















