1.介紹
在SpringBoot的Web項(xiàng)目中,默認(rèn)采用的是內(nèi)置Tomcat,當(dāng)然也可以配置支持內(nèi)置的jetty,內(nèi)置有什么好處呢?
1. 方便微服務(wù)部署。
2. 方便項(xiàng)目啟動(dòng),不需要下載Tomcat或者Jetty
在目前的公司已經(jīng)把內(nèi)置的Jetty部署到了線上項(xiàng)目中,目前來(lái)說(shuō)并無(wú)太大問(wèn)題,內(nèi)置就算有一些性能損失,但是通過(guò)部署多臺(tái)機(jī)器,
其實(shí)也能夠很輕松的解決這樣的問(wèn)題,內(nèi)置容器之后其實(shí)是方便部署和遷移的。
1.1 優(yōu)化策略
針對(duì)目前的容器優(yōu)化,目前來(lái)說(shuō)沒(méi)有太多地方,需要考慮如下幾個(gè)點(diǎn)
- 線程數(shù)
- 超時(shí)時(shí)間
- jvm優(yōu)化
針對(duì)上述的優(yōu)化點(diǎn)來(lái)說(shuō),首先線程數(shù)是一個(gè)重點(diǎn),初始線程數(shù)和最大線程數(shù),初始線程數(shù)保障啟動(dòng)的時(shí)候,如果有大量用戶(hù)訪問(wèn),能夠很穩(wěn)定的接受請(qǐng)求, 而最大線程數(shù)量用來(lái)保證系統(tǒng)的穩(wěn)定性,而超時(shí)時(shí)間用來(lái)保障連接數(shù)不容易被壓垮,如果大批量的請(qǐng)求過(guò)來(lái),延遲比較高,不容易把線程打滿(mǎn)。這種情況在生產(chǎn)中是比較常見(jiàn)的
一旦網(wǎng)絡(luò)不穩(wěn)定,寧愿丟包也不愿意把機(jī)器壓垮。
jvm優(yōu)化一般來(lái)說(shuō)沒(méi)有太多場(chǎng)景,無(wú)非就是加大初始的堆,和最大限制堆,當(dāng)然也不是無(wú)限增大,根據(jù)的情況進(jìn)行調(diào)節(jié)
2. 快速開(kāi)始
3.1 Tomcat SSL
tomcat的SSL配置很簡(jiǎn)單,先通過(guò)JDK的方式生成.keystore,這種方式的證書(shū)一般來(lái)說(shuō)不太被認(rèn)可的,最好的方式去網(wǎng)上申請(qǐng),阿里云和騰訊云都可以免費(fèi)申請(qǐng), 這種方式配置出來(lái)的https,google瀏覽器會(huì)提示https不受認(rèn)證
1
|
keytool -genkey -alias tomcat -keyalg RSA |
application-tomcat.yaml
這塊對(duì)tomcat進(jìn)行了一個(gè)優(yōu)化配置,最大線程數(shù)是100,初始化線程是20,超時(shí)時(shí)間是5000ms
1
2
3
4
5
6
7
8
9
10
11
|
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 |
啟動(dòng)類(lèi)
啟動(dòng)類(lèi)這塊加上了一個(gè)httpConnector,為了支持https訪問(wèn)和http訪問(wèn)
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
|
@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 ); //設(shè)置最大線程數(shù) http11NioProtocol.setMaxThreads( 100 ); //設(shè)置初始線程數(shù) 最小空閑線程數(shù) http11NioProtocol.setMinSpareThreads( 20 ); //設(shè)置超時(shí) http11NioProtocol.setConnectionTimeout( 5000 ); return connector; } } |
上述就完成了https的配置,如果啟動(dòng)成功可以發(fā)現(xiàn)tomcat啟動(dòng)時(shí)候監(jiān)聽(tīng)了兩個(gè)端口
1
2
3
4
5
6
|
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 |
3.2 jvm優(yōu)化
這塊主要不是談如何優(yōu)化,jvm優(yōu)化是一個(gè)需要場(chǎng)景化的,沒(méi)有什么太多特定參數(shù),一般來(lái)說(shuō)在server端運(yùn)行都會(huì)指定如下參數(shù)
初始內(nèi)存和最大內(nèi)存基本會(huì)設(shè)置成一樣的,具體大小根據(jù)場(chǎng)景設(shè)置,我們線上環(huán)境一般都是4G,因?yàn)闄C(jī)器是16G的,-server是一個(gè)必須要用的參數(shù), 至于收集器這些使用默認(rèn)的就可以了,除非有特定需求
1
|
java -Xms4g -Xmx4g -Xmn768m -server -jar springboot-9-1.4.1.RELEASE.jar |
4 jetty配置
pom.xml
springboot增加了一個(gè)starter針對(duì)jetty的,給pom增加一個(gè)依賴(lài)即可
1
2
3
4
|
< dependency > < groupId >org.springframework.boot</ groupId > < artifactId >spring-boot-starter-jetty</ artifactId > </ dependency > |
下面是針對(duì)jetty的線程優(yōu)化,進(jìn)行了一個(gè)配置,當(dāng)然不配置也是可以使用的,在線上環(huán)境中最好配置一下,進(jìn)行優(yōu)化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
@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 ); }; } |
4.1 jetty https配置
application-jetty.yaml
https配置和tomcat的沒(méi)有太多差別,這塊是統(tǒng)一配置,SpringBoot做了一個(gè)抽象化而已
1
2
3
4
5
6
7
8
|
server: connection-timeout: 5000 ssl: key-store: classpath:.keystore key-store-type: JKS key-password: qq123456 key-alias: tomcat port: 8444 |
3 總結(jié)
一般來(lái)說(shuō)在生產(chǎn)環(huán)境中不會(huì)用tomcat配置https,因?yàn)樵谖覀兊纳a(chǎn)環(huán)境中,tomcat是一個(gè)統(tǒng)一的模板,只能夠改線程數(shù)。一般的做法都是通過(guò)
nginx配置https,配置方式也比較簡(jiǎn)單,而且也方便重啟
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。
原文鏈接:http://blog.csdn.net/king_is_everyone/article/details/53257815