🤗 ApiHug × {Postman|Swagger|Api...} = 快↑ 准√ 省↓
- GitHub - apihug/apihug.com: All abou the Apihug
- apihug.com: 有爱,有温度,有质量,有信任
- ApiHug - API design Copilot - IntelliJ IDEs Plugin | Marketplace
The Next Generation API Development Platform - ApiHug
Reactor Netty提供了易于使用和配置的 HttpServer
。它隐藏了创建HTTP服务器所需的大部分Netty的功能,并增加了Reactive Streams
背压。
Reactor Netty HTTP 服务器端测试代码open in new window
#启动和停止
要想启动一个HTTP服务器,您必须创建并且配置一个 HttpServer
实例。
默认情况下,host被配置为任何的本地地址,当执行bind操作的时候系统会选择一个临时端口。下面是创建并且配置一个HttpServer
实例的例子:
public static void main(String[] args) {
DisposableServer server =
HttpServer.create() // <1>
.bindNow(); // <2>
server.onDispose().block();
}
<1>
创建一个HttpServer
实例用来进行之后的配置操作。<2>
使用阻塞等待的方式启动服务器,直到初始化完成。
返回的 DisposableServer
提供了简单的服务器API,包括disposeNow()
,这个方法可以以阻塞等待的方式来关闭服务器。
负责实例的创建是 HttpServerBind
, 配置信息在 HttpServerConfig#HttpServerChannelInitializer
:
@Override
protected ChannelPipelineConfigurer defaultOnChannelInit() {
return super.defaultOnChannelInit()
.then(new HttpServerChannelInitializer(this));
}
对于 HTTP 协议这里有自己的 initializer
也就是 pipeline
:
configureHttp11Pipeline(
channel.pipeline(),
accessLogEnabled,
accessLog,
compressPredicate(compressPredicate, minCompressionSize),
cookieDecoder,
cookieEncoder,
decoder,
formDecoderProvider,
forwardedHeaderHandler,
idleTimeout,
observer,
mapHandle,
maxKeepAliveRequests,
metricsRecorder,
minCompressionSize,
uriTagValue);
熟悉 Netty 框架的同学对这一块并不默认, 一个最乞丐版的 Netty 服务器可能只包含 request/respone decoder/encoder。
#预热
默认情况下,HttpServer
初始化资源的操作在需要使用的时候才进行。这意味着初始化加载的时候bind operation
会占用额外的时间:
- 事件循环组
- native传输库(当使用了native传输的时候)
- 用于安全性的native库(使用了OpenSsl的时候)
当您需要预加载这些资源的时候,您可以按照以下方式来配置HttpServer:
public static void main(String[] args) {
HttpServer httpServer =
HttpServer.create().handle((request, response) -> request.receive().then());
httpServer
.warmup() // <1>
.block();
DisposableServer server = httpServer.bindNow();
server.onDispose().block();
}
<1>
初始化和加载事件循环组,native传输库和用于安全性的native库