Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot 为什么我的SpringWebFlux与SpringMVC负载测试吞吐量相同?_Spring Boot_Spring Mvc_Spring Webflux - Fatal编程技术网

Spring boot 为什么我的SpringWebFlux与SpringMVC负载测试吞吐量相同?

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

我们正在为我们的一个项目比较SpringWebFlux和SpringMVC的吞吐量

我们有服务1和服务2。Service1使用webclient准备内容并将其发布到service2。下面的代码来自service1,它将内容发布到service2

注意:服务2处理单个请求需要500毫秒

春季网络流量

@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);
}