SpringBoot(七)———Tomcat、Jetty优化以及Https配置
SpringBoot初始教程之Tomcat、Jetty优化以及Https配置(九)spring怎么读取yaml
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
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
启动类
启动类这块加上了⼀个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("http11.Http11NioProtocol");
Http11NioProtocol http11NioProtocol = (Http11NioProtocol) ProtocolHandler();
connector.setPort(8080);
//设置最⼤线程数
http11NioProtocol.setMaxThreads(100);
//设置初始线程数最⼩空闲线程数
http11NioProtocol.setMinSpareThreads(20);
//设置超时
http11NioProtocol.setConnectionTimeout(5000);
return connector;
}
}
上述就完成了https的配置,如果启动成功可以发现tomcat启动时候监听了两个端⼝
2016-11-21 10:53:15.247 INFO 42382 --- [ main] com.start.AppApplication : Starting Ap
pApplication on elemebjdeMacBook-Pro.local with PID 42382 (/Users/wangkang/code/SpringBoot-Learn/springboot-9/target/classes started 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.t.embedded.AnnotationConfigEmbeddedWebApplicationContext@489115ef: startup date [Mon No 2016-11-21 10:53:19.164 INFO 42382 --- [ main] TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8443 (https) 8080 (http)
2016-11-21 10:53:19.193 INFO 42382 --- [ main] o.StandardService : Starting service Tomcat
2016-11-21 10:53:19.194 INFO 42382 --- [ main] org.StandardEngine : Starting Servlet Engine: Apache Tomcat/8.5.
3.2 jvm优化
这块主要不是谈如何优化,jvm优化是⼀个需要场景化的,没有什么太多特定参数,⼀般来说在server端运⾏都会指定如下参数
初始内存和最⼤内存基本会设置成⼀样的,具体⼤⼩根据场景设置,我们线上环境⼀般都是4G,因为机器是16G的,-server是⼀个必须要⽤的参数,
⾄于收集器这些使⽤默认的就可以了,除⾮有特定需求
java -Xms4g -Xmx4g -Xmn768m -server -jar springboot-9-1.4.1.RELEASE.jar
4 jetty配置
springboot增加了⼀个starter针对jetty的,给pom增加⼀个依赖即可
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
下⾯是针对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 = Bean(QueuedThreadPool.class);
threadPool.setMaxThreads(100);
threadPool.setMinThreads(20);
};
}
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
3 总结
⼀般来说在⽣产环境中不会⽤tomcat配置https,因为在我们的⽣产环境中,tomcat是⼀个统⼀的模板,只能够改线程数。⼀般的做法都是通过nginx配置https,配置⽅式也⽐较简单,⽽且也⽅便重启
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论