Springboot Webflux应用程序中未命中WebServerFactoryCustomizer

8yoxcaq7  于 2022-09-19  发布在  Spring
关注(0)|答案(2)|浏览(134)

配置Web服务器之后,我添加了一个NettyWebServerFactoryCustomizer

@Configuration
public class NettyWebServerFactoryCustomizer implements WebServerFactoryCustomizer<NettyReactiveWebServerFactory> {

    @Override
    public void customize(NettyReactiveWebServerFactory factory) {
        factory.addServerCustomizers(httpServer -> {
            return httpServer
                .wiretap(true)
                .metrics(true, s->s)
                .doOnConnection(conn -> {
                    conn.addHandlerFirst(new ReadTimeoutHandler(50, TimeUnit.MILLISECONDS));
                });
        });
    }
}

我有两个问题:
1.当我运行应用程序时,customize功能未被点击。我想念哪里?我的目的是启用Netty度量,但在application.yml文件中找不到任何关于配置度量的文档。所以我加上NettyWebServerFactoryCustomizer
1..metrics(true, s->s)的第二个参数是uriTagValue,是否有关于如何传入值的示例?我只是使用s->s,因为我指的是this,但这可能无法避免cardinality explosion,是否有类似ServerWebExchange.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE)的简单函数为我们提供模板URL?

qgelzfjb

qgelzfjb1#

我找到了问题1的解决方法:定义bean而不是实现WebServerFactoryCustomizer

@Bean
    public ReactiveWebServerFactory reactiveWebServerFactory() {
        NettyReactiveWebServerFactory factory = new NettyReactiveWebServerFactory();
        factory.addServerCustomizers(builder -> builder
                .wiretap(true)
                .metrics(true,s->s)
                .accessLog(true)
                .doOnConnection(conn -> {
                    conn.addHandlerFirst(new ReadTimeoutHandler(50, TimeUnit.MILLISECONDS));
                }));

        return factory;
    }
ryoqjall

ryoqjall2#

关于您的问题2:.metrics的第二个参数(true,s->s)是uriTagValue,是否有关于如何传入值的示例*

private static final Pattern URI_TEMPLATE_PATTERN = Pattern.compile("/test/.*");

@Bean
public ReactiveWebServerFactory reactiveWebServerFactory() {
    NettyReactiveWebServerFactory factory = new NettyReactiveWebServerFactory();
    factory.addServerCustomizers(builder -> builder
            .wiretap(true)
            .metrics(true,
              uriValue ->
            {
                Matcher matcher = URI_TEMPLATE_PATTERN .matcher(uriValue);
                if (matcher.matches()) {
                    return "/test/";
                }
                return "/";
            }               
            .accessLog(true)
            .doOnConnection(conn -> {
                conn.addHandlerFirst(new ReadTimeoutHandler(50, TimeUnit.MILLISECONDS));
            }));

    return factory;
}

相关问题