0
点赞
收藏
分享

微信扫一扫

项目应用webflux改造接口

项目框架spring webflux

什么是webflux:

Router Functions:

WebFlux:

Reactive Streams:

Webflux的优势

Webflux目前的不足

项目结构

webflux中使用filter

/**
 * 业务记录日志filter
 *
 * @author pilsy
 */
@Order(-1)
@Component
public class BusinessLogFilter implements WebFilter {

    private static final Logger log = LoggerFactory.getLogger(BusinessLogFilter.class);

    private final LogRepository logRepository;

    private final PathPattern pathPattern;

    @Autowired
    public BusinessLogFilter(LogRepository logRepository) {
        this.logRepository = logRepository;
        pathPattern = new PathPatternParser().parse("/bd-exchange/**");
    }

    @Override
    public Mono<Void> filter(ServerWebExchange serverWebExchange, WebFilterChain webFilterChain) {

        final ServerHttpRequest request = serverWebExchange.getRequest();
        // 匹配请求路径
        if (pathPattern.matches(request.getPath().pathWithinApplication())) {
            // 匹配到业务请求记录日志
            RequestPath path = request.getPath();
            MultiValueMap<String, String> queryParams = request.getQueryParams();
            String hostAddress = request.getRemoteAddress().getAddress().getHostAddress();

            LogEntity logEntity = new LogEntity();
            logEntity.setPath(path.value());
            logEntity.setQueryParams(queryParams.toString());
            logEntity.setHostAddress(hostAddress);
            // 保存日志,并打印
            Mono<LogEntity> mono = logRepository.save(logEntity);
            mono.subscribe(entity -> log.info(entity.toString()));
        }
        return webFilterChain.filter(serverWebExchange);
    }

}

webflux中使用RouterFunction

/**
 * 请求路由配置 RouterFunction
 *
 * @author pilsy
 */
@Configuration
public class RouterConfig {

    private final ExchangeHandler exchangeHandler;

    private final AuthHandler authHandler;

    private final ErrorHandler errorHandler;

    private final ViewHandler viewHandler;

    @Autowired
    public RouterConfig(ExchangeHandler exchangeHandler, AuthHandler authHandler, ErrorHandler errorHandler, ViewHandler viewHandler) {
        this.exchangeHandler = exchangeHandler;
        this.errorHandler = errorHandler;
        this.viewHandler = viewHandler;
        this.authHandler = authHandler;
    }

    /**
     * 业务请求路由
     *
     * @return
     */
    @Bean
    public RouterFunction<ServerResponse> exchangeRouterFunction() {
        return RouterFunctions
                .route(POST("/bd-exchange/services/validatePeople.do").and(accept(APPLICATION_JSON)), exchangeHandler::validatePeople)
                .andRoute(POST("/bd-exchange/services/queryPeople.do").and(accept(APPLICATION_JSON)), exchangeHandler::queryPeople);
    }

    /**
     * 鉴权请求路由
     *
     * @return
     */
    @Bean
    public RouterFunction<ServerResponse> AuthRouterFunction() {
        return RouterFunctions
                .route(GET("/auth/error").and(accept(APPLICATION_JSON)), errorHandler::authError)
                .andRoute(GET("/auth/getPage").and(accept(APPLICATION_JSON)), authHandler::getPage)
                .andRoute(POST("/auth/save").and(accept(APPLICATION_JSON)), authHandler::save)
                .andRoute(GET("/auth/delete/{id}").and(accept(APPLICATION_JSON)), authHandler::delete)
                .andRoute(GET("/auth/getSecret").and(accept(APPLICATION_JSON)), authHandler::getSecret);
    }

    /**
     * view页面路由
     *
     * @return
     */
    @Bean
    public RouterFunction<ServerResponse> viewRoutesRegister() {
        return RouterFunctions
                .route(GET("/index"), viewHandler::loginPage)
                .andRoute(GET("/"), viewHandler::loginPage);
    }
}

webflux(使用netty为Web容器)中调整request请求长度限制

package com.gsoft.xc.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.embedded.netty.NettyReactiveWebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.stereotype.Component;

@Component
public class NettyConfiguration implements WebServerFactoryCustomizer<NettyReactiveWebServerFactory> {

    @Value("${server.max-initial-line-length:65536}")
    private int maxInitialLingLength;

    public void customize(NettyReactiveWebServerFactory container) {
        container.addServerCustomizers(
                httpServer -> httpServer.httpRequestDecoder(
                        httpRequestDecoderSpec -> httpRequestDecoderSpec.maxInitialLineLength(maxInitialLingLength)
                )
        );
    }

}

举报

相关推荐

0 条评论