Solon 的 10 种 HTTP 服务器:改一行依赖,换一个引擎

📅 2026/8/2 21:49:18 👁️ 阅读次数 📝 编程学习
Solon 的 10 种 HTTP 服务器:改一行依赖,换一个引擎

用 Solon 做线上项目有一阵子了,有个点总让新接触的人觉得意外:服务器引擎是让你选的

Solon 内核约 0.3MB,不内置固定的 HTTP 服务器。HTTP 引擎是一个独立插件。你选一个,或者选两个,不同环境之间切换,一行应用代码都不用改。

下面快速过一下 10 种 HTTP 服务器选项,各自适合什么场景,以及怎么切换。

一行依赖替换

在 Solon 里换 HTTP 服务器就是改 pom.xml 里一个依赖,别的什么都不用动。

<dependency><groupId>org.noear</groupId><artifactId>solon-web</artifactId>
</dependency>

想换成 Undertow?

<dependency><groupId>org.noear</groupId><artifactId>solon-web</artifactId><exclusions><exclusion><groupId>org.noear</groupId><artifactId>solon-server-smarthttp</artifactId></exclusion></exclusions>
</dependency>
<dependency><groupId>org.noear</groupId><artifactId>solon-server-undertow</artifactId>
</dependency>

就这些。你的 @Controller@Mapping("/hello")、过滤器、拦截器 — 全部不变。路由层是框架自己的,底层的服务器是一个可插拔的适配器。

10 种引擎速览

插件 大小 协议 响应式 JDK
solon-server-jdkhttp 0.3MB http 8+
solon-server-smarthttp 0.8MB http, ws 8+
solon-server-grizzly 1.8MB http, ws, http2 8+
solon-server-vertx 6.3MB http, ws, http2 8+
solon-server-jetty 2.7MB http, ws 8+
solon-server-undertow 4.6MB http, ws, http2 8+
solon-server-tomcat http, ws, http2 8+
solon-server-jetty-jakarta 3.9MB http, ws, http2 17+
solon-server-undertow-jakarta http, ws, http2 17+
solon-server-tomcat-jakarta http, ws, http2 17+

另外还有两个专门的 WebSocket 服务器(solon-server-websocketsolon-server-websocket-netty)和一个 Socket.D 服务器。

怎么选

微服务和边缘服务:jdkhttp 或 smarthttp

搭轻量 API 服务或需要一秒内启动的微服务,用 jdkhttp。零外部依赖,支持响应式 I/O。JDK 自带的 com.sun.net.httpserver 应付大多数 API 场景绰绰有余。

smarthttp(国产贡献)在同一个端口上加了 WebSocket 支持 — 如果既需要 REST 又需要 WebSocket,又不想多开一个服务器,挺实用。

@SolonMain
public class App {public static void main(String[] args) {Solon.start(App.class, args, app -> {app.enableWebSocket(true);});}
}

需要 HTTP/2:grizzly、undertow、vertx、tomcat

这四个都支持 HTTP/2。一行代码开启:

app.onEvent(HttpServerConfigure.class, e -> {e.enableHttp2(true);  // v2.3.8+
});

Undertow 是个不错的折中 — 4.6MB,Apache 2.0 协议,社区活跃。Vert.x 更重(6.3MB),但如果你已经在用 Vert.x 生态,那全套事件循环体系也是加分项。

传统 Java 团队:Jetty 或 Tomcat

如果团队从 Spring Boot + 内嵌 Tomcat 迁移过来,solon-server-tomcat 是最自然的替换。底层仍然是 Tomcat v9 引擎 — 运维团队已有的调优经验直接复用。

Jetty 是 Eclipse 生态的好选择,还通过 solon-server-jetty-add-jsp 显式支持 JSP。

Jakarta EE 迁移:jetty-jakarta、undertow-jakarta、tomcat-jakarta

JDK 17+ 且目标命名空间是 jakarta.* 的,用 Jakarta 变体。对应 Jakarta 服务器版本分别是 Jetty 12、Undertow 2.3、Tomcat 11。

永远不变的应用代码

这是我个人最喜欢的一点。不管你选哪个服务器引擎,应用代码完全一样:

@Controller
public class DemoController {@Mapping("/hello")public String hello() {return "Hello world!";}@Mapping("/greet/{name}")public String greet(String name) {return "你好," + name + "!";}
}

同一段代码,跑在 jdkhttp(0.3MB,无依赖)、Undertow(4.6MB,HTTP/2)或 Tomcat(生产级)上,零改动。

进阶:多端口、SSL 与调试模式

所有服务器适配器共享一套配置接口:

# app.yml
server.port: 8080
server.ssl.keyStore: "/data/ca/demo.jks"
server.ssl.keyPassword: "demo"

或者编程式配置:

Solon.start(App.class, args, app -> {// 加第二个 HTTP 端口(主端口走 HTTPS 时有用)app.onEvent(HttpServerConfigure.class, e -> {e.addHttpPort(8082);e.enableDebug(true);    // smarthttp/jdkhttp 调试模式});
});

自定义 SSLContext(v2.5.9+):

app.onEvent(HttpServerConfigure.class, e -> {SSLContext sslContext = buildMyCustomSSLContext();e.enableSsl(true, sslContext);
});

默认到底是什么?

如果你只加了 solon-web 没做任何排除,Solon 默认用 smarthttp — 国产开源服务器。可覆盖 99% 的开发场景。

线上可能需要更调优的方案。但妙就妙在:你不用第一天就做决定。 先用默认起步,跑基准测试,等有特别需要了再换 Undertow 或 Tomcat — 全程不用改一条路由。

总结

Solon 的可插拔服务器架构,纸上看起来是个小特性,实际用起来差别很大。一行依赖替换,零代码影响,从 0.3MB 到全功能生产服务器的完整光谱。

需求 推荐
最轻量的 API 服务器 jdkhttp(0.3MB)
同端口 REST + WebSocket smarthttp(0.8MB)
HTTP/2 + 均衡性能 undertow(4.6MB)
Spring Boot 迁移 tomcat
响应式事件循环 vert.x 或 grizzly
Jakarta EE(JDK 17+) jetty-jakarta / undertow-jakarta
独立 WebSocket 服务 solon-server-websocket(0.4MB)

服务器是基础设施。框架是你的代码。Solon 把它们分开 — 这是好事。