Spring boot 为什么我的SpringWebFlux与SpringMVC负载测试吞吐量相同?
我们正在为我们的一个项目比较SpringWebFlux和SpringMVC的吞吐量 我们有服务1和服务2。Service1使用webclient准备内容并将其发布到service2。下面的代码来自service1,它将内容发布到service2 注意:服务2处理单个请求需要500毫秒 春季网络流量Spring boot 为什么我的SpringWebFlux与SpringMVC负载测试吞吐量相同?,spring-boot,spring-mvc,spring-webflux,Spring Boot,Spring Mvc,Spring Webflux,我们正在为我们的一个项目比较SpringWebFlux和SpringMVC的吞吐量 我们有服务1和服务2。Service1使用webclient准备内容并将其发布到service2。下面的代码来自service1,它将内容发布到service2 注意:服务2处理单个请求需要500毫秒 春季网络流量 @PutMapping(path = "/") public Mono<String> create() throws Exception { ClassPathResource
@PutMapping(path = "/")
public Mono<String> create() throws Exception {
ClassPathResource classpathResource = new ClassPathResource("/file.zip");
MultipartBodyBuilder multipartBodyBuilder = new MultipartBodyBuilder();
multipartBodyBuilder.part("key", "value");
multipartBodyBuilder.part("file", classpathResource, MediaType.APPLICATION_OCTET_STREAM);
MultiValueMap<String, HttpEntity<?>> multiValueMap = multipartBodyBuilder.build();
return WebClient.create()
.post()
.uri(uri)
.contentType(MediaType.MULTIPART_FORM_DATA)
.headers(httpHeaders -> httpHeaders.setBearerAuth(token))
.body(BodyInserters.fromMultipartData(multiValueMap))
.retrieve()
.bodyToMono(String.class);
}
@PutMapping(path=“/”)
public Mono create()引发异常{
ClassPathResource ClassPathResource=new ClassPathResource(“/file.zip”);
MultipartBodyBuilder MultipartBodyBuilder=新的MultipartBodyBuilder();
multipartBodyBuilder.零件(“键”、“值”);
multipartBodyBuilder.part(“文件”,classpathResource,MediaType.APPLICATION\u OCTET\u STREAM);
MultiValueMap我不会说您做错了什么,而是这个特定的用例不适合进行硬比较。两个端点都依赖于首先从磁盘加载一些内容,然后进行HTTP调用
这里的限制因素(我猜)是两个网络调用,虽然您使用WebFlux或MVC,但完成这两个调用需要相同的时间
WebFlux带来的好处是无阻塞行为,它可以更好地扩展负载下的资源
类似的问题在Quora上已经得到了很好的回答:我不会说你做错了什么,而是这个特定的用例不适合进行硬比较。两个端点都依赖于首先从磁盘加载一些东西,然后进行HTTP调用
这里的限制因素(我猜)是两个网络调用,虽然您使用WebFlux或MVC,但完成这两个调用需要相同的时间
WebFlux带来的好处是无阻塞行为,它可以更好地扩展负载下的资源
类似的问题在Quora上已经得到了很好的回答:WebFlux(或者说是被动的)与性能改进无关(除非您开始并行执行)但是关于更智能/更好的资源使用。您可以用更少的资源使用做更多的事情。允许使您更具可伸缩性。此外,您正在从文件系统加载东西(阻塞)并调用外部服务(并等待再次阻塞的结果)。因此,代码或多或少也在做同样的事情,只是阻塞行为。WebFlux(或者说是被动的)不是关于性能改进(除非你开始并行执行),而是关于更智能/更好的资源使用。你可以用更少的资源使用做更多的事情。允许你更具可伸缩性。此外,你正在从文件系统加载东西(阻塞)并调用外部服务(并等待结果再次阻塞)。因此,代码或多或少也在做同样的事情,只是阻塞行为。
@PutMapping(path = "/")
public ResponseEntity<String> create() throws Exception {
String response = null;
ClassPathResource classpathResource = new ClassPathResource("/file.zip");
try (InputStream zipInputStream = new BufferedInputStream(classpathResource.getInputStream())) {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
headers.setBearerAuth(token);
LinkedMultiValueMap<String, String> fileMap = new LinkedMultiValueMap<>();
ContentDisposition contentDisposition = ContentDisposition.builder("form-data").name("file").filename("file")
.build();
fileMap.add(HttpHeaders.CONTENT_DISPOSITION, contentDisposition.toString());
fileMap.add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_OCTET_STREAM_VALUE);
HttpEntity<InputStreamResource> sipEntity = new HttpEntity<InputStreamResource>(
new InputStreamResource(zipInputStream), fileMap);
LinkedMultiValueMap<String, String> formatfileMap = new LinkedMultiValueMap<>();
contentDisposition = ContentDisposition.builder("form-data").name("key")
.build();
formatfileMap.add(HttpHeaders.CONTENT_DISPOSITION, contentDisposition.toString());
HttpEntity<String> formatEntity = new HttpEntity<String>("value", formatfileMap);
LinkedMultiValueMap<String, Object> linkedMultiValueMap = new LinkedMultiValueMap<String, Object>();
linkedMultiValueMap.add("file", sipEntity);
linkedMultiValueMap.add("key", formatEntity);
HttpEntity<LinkedMultiValueMap<String, Object>> request = new HttpEntity<LinkedMultiValueMap<String, Object>>(
linkedMultiValueMap, headers);
response = restTemplate.postForObject(ingestUrl, request, String.class);
}
return new ResponseEntity<String>(response, HttpStatus.OK);
}