小编tom*_*mas的帖子

性能 - Spring Boot - 服务器响应时间

我的弹簧启动应用程序有一个奇怪的行为:

  • 前端/客户 - 角6
  • 后端 - spring boot - spring MVC - 嵌入式tomcat - Linux

重新启动后端后,对控制器的第一次调用大约需要5秒,以下相同的请求只需要50ms.这在90%的情况下是可重现的,有时甚至第一次呼叫都很快.

我确定,问题是服务器上没有客户端.在浏览器上,我看到TTFB时间(到第一个字节的时间)增加到5秒.以下请求仅需要10毫秒的TTFB.

使用服务器上的监控工具(应用程序动态)我可以收集这种慢速服务器调用,在调用图上我可以看到:

org.apache.catalina.webresources.JarWarResourceSet:getArchiveEntries:117
Run Code Online (Sandbox Code Playgroud)

需要4916毫秒.我认为这是我的瓶颈.但我不知道如何解决它.

我已经尝试过的:

  • 从hikaricp切换到apache tomcat jdbc连接池
  • 升级后的弹簧靴从2.0.0升级到2.0.5
  • 将java升级到1.8.0_181
  • Propertie spring.jpa.tomcat.testOnBorrow = true
  • Propertie spring.jpa.tomcat.validationQuery =选择1

一切都没有影响服务器的延迟.

更新

由于战争文件被多次扫描,时间会丢失.

org.apache.catalina.webresources.CachedResource.validateResource正在检查我们是否有war文件(isPackedWarFile),并且此检查返回false.即使它是一个战争档案.对于这种行为不端,我有一个解决方法.我将tomcat.resource.cache-tt设置为较高的值.

但是现在org.apache.catalina.webresources.Cache.getResource有一个noCache方法.在此方法中,jar文件从缓存中排除.这就是为什么再次扫描war文件的原因.

扫描整个war文件大约需要5秒钟.而这个突破是世界休息的一站.并且这种扫描绝对是不必要的,因为war文件没有爆炸,因此其内容无法更改.

更新

如果我将war文件放入tomcat安装,一切都很快.嵌入式tomcat就是问题所在.

spring tomcat spring-mvc tomcat8 spring-boot

14
推荐指数
1
解决办法
3841
查看次数

Spring Boot 2 - AJP

我为我的spring boot 2项目添加了一个AJP连接器

 @Bean
 public ServletWebServerFactory servletContainer() {
        TomcatServletWebServerFactory tomcat = new 
   TomcatServletWebServerFactory() {
            @Override
            protected void postProcessContext(Context context) {
                SecurityConstraint securityConstraint = new SecurityConstraint();
                securityConstraint.setUserConstraint("CONFIDENTIAL");
                SecurityCollection collection = new SecurityCollection();
                collection.addPattern("/*");
                securityConstraint.addCollection(collection);
                context.addConstraint(securityConstraint);
            }
        };
        tomcat.addAdditionalTomcatConnectors(redirectConnector());

        return tomcat;
    }

    private Connector redirectConnector() {
        Connector connector = new Connector("AJP/1.3");
        connector.setScheme("http");
        connector.setPort(ajpPort);
        connector.setSecure(false);
        connector.setAllowTrace(false);
        return connector;
    }
Run Code Online (Sandbox Code Playgroud)

这很好用.我现在可以通过我的apache webserver访问我的spring启动应用程序了.但是现在,如果我运行我的春季启动应用程序,我无法直接访问我的春季启动应用程序.所以这个网址不再起作用了

HTTP://本地主机:13080 /在线/ showlogin米=测试

如果我禁用AJP连接器,URL将再次起作用.我尝试了以下内容

 private Connector redirectConnector2() {
    Connector connector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
    connector.setScheme("http");
    connector.setPort(13080);
    connector.setSecure(false);
    connector.setAllowTrace(false);
    return connector;
}
...
tomcat.addAdditionalTomcatConnectors(redirectConnector2()); …
Run Code Online (Sandbox Code Playgroud)

java spring spring-boot

2
推荐指数
2
解决办法
4313
查看次数

Spring - RestTemplate - 多部分文件

这个控制器工作正常

@Controller
public class FileUploadController {
....
@PostMapping("/convert")
public void fileUpload(@RequestParam("file") MultipartFile file, 
     RedirectAttributes redirectAttributes, HttpServletResponse response) {
Run Code Online (Sandbox Code Playgroud)

现在我想通过 RestTemplate 从另一个 spring 项目调用这个控制器。我尝试了很多东西,但注意工作。这是我最后的代码:

@Controller
public class FileController {
....
@PostMapping("/convert")
public void fileUpload(@RequestParam("file") MultipartFile file, RedirectAttributes redirectAttributes,
        HttpServletResponse response) throws Exception {


    ArrayList<HttpMessageConverter<?>> converters = new ArrayList<HttpMessageConverter<?>>(
            Arrays.asList(new FormHttpMessageConverter(),new MappingJackson2HttpMessageConverter(), new ResourceHttpMessageConverter()));

    RestTemplate template = restTemplate();

    template.setMessageConverters(converters);

    HttpHeaders header = new HttpHeaders();
    header.setContentType(MediaType.MULTIPART_FORM_DATA);

    MultiValueMap<String, Object> multipartRequest = new LinkedMultiValueMap<>();
    multipartRequest.add("file", file);

    HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(multipartRequest, header);

    template.postForObject("http://localhost:8080/convert", requestEntity, …
Run Code Online (Sandbox Code Playgroud)

java spring spring-mvc multipart

1
推荐指数
1
解决办法
2万
查看次数

标签 统计

spring ×3

java ×2

spring-boot ×2

spring-mvc ×2

multipart ×1

tomcat ×1

tomcat8 ×1