溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

詳解SpringBoot初始教程之Tomcat、Https配置以及Jetty優(yōu)化

發(fā)布時間:2020-10-06 14:42:03 來源:腳本之家 閱讀:269 作者:尊少 欄目:編程語言

1.介紹

在SpringBoot的Web項目中,默認(rèn)采用的是內(nèi)置Tomcat,當(dāng)然也可以配置支持內(nèi)置的jetty,內(nèi)置有什么好處呢?

1. 方便微服務(wù)部署。
2. 方便項目啟動,不需要下載Tomcat或者Jetty

在目前的公司已經(jīng)把內(nèi)置的Jetty部署到了線上項目中,目前來說并無太大問題,內(nèi)置就算有一些性能損失,但是通過部署多臺機器,

其實也能夠很輕松的解決這樣的問題,內(nèi)置容器之后其實是方便部署和遷移的。

1.1 優(yōu)化策略

針對目前的容器優(yōu)化,目前來說沒有太多地方,需要考慮如下幾個點

  • 線程數(shù)
  • 超時時間
  • jvm優(yōu)化

針對上述的優(yōu)化點來說,首先線程數(shù)是一個重點,初始線程數(shù)和最大線程數(shù),初始線程數(shù)保障啟動的時候,如果有大量用戶訪問,能夠很穩(wěn)定的接受請求, 而最大線程數(shù)量用來保證系統(tǒng)的穩(wěn)定性,而超時時間用來保障連接數(shù)不容易被壓垮,如果大批量的請求過來,延遲比較高,不容易把線程打滿。這種情況在生產(chǎn)中是比較常見的

一旦網(wǎng)絡(luò)不穩(wěn)定,寧愿丟包也不愿意把機器壓垮。

jvm優(yōu)化一般來說沒有太多場景,無非就是加大初始的堆,和最大限制堆,當(dāng)然也不是無限增大,根據(jù)的情況進行調(diào)節(jié)

2. 快速開始

3.1 Tomcat SSL

tomcat的SSL配置很簡單,先通過JDK的方式生成.keystore,這種方式的證書一般來說不太被認(rèn)可的,最好的方式去網(wǎng)上申請,阿里云和騰訊云都可以免費申請, 這種方式配置出來的https,google瀏覽器會提示https不受認(rèn)證

keytool -genkey -alias tomcat -keyalg RSA

application-tomcat.yaml

這塊對tomcat進行了一個優(yōu)化配置,最大線程數(shù)是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("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è)置超時
   http11NioProtocol.setConnectionTimeout(5000);
   return connector;
  }

 }

上述就完成了https的配置,如果啟動成功可以發(fā)現(xiàn)tomcat啟動時候監(jiān)聽了兩個端口

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)化是一個需要場景化的,沒有什么太多特定參數(shù),一般來說在server端運行都會指定如下參數(shù)
初始內(nèi)存和最大內(nèi)存基本會設(shè)置成一樣的,具體大小根據(jù)場景設(shè)置,我們線上環(huán)境一般都是4G,因為機器是16G的,-server是一個必須要用的參數(shù), 至于收集器這些使用默認(rèn)的就可以了,除非有特定需求

java -Xms4g -Xmx4g -Xmn768m -server -jar springboot-9-1.4.1.RELEASE.jar

4 jetty配置

pom.xml

springboot增加了一個starter針對jetty的,給pom增加一個依賴即可

  <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-jetty</artifactId>
  </dependency>

下面是針對jetty的線程優(yōu)化,進行了一個配置,當(dāng)然不配置也是可以使用的,在線上環(huán)境中最好配置一下,進行優(yōu)化

@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的沒有太多差別,這塊是統(tǒng)一配置,SpringBoot做了一個抽象化而已

server:
 connection-timeout: 5000
 ssl:
 key-store: classpath:.keystore
 key-store-type: JKS
 key-password: qq123456
 key-alias: tomcat
 port: 8444

3 總結(jié)

一般來說在生產(chǎn)環(huán)境中不會用tomcat配置https,因為在我們的生產(chǎn)環(huán)境中,tomcat是一個統(tǒng)一的模板,只能夠改線程數(shù)。一般的做法都是通過

nginx配置https,配置方式也比較簡單,而且也方便重啟

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI