SpringBoot初始教程之Tomcat、Jetty优化以及Https配置(九)

SpringBoot初始教程之Tomcat、Jetty优化以及Https配置(九)

http://blog.csdn.net/king_is_everyone/article/details/53257815

1.介绍

在SpringBoot的Web项目中,默认采用的是内置Tomcat,当然也可以配置支持内置的jetty,内置有什么好处呢? 
1. 方便微服务部署。 
2. 方便项目启动,不需要下载Tomcat或者Jetty

在目前的公司已经把内置的Jetty部署到了线上项目中,目前来说并无太大问题,内置就算有一些性能损失,但是通过部署多台机器, 
其实也能够很轻松的解决这样的问题,内置容器之后其实是方便部署和迁移的。

1.1 优化策略

针对目前的容器优化,目前来说没有太多地方,需要考虑如下几个点

  1. 线程数
  2. 超时时间
  3. jvm优化

针对上述的优化点来说,首先线程数是一个重点,初始线程数和最大线程数,初始线程数保障启动的时候,如果有大量用户访问,能够很稳定的接受请求, 
而最大线程数量用来保证系统的稳定性,而超时时间用来保障连接数不容易被压垮,如果大批量的请求过来,延迟比较高,不容易把线程打满。这种情况在生产中是比较常见的 
一旦网络不稳定,宁愿丢包也不愿意把机器压垮。 
jvm优化一般来说没有太多场景,无非就是加大初始的堆,和最大限制堆,当然也不是无限增大,根据的情况进行调节

2. 快速开始

3.1 Tomcat SSL

tomcat的SSL配置很简单,先通过JDK的方式生成.keystore,这种方式的证书一般来说不太被认可的,最好的方式去网上申请,阿里云和腾讯云都可以免费申请, 
这种方式配置出来的https,google浏览器会提示https不受认证


    keytool -genkey -alias tomcat -keyalg RSA
  • 1
  • 2
  • 3
application-tomcat.yaml

这块对tomcat进行了一个优化配置,最大线程数是100,初始化线程是20,超时时间是5000ms


    server:
      tomcat:
        max-threads: 100
        min-spare-threads: 20
      connection-timeout: 5000
      ssl:
        key-store: classpath:.keystore
        key-store-type: JKS
        key-password: qq123456
        key-alias: tomcat
      port: 8443
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
启动类

启动类这块加上了一个httpConnector,为了支持https访问和http访问


    @SpringBootApplication
    public class AppApplication {
        public static void main(String args[]) {
            SpringApplication.run(AppApplication.class, args);
        }

        @Bean
        public EmbeddedServletContainerFactory tomcatEmbeddedServletContainerFactory() throws IOException {
            TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory();
            tomcat.addAdditionalTomcatConnectors(httpConnector());
            return tomcat;
        }

        public Connector httpConnector() throws IOException {
            Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
            Http11NioProtocol http11NioProtocol = (Http11NioProtocol) connector.getProtocolHandler();
            connector.setPort(8080);
            //设置最大线程数
            http11NioProtocol.setMaxThreads(100);
            //设置初始线程数  最小空闲线程数
            http11NioProtocol.setMinSpareThreads(20);
            //设置超时
            http11NioProtocol.setConnectionTimeout(5000);
            return connector;
        }

    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
上述就完成了https的配置,如果启动成功可以发现tomcat启动时候监听了两个端口

2016-11-21 10:53:15.247  INFO 42382 --- [           main] com.start.AppApplication                 : Starting AppApplication on elemebjdeMacBook-Pro.local with PID 42382 (/Users/wangkang/code/SpringBoot-Learn/springboot-9/target/classes started by wangkang in /Users/wangkang/code/SpringBoot-Learn)
2016-11-21 10:53:15.251  INFO 42382 --- [           main] com.start.AppApplication                 : No active profile set, falling back to default profiles: default
2016-11-21 10:53:15.426  INFO 42382 --- [           main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@489115ef: startup date [Mon Nov 21 10:53:15 CST 2016]; root of context hierarchy
2016-11-21 10:53:19.164  INFO 42382 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8443 (https) 8080 (http)
2016-11-21 10:53:19.193  INFO 42382 --- [           main] o.apache.catalina.core.StandardService   : Starting service Tomcat
2016-11-21 10:53:19.194  INFO 42382 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/8.5.5
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

3.2 jvm优化

这块主要不是谈如何优化,jvm优化是一个需要场景化的,没有什么太多特定参数,一般来说在server端运行都会指定如下参数 
初始内存和最大内存基本会设置成一样的,具体大小根据场景设置,我们线上环境一般都是4G,因为机器是16G的,-server是一个必须要用的参数, 
至于收集器这些使用默认的就可以了,除非有特定需求


java -Xms4g -Xmx4g -Xmn768m -server -jar springboot-9-1.4.1.RELEASE.jar
  • 1
  • 2
  • 3

4 jetty配置

pom.xml

springboot增加了一个starter针对jetty的,给pom增加一个依赖即可


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jetty</artifactId>
        </dependency>
  • 1
  • 2
  • 3
  • 4
  • 5

下面是针对jetty的线程优化,进行了一个配置,当然不配置也是可以使用的,在线上环境中最好配置一下,进行优化


        @Profile("jetty")
        @Bean
        public JettyEmbeddedServletContainerFactory jettyEmbeddedServletContainerFactory(
                JettyServerCustomizer jettyServerCustomizer) {
            JettyEmbeddedServletContainerFactory factory = new JettyEmbeddedServletContainerFactory();
            factory.addServerCustomizers(jettyServerCustomizer);
            return factory;
        }


        @Bean
        public JettyServerCustomizer jettyServerCustomizer() {
            return server -> {
                // Tweak the connection config used by Jetty to handle incoming HTTP
                // connections
                final QueuedThreadPool threadPool = server.getBean(QueuedThreadPool.class);
                threadPool.setMaxThreads(100);
                threadPool.setMinThreads(20);
            };
        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
4.1 jetty https配置
application-jetty.yaml

https配置和tomcat的没有太多差别,这块是统一配置,SpringBoot做了一个抽象化而已

server:
  connection-timeout: 5000
  ssl:
    key-store: classpath:.keystore
    key-store-type: JKS
    key-password: qq123456
    key-alias: tomcat
  port: 8444
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

3 总结

一般来说在生产环境中不会用tomcat配置https,因为在我们的生产环境中,tomcat是一个统一的模板,只能够改线程数。一般的做法都是通过 

nginx配置https,配置方式也比较简单,而且也方便重启


Spring Boot支持Jetty服务器,支持http、https(ssl、tls)双协议,支持双端口

http://blog.csdn.net/typa01_kk/article/details/77100278


Spring boot Jetty 服务器相比tomcat的一些不足

http://doc.okbase.net/zhuguowei/archive/188910.html

springboot或者jetty等启动服务器后,如何去停止这个服务

https://www.cnblogs.com/renboqie/p/6083663.html

使用Gradle构建SpringBoot工程系列:第六篇:SpringBoot 替换Tomcat为Jetty或UnderTow

http://blog.csdn.net/u014749862/article/details/73825174









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值