springboot webflux 简介
**********************
简介
基于reactor实现的异步非阻塞框架,较同步阻塞的MVC框架,可提升系统性能;
可使用MVC的注解操作,也可使用函数式编程;
支持传统的servlet容器,还可运行在支持nio的netty、undertow容器中
**********************
相关类与接口
ServerWebExchange:获取request、response、session
public interface ServerWebExchange {
String LOG_ID_ATTRIBUTE = ServerWebExchange.class.getName() + ".LOG_ID";
ServerHttpRequest getRequest(); //获取request
ServerHttpResponse getResponse(); //获取response
Map<String, Object> getAttributes(); //获取请求中的属性
@Nullable
default <T> T getAttribute(String name) {
return this.getAttributes().get(name);
}
default <T> T getRequiredAttribute(String name) {
T value = this.getAttribute(name);
Assert.notNull(value, () -> {
return "Required attribute '" + name + "' is missing";
});
return value;
}
default <T> T getAttributeOrDefault(String name, T defaultValue) {
return this.getAttributes().getOrDefault(name, defaultValue);
}
Mono<WebSession> getSession(); //获取webSession
<T extends Principal> Mono<T> getPrincipal(); //获取认证用户
Mono<MultiValueMap<String, String>> getFormData(); //获取表单参数
Mono<MultiValueMap<String, Part>> getMultipartData(); //获取表单multipart数据
LocaleContext getLocaleContext(); //获取国际化设置(Locale)
@Nullable
ApplicationContext getApplicationContext(); //获取应用上下文
boolean isNotModified();
boolean checkNotModified(Instant var1);
boolean checkNotModified(String var1);
boolean checkNotModified(@Nullable String var1, Instant var2);
String transformUrl(String var1);
void addUrlTransformer(Function<String, String> var1);
String getLogPrefix();
default ServerWebExchange.Builder mutate() {
return new DefaultServerWebExchangeBuilder(this);
}
public interface Builder { //构造ServeraWebExchange
ServerWebExchange.Builder request(Consumer<org.springframework.http.server.reactive.ServerHttpRequest.Builder> var1);
ServerWebExchange.Builder request(ServerHttpRequest var1); //设置请求
ServerWebExchange.Builder response(ServerHttpResponse var1); //设置响应
ServerWebExchange.Builder principal(Mono<Principal> var1); //设置认证用户
ServerWebExchange build(); //返回ServerWebExchange
}
}
**********************
ServerHttpRequest
ServerHttpRequest
public interface ServerHttpRequest extends HttpRequest, ReactiveHttpInputMessage {
String getId();
RequestPath getPath();
MultiValueMap<String, String> getQueryParams();
MultiValueMap<String, HttpCookie> getCookies();
@Nullable
default InetSocketAddress getLocalAddress() {
return null;
}
@Nullable
default InetSocketAddress getRemoteAddress() {
return null;
}
@Nullable
default SslInfo getSslInfo() {
return null;
}
default ServerHttpRequest.Builder mutate() {
return new DefaultServerHttpRequestBuilder(this);
}
public interface Builder {
ServerHttpRequest.Builder method(HttpMethod var1);
ServerHttpRequest.Builder uri(URI var1);
ServerHttpRequest.Builder path(String var1);
ServerHttpRequest.Builder contextPath(String var1);
ServerHttpRequest.Builder header(String var1, String... var2);
ServerHttpRequest.Builder headers(Consumer<HttpHeaders> var1);
ServerHttpRequest.Builder sslInfo(SslInfo var1);
ServerHttpRequest build();
}
}
HttpRequest
public interface HttpRequest extends HttpMessage {
@Nullable
default HttpMethod getMethod() {
return HttpMethod.resolve(this.getMethodValue()); //将请求方法转换为HttpMethod
}
String getMethodValue(); //获取请求方法
URI getURI(); //获取请求uri
}
HttpMessage
public interface HttpMessage {
HttpHeaders getHeaders(); //获取请求头
}
ReactiveHttpInputMessage
public interface ReactiveHttpInputMessage extends HttpMessage {
Flux<DataBuffer> getBody();
}
**********************
ServerHttpResponse
ServerHttpResponse
public interface ServerHttpResponse extends ReactiveHttpOutputMessage {
boolean setStatusCode(@Nullable HttpStatus var1);
@Nullable
HttpStatus getStatusCode();
default boolean setRawStatusCode(@Nullable Integer value) {
if (value == null) {
return this.setStatusCode((HttpStatus)null);
} else {
HttpStatus httpStatus = HttpStatus.resolve(value);
if (httpStatus == null) {
throw new IllegalStateException("Unresolvable HttpStatus for general ServerHttpResponse: " + value);
} else {
return this.setStatusCode(httpStatus);
}
}
}
@Nullable
default Integer getRawStatusCode() {
HttpStatus httpStatus = this.getStatusCode();
return httpStatus != null ? httpStatus.value() : null;
}
MultiValueMap<String, ResponseCookie> getCookies();
void addCookie(ResponseCookie var1);
}
ReactiveHttpOutputMessage
public interface ReactiveHttpOutputMessage extends HttpMessage {
DataBufferFactory bufferFactory();
void beforeCommit(Supplier<? extends Mono<Void>> var1);
boolean isCommitted();
Mono<Void> writeWith(Publisher<? extends DataBuffer> var1);
Mono<Void> writeAndFlushWith(Publisher<? extends Publisher<? extends DataBuffer>> var1);
Mono<Void> setComplete();
}
**********************
WebSession
webSession:存储应用session数据
public interface WebSession {
String getId();
Map<String, Object> getAttributes();
@Nullable
default <T> T getAttribute(String name) {
return this.getAttributes().get(name);
}
default <T> T getRequiredAttribute(String name) {
T value = this.getAttribute(name);
Assert.notNull(value, () -> {
return "Required attribute '" + name + "' is missing.";
});
return value;
}
default <T> T getAttributeOrDefault(String name, T defaultValue) {
return this.getAttributes().getOrDefault(name, defaultValue);
}
void start();
boolean isStarted();
Mono<Void> changeSessionId();
Mono<Void> invalidate();
Mono<Void> save();
boolean isExpired();
Instant getCreationTime();
Instant getLastAccessTime();
void setMaxIdleTime(Duration var1);
Duration getMaxIdleTime();
}
**********************
context信息
LocaleContext:国际化上下文
public interface LocaleContext {
@Nullable
Locale getLocale();
}
ApplicationContext:应用上下文
public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory, MessageSource, ApplicationEventPublisher, ResourcePatternResolver {
@Nullable
String getId();
String getApplicationName();
String getDisplayName();
long getStartupDate();
@Nullable
ApplicationContext getParent();
AutowireCapableBeanFactory getAutowireCapableBeanFactory() throws IllegalStateException;
}
**********************
函数式类与接口
**********************
RouterFunction
RouterFunction
@FunctionalInterface
public interface RouterFunction<T extends ServerResponse> {
Mono<HandlerFunction<T>> route(ServerRequest var1);
default RouterFunction<T> and(RouterFunction<T> other) {
return new SameComposedRouterFunction(this, other);
}
default RouterFunction<?> andOther(RouterFunction<?> other) {
return new DifferentComposedRouterFunction(this, other);
}
default RouterFunction<T> andRoute(RequestPredicate predicate, HandlerFunction<T> handlerFunction) {
return this.and(RouterFunctions.route(predicate, handlerFunction));
}
default RouterFunction<T> andNest(RequestPredicate predicate, RouterFunction<T> routerFunction) {
return this.and(RouterFunctions.nest(predicate, routerFunction));
}
default <S extends ServerResponse> RouterFunction<S> filter(HandlerFilterFunction<T, S> filterFunction) {
return new FilteredRouterFunction(this, filterFunction);
}
default void accept(Visitor visitor) {
visitor.unknown(this);
}
}
RouterFunctionBuilder:构造RouterFunction
class RouterFunctionBuilder implements Builder {
private List<RouterFunction<ServerResponse>> routerFunctions = new ArrayList();
private List<HandlerFilterFunction<ServerResponse, ServerResponse>> filterFunctions = new ArrayList();
RouterFunctionBuilder() {
}
public Builder add(RouterFunction<ServerResponse> routerFunction) {
Assert.notNull(routerFunction, "RouterFunction must not be null");
this.routerFunctions.add(routerFunction);
return this;
}
private Builder add(RequestPredicate predicate, HandlerFunction<ServerResponse> handlerFunction) {
this.routerFunctions.add(RouterFunctions.route(predicate, handlerFunction));
return this;
}
public Builder GET(String pattern, HandlerFunction<ServerResponse> handlerFunction) {
return this.add(RequestPredicates.GET(pattern), handlerFunction);
}
public Builder GET(String pattern, RequestPredicate predicate, HandlerFunction<ServerResponse> handlerFunction) {
return this.add(RequestPredicates.GET(pattern).and(predicate), handlerFunction);
}
public Builder HEAD(String pattern, HandlerFunction<ServerResponse> handlerFunction) {
return this.add(RequestPredicates.HEAD(pattern), handlerFunction);
}
public Builder HEAD(String pattern, RequestPredicate predicate, HandlerFunction<ServerResponse> handlerFunction) {
return this.add(RequestPredicates.HEAD(pattern).and(predicate), handlerFunction);
}
public Builder POST(String pattern, HandlerFunction<ServerResponse> handlerFunction) {
return this.add(RequestPredicates.POST(pattern), handlerFunction);
}
public Builder POST(String pattern, RequestPredicate predicate, HandlerFunction<ServerResponse> handlerFunction) {
return this.add(RequestPredicates.POST(pattern).and(predicate), handlerFunction);
}
public Builder PUT(String pattern, HandlerFunction<ServerResponse> handlerFunction) {
return this.add(RequestPredicates.PUT(pattern), handlerFunction);
}
public Builder PUT(String pattern, RequestPredicate predicate, HandlerFunction<ServerResponse> handlerFunction) {
return this.add(RequestPredicates.PUT(pattern).and(predicate), handlerFunction);
}
public Builder PATCH(String pattern, HandlerFunction<ServerResponse> handlerFunction) {
return this.add(RequestPredicates.PATCH(pattern), handlerFunction);
}
public Builder PATCH(String pattern, RequestPredicate predicate, HandlerFunction<ServerResponse> handlerFunction) {
return this.add(RequestPredicates.PATCH(pattern).and(predicate), handlerFunction)