当前位置: 首页 > 知识库问答 >
问题:

当添加更多控制器时,Spring mvc性能显著下降

盛骏祥
2023-03-14

在我问我的问题之前,请注意实际数字不能代表性能。重要的是它们相对于彼此的价值,以及在运行之间得到一致的数字(当然是在一个小范围内)。

// Application.java
package hello;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
// HelloController1.java
package hello;

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

@RequestMapping("/v1/foo/{foo}/bar/{bar}/dog")
@RestController
public class HelloController1 {
    @RequestMapping(method = RequestMethod.GET)
    @ResponseBody
    public ResponseEntity<String> m() {
        return ResponseEntity.ok("dog");
    }
}
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>LATEST</version>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-tomcat</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jetty</artifactId>
        <version>LATEST</version>
    </dependency>
</dependencies>

我使用WRK对应用程序进行基准测试:

wrk -t 10 -c 10 -d 40s http://localhost:8080/v1/foo/foo/bar/bar/dog

我每秒得到45K的请求。

现在,我再添加4个控制器,除了类名和请求路径之外,与上面的控制器相同:

    null

路由路径匹配器似乎在每个请求的所有可用路由路径中进行线性搜索。对于每个路由路径,如果它没有模式,它只进行字典查找,一切都很好。但是,如果路径有参数(如我的示例中的{foo}{bar}),它必须转到antmatcher以将这些参数与实际路径匹配。匹配器进行从左到右的搜索,因此一旦发现不匹配的内容,它就会失败。由于我的所有路由都以相同的模式开始,所以它必须对每个路由做大量的工作,因此当添加更多的路由时,性能会变得更差。

顺便说一句,我愿意接受关于如何使这一性能更好的建议。我们的应用程序正因此受到影响。

共有1个答案

国俊艾
2023-03-14

在不更改Spring代码的情况下,您可以重构代码,使其只使用一个与所有有问题的模式匹配的RequestMapping,并自己编写一些perfomant算法,将调用委托给正确的类并传递参数。

您可以使用if树和一些regex启动算法,不要忘记编译regex并将其保存为常量,这样就不会有性能问题。

 类似资料:
  • 我正在从一个2.37GB的RDF数据集进行查询,其中包含大约1700万个三元组,并且还维护了该数据集的lucence索引。我尝试了jena-text模块的文本查询,它是在存储的lucene索引的基础上进行搜索的。但是它的性能相当慢,对于一个非常慢的搜索查询需要4秒或更多的时间。 然而,当我使用luncene索引查看器'luke'。索引似乎没有问题,当我从索引中搜索特定的术语时,搜索它需要几毫秒的时

  • 问题内容: 我正在构建一个带有angular + ionic的应用程序,该应用程序在底部使用一个经典的三按钮菜单,其中包含三个ion- tabs。用户单击选项卡时,该模板通过ui-router打开。 我有这样的状态: 在模板中,我执行以下操作: 我知道我可以在控制器中编写doSomething()函数,并在那里手动调用它。那给了我同样的问题。每当有人打开该视图时,我似乎都无法弄清楚如何调用doSo

  • 我正在尝试JavaFX,但仍然有很多可能是愚蠢的初学者问题。 我今天的问题如下: 我在Scene builder and Controller中创建了一个流程窗格,我想在其中添加一个右键单击选项,打开一个关联菜单。 通过场景生成器,我添加了OnContextMenuRequest函数并在控制器中定义了它。 为了检查,我在函数中添加了一个打印命令和一个对话框,效果很好。 然而,上下文菜单不起作用。。

  • 问题内容: 看来这个问题已经被问过几次了,但是没有正确的答案。 我的情况:我正在使用ajax(出于某种原因不使用角度路由模板)将模板(带有html和脚本)初始化为div。 index.html(主要) template.html(模板) 当我单击按钮时,它将文件加载到容器中,但是出现错误 错误:[ ng:areq ]参数’TempCtrl’不是函数,未定义 尽管已将其添加到应用控制器中。 我如何动

  • 我一直在尝试使用: 使用此链接: 但我有一个错误: 当我换成: 是工作。我能做些什么来和日期一起工作? 谢啦

  • 我有过 我通过这种方式传递profileJson: 但是我的配置文件Json对象具有所有空字段。我应该怎么做才能让Spring解析我的json?