项目框架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)
)
);
}
}