zoukankan      html  css  js  c++  java
  • 自定义 Web 容器

    如果你的项目并发量比较高,想要修改最大线程数、最大连接数等配置信息,可以通过自定义Web 容器的方式,代码如下所示。

    @SpringBootApplication(proxyBeanMethods = false)
    
    public class App implements WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> {
    
        public static void main(String[] args) {
    
            SpringApplication.run(PetClinicApplication.class, args);
    
        }
    
        @Override
    
        public void customize(ConfigurableServletWebServerFactory factory) {
    
            TomcatServletWebServerFactory f = (TomcatServletWebServerFactory) factory;
    
            f.setProtocol("org.apache.coyote.http11.Http11Nio2Protocol");
    
    
    
            f.addConnectorCustomizers(c -> {
    
                Http11NioProtocol protocol = (Http11NioProtocol) c.getProtocolHandler();
    
                protocol.setMaxConnections(200);
    
                protocol.setMaxThreads(200);
    
                protocol.setSelectorTimeout(3000);
    
                protocol.setSessionTimeout(3000);
    
                protocol.setConnectionTimeout(3000);
    
            });
    
        }
    
    }
    

      

    注意上面的代码,我们设置了它的协议为 org.apache.coyote.http11.Http11Nio2Protocol,意思就是开启了 Nio2。这个参数在 Tomcat 8.0之后才有,开启之后会增加一部分性能。
    对比如下(测试项目代码见 spring-petclinic-main):https://gitee.com/xjjdog/tuning-lagou-res/tree/master/tuning-020/spring-petclinic-main

    默认。

    [root@localhost wrk2-master]# ./wrk -t2 -c100 -d30s -R2000 http://172.16.1.57:8080/owners?lastName=
    
    Running 30s test @ http://172.16.1.57:8080/owners?lastName=
    
      2 threads and 100 connections
    
      Thread calibration: mean lat.: 4588.131ms, rate sampling interval: 16277ms
    
      Thread calibration: mean lat.: 4647.927ms, rate sampling interval: 16285ms
    
      Thread Stats   Avg      Stdev     Max   +/- Stdev
    
        Latency    16.49s     4.98s   27.34s    63.90%
    
        Req/Sec   106.50      1.50   108.00    100.00%
    
      6471 requests in 30.03s, 39.31MB read
    
      Socket errors: connect 0, read 0, write 0, timeout 60
    
    Requests/sec:    215.51
    
    Transfer/sec:      1.31MB
    

      

    [root@localhost wrk2-master]# ./wrk -t2 -c100 -d30s -R2000 http://172.16.1.57:8080/owners?lastName=
    
    Running 30s test @ http://172.16.1.57:8080/owners?lastName=
    
      2 threads and 100 connections
    
      Thread calibration: mean lat.: 4358.805ms, rate sampling interval: 15835ms
    
      Thread calibration: mean lat.: 4622.087ms, rate sampling interval: 16293ms
    
      Thread Stats   Avg      Stdev     Max   +/- Stdev
    
        Latency    17.47s     4.98s   26.90s    57.69%
    
        Req/Sec   125.50      2.50   128.00    100.00%
    
      7469 requests in 30.04s, 45.38MB read
    
      Socket errors: connect 0, read 0, write 0, timeout 4
    
    Requests/sec:    248.64
    
    Transfer/sec:      1.51MB
    

      你甚至可以将 tomcat 替换成 undertow。undertow 也是一个 Web 容器,更加轻量级一些,占用的内存更少,启动的守护进程也更少,更改方式如下:

    <dependency>
    
          <groupId>org.springframework.boot</groupId>
    
          <artifactId>spring-boot-starter-web</artifactId>
    
          <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-undertow</artifactId>
    
        </dependency>
    

      

  • 相关阅读:
    Redis之String
    代码质量管理工具——SonarQube
    XML文件(2)--使用DOM4J示例
    XML文件(1)--使用DOM示例
    Maven之构件
    使用JS,获取URL中指定参数的值
    jQuery导入Eclipse后报错解决方法
    关于MySQL存储过程中遇到的一个错误
    学习MySQL之数据类型(四)
    jmeter直连数据库【转】
  • 原文地址:https://www.cnblogs.com/lzmrex/p/14290579.html
Copyright © 2011-2022 走看看