Reactor Netty 1.0.13+如何不使用废弃方法自定义HttpClient LoggingHandler
Reactor Netty 1.0.13+ 自定义HttpLoggingHandler配置实现
旧版本中使用的HttpClient.create().tcpConfiguration()方法与BootstrapHandlers类在reactor-netty 1.0.x版本迭代中已被废弃移除,新版框架提供了更轻量的通道生命周期钩子来挂载自定义ChannelHandler,具体实现步骤如下:
- 第一步:实现自定义
HttpLoggingHandler
继承Netty原生LoggingHandler,按需重写日志格式化方法、传入自定义日志级别即可:
import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; import io.netty.channel.ChannelHandlerContext; public class HttpLoggingHandler extends LoggingHandler { public HttpLoggingHandler(LogLevel level) { super(level); } // 按需重写format方法定制日志输出格式、过滤敏感字段 @Override protected String format(ChannelHandlerContext ctx, String eventName, Object arg) { return super.format(ctx, eventName, arg); } }
- 第二步:配置HttpClient挂载自定义Handler
根据需要的初始化时机,二选一即可:- 连接建立后挂载(适用于90%以上常规场景)
使用doOnConnected钩子,在TCP连接建立完成后将自定义Handler加入ChannelPipeline:
import reactor.netty.http.client.HttpClient; public class CustomHttpClient { public HttpClient getInstance() { return HttpClient.create() .doOnConnected(conn -> conn.addHandlerLast(new HttpLoggingHandler(LogLevel.INFO))); } }- 通道初始化阶段挂载(适用于需要更早捕获连接事件的场景)
使用doOnChannelInit钩子,在通道初始化阶段就注入Handler:
public HttpClient getEarlyInitInstance() { return HttpClient.create() .doOnChannelInit((observer, channel, remoteAddress) -> channel.pipeline().addLast(new HttpLoggingHandler(LogLevel.DEBUG)) ); } - 连接建立后挂载(适用于90%以上常规场景)
- 配置注意事项
- 调整Handler顺序时,可使用
addBefore/addAfter方法指定锚点Handler名称,如果需要打印完整的HTTP报文原始字节,建议将自定义日志Handler放在HTTP编解码器之后的位置。 - 若无自定义日志格式需求,直接调用
HttpClient.wiretap(true)即可开启框架内置的请求响应日志,不需要额外实现自定义Handler。
- 调整Handler顺序时,可使用
提示:1.0版本后所有TCP层自定义配置都可以通过框架暴露的
doOnConnected、doOnChannelInit、option等方法实现,不需要直接操作底层Bootstrap实例。
内容的提问来源于stack exchange,提问作者Vahid
相关产品推荐
相关产品推荐

