Reactor Netty HTTP 服务器开发指南
概述
Reactor Netty 是一个基于 Netty 框架的响应式网络应用开发库,提供了简洁易用的 API 来构建高性能的网络应用。本文将重点介绍如何使用 Reactor Netty 中的 HttpServer 组件来开发 HTTP 服务器。
快速开始
创建基础 HTTP 服务器
创建一个基本的 HTTP 服务器非常简单:
public class BasicServer {
public static void main(String[] args) {
HttpServer.create()
.bindNow()
.onDispose()
.block();
}
}
这段代码会启动一个监听随机端口的 HTTP 服务器。bindNow() 方法会阻塞当前线程直到服务器启动完成。
指定主机和端口
实际开发中我们通常需要指定具体的监听地址:
HttpServer.create()
.host("localhost") // 指定主机
.port(8080) // 指定端口
.bindNow();
多地址绑定
Reactor Netty 支持在多个地址上同时监听:
HttpServer server = HttpServer.create();
DisposableServer server1 = server.host("192.168.1.100").port(8080).bindNow();
DisposableServer server2 = server.host("192.168.1.101").port(8081).bindNow();
多个服务器实例会共享底层资源,提高资源利用率。
路由配置
基本路由
定义请求处理逻辑是 HTTP 服务器的核心功能:
HttpServer.create()
.route(routes ->
routes.get("/hello", (request, response) ->
response.sendString(Mono.just("Hello World!")))
.post("/echo", (request, response) ->
response.send(request.receive().retain()))
)
.bindNow();
路径参数
支持从路径中提取参数:
routes.get("/user/{id}", (request, response) -> {
String userId = request.param("id");
return response.sendString(Mono.just("User ID: " + userId));
})
WebSocket 支持
routes.ws("/ws", (inbound, outbound) -> {
return outbound.send(inbound.receive().retain());
})
数据处理
发送响应数据
HttpServer.create()
.handle((request, response) ->
response.sendString(Mono.just("Hello")))
.bindNow();
添加响应头
response.header("Content-Type", "text/plain")
.header("Custom-Header", "value")
.sendString(Mono.just("Hello"));
压缩响应
根据客户端支持的压缩方式自动压缩响应:
HttpServer.create()
.compress(true) // 启用压缩
.bindNow();
也可以根据条件启用压缩:
.compress((req, res) -> req.requestHeaders().contains("X-Compress"))
请求处理
读取请求数据
HttpServer.create()
.handle((request, response) ->
request.receive().asString()
.doOnNext(data -> System.out.println("Received: " + data))
.then(response.send()))
.bindNow();
处理表单数据
request.receiveForm()
.doOnNext(form -> {
String username = form.get("username");
String password = form.get("password");
})
.then(response.send());
处理文件上传
request.receiveMultipart()
.doOnNext(part -> {
if (part instanceof FilePart) {
FilePart filePart = (FilePart) part;
// 处理文件
}
})
.then(response.send());
高级配置
SSL/TLS 配置
HttpServer.create()
.secure(spec -> spec.sslContext(SslContextBuilder
.forServer(certFile, keyFile)))
.bindNow();
服务器名称指示(SNI)
支持基于域名的 SSL 配置:
.secure(spec -> spec.sniMappings(mappings ->
mappings.map("*.example.com", domain ->
SslContextBuilder.forServer(domainCert, domainKey))))
TCP 层配置
HttpServer.create()
.tcpConfiguration(tcpServer ->
tcpServer.option(ChannelOption.SO_KEEPALIVE, true))
.bindNow();
性能优化
预热资源
HttpServer.create()
.warmup() // 预热事件循环组和本地库
.bindNow();
请求解码器配置
HttpServer.create()
.httpRequestDecoder(spec ->
spec.maxHeaderSize(16384)) // 增大头部大小限制
.bindNow();
监控与日志
访问日志
HttpServer.create()
.accessLog(true) // 启用访问日志
.bindNow();
自定义日志格式
.accessLog(true, args ->
String.format("%s - %s [%s] \"%s\" %s %s",
args.getConnectionInformation().getRemoteAddress(),
args.getUser(),
args.getZonedDateTime(),
args.getRequest(),
args.getStatus(),
args.getContentLength()))
生命周期回调
HttpServer.create()
.doOnConnection(conn ->
conn.addHandler(new ReadTimeoutHandler(30)))
.doOnChannelInit((observer, channel, address) ->
channel.pipeline().addFirst(new LoggingHandler()))
.bindNow();
总结
Reactor Netty 的 HttpServer 提供了强大而灵活的功能来构建高性能 HTTP 服务。通过本文介绍的各种配置选项和处理模式,开发者可以根据具体需求构建出符合业务场景的网络服务。其响应式编程模型与 Netty 的高性能特性相结合,使得开发网络应用既简单又高效。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



