我正在尝试了解Spring WebFlux.到目前为止我发现的东西都是内核反应,没有Servlet API,每个请求没有线程,HTTP 2,服务器推送,应用程序/流+ json.
但是Spring MVC中的异步调用有什么区别?我的意思是在Spring MVC中,当你返回Future,DefferedResult等时,你会在一个单独的线程中执行请求处理程序(控制器方法)中的逻辑,因此你也可以从保存线程池资源以便调度请求中受益.
那么请你强调与此相关的差异吗?为什么WebFlux在这里更好?
非常感谢你的时间!
在发送文件时,我收到一个字节数组。我总是遇到 webflux 接收数组的问题。抛出的错误如下:
org.springframework.core.io.buffer.DataBufferLimitException: Exceeded limit on max bytes to buffer : 262144
at org.springframework.core.io.buffer.LimitedDataBufferList.raiseLimitException(LimitedDataBufferList.java:101)
Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException
Run Code Online (Sandbox Code Playgroud)
你现在如何在 webflux 中解决这个问题?
我想使用Spring Security进行JWT身份验证.但它带有默认身份验证.我试图禁用它,但是这样做的旧方法 - 禁用它application.properties
- 在2.0中已弃用.
这是我试过的:
@Configuration
public class StackWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.httpBasic().disable();
// http.authorizeRequests().anyRequest().permitAll(); // Also doesn't work.
}
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能简单地禁用基本安全性?
更新
可能很高兴知道我不使用web mvc而是web flux.
spring-security spring-boot spring-security-rest spring-webflux
我正在尝试使用Spring 5 WebClient记录请求.你知道我怎么能实现这个目标吗?
(我使用的是Spring 5和Spring boot 2)
代码现在看起来像这样:
try {
return webClient.get().uri(url, urlParams).exchange().flatMap(response -> response.bodyToMono(Test.class))
.map(test -> xxx.set(test));
} catch (RestClientException e) {
log.error("Cannot get counter from opus", e);
throw e;
}
Run Code Online (Sandbox Code Playgroud) 我正在开发几个 spring-boot 应用程序,它们具有传统的每个请求线程模式。我们使用 Spring-boot-webflux 获取 WebClient 以在应用程序之间执行 RESTful 集成。因此,我们的应用程序设计要求我们在收到响应后立即阻止发布者。
最近,我们一直在讨论在我们的阻塞应用程序设计中是否使用反应式模块不必要地花费资源。据我了解,WebClient 通过分配工作线程来执行事件循环中的反应操作来利用事件循环。因此,使用 webclient.block()
会使原始线程休眠,同时分配另一个线程来执行 http 请求。与替代的 RestTemplate 相比,WebClient 似乎会通过使用事件循环花费额外的资源。
以这种方式部分引入 spring-webflux 会导致额外的资源消耗,同时不会对性能产生任何积极的贡献,无论是单线程还是并发,是否正确?我们并不期望将当前的堆栈升级为完全响应式,因此逐步升级的论点不适用。
java performance spring-boot spring-webflux spring-webclient
我是Spring Web-Flux的首发.我写了一个控制器如下:
@RestController
public class FirstController
{
@GetMapping("/first")
public Mono<String> getAllTweets()
{
return Mono.just("I am First Mono")
}
}
Run Code Online (Sandbox Code Playgroud)
我知道其中一个反应性好处是Backpressure,它可以平衡请求或响应率.我想知道如何在Spring Web-Flux中使用背压机制.
我试图了解什么时候我们会使用像 webflux 这样的反应式堆栈框架。我读过的文章似乎表明,当我们有许多阻塞调用时,我们将从反应式方法中受益。例如,如果我们有一个 Webhook 服务,需要调用客户端服务器来更新信息。
但我也在这里阅读https://docs.spring.io/spring-framework/docs/current/reference/html/web-reactive.html
评估应用程序的一个简单方法是检查其依赖性。如果您要使用阻塞持久性 API(JPA、JDBC)或网络 API,那么 Spring MVC 至少是通用架构的最佳选择。使用 Reactor 和 RxJava 在单独的线程上执行阻塞调用在技术上是可行的,但您不会充分利用非阻塞 Web 堆栈。
这似乎表明恰恰相反。我读到,如果你可以流式传输信息,反应式会更有用。例如,如果您有一个前端要求一个列表和一个反应源,它可以在信息可用时为您提供信息,而不是在信息完成后仅提供全部信息。
那么问题是我们什么时候应该在后端使用响应式?当我们有很多阻塞调用时我们应该使用它吗?例如,对客户端的 HTTP 调用我们需要等待响应。或者这到底是错误的用例?
我知道还有其他考虑因素,例如代码的复杂性。我知道反应式方法更难实现,但我在这里只是询问性能和可扩展性。
目前正在尝试使用Spring 5.0.0.RC2,Reactor 3.1.0.M2和Spring Boot 2.0.0.M2进行反应式编程.
想知道WebFlux和Reactor使用的并发和线程模型来正确编写应用程序并处理可变状态.
Reactor doc声明该库被认为是并发不可知的,并提到了Scheduler抽象.WebFlux文档不提供信息.
然而,当通过Spring Boot使用WebFlux时,定义了一个线程模型.
从我的实验中得到的是:
它是否正确 ?什么是WebFlux的并发和线程模型:例如,什么是默认线程池?
感谢您的信息
java multithreading reactive-programming project-reactor spring-webflux
据我了解,在 Spring WebFlux 反应器中
Mono<Void>
指的是 void Mono
Mono.empty()
指的是 void,因为在此之上调用任何内容都会给出空指针。
它们的用法有何不同?
由于有很多方法onErrorReturn
,例如onErrorResume
等,那么哪一个是正确的方法来处理 Reactive Spring WebFlux 中单声道和通量的错误?
spring-webflux ×10
java ×8
spring ×3
spring-boot ×3
backpressure ×1
logging ×1
performance ×1
reactive ×1
reactor ×1
spring-mvc ×1
webclient ×1