SpringBoot如何切換成其它的嵌入式Servlet容器(Jetty和Undertow)
如何切換成其它的嵌入式Servlet容器(Jetty和Undertow)
SpringBoot默認使用的內置Servlet容器是Tomcat
然而 SpringBoot還支持其它的Servlet容器 默認的Tomcat隻是其中一種
SpringBoot還支持Jetty和Undertow
Jetty
適合用於長鏈接應用 例如聊天Undertow
是一個高性能非阻塞的Servlet容器 並發性能非常好 但不支持jsp
若要切換 隻需要在pom文件中排除自帶的Tomcat啟動器 再引入其它Servlet容器的啟動器即可
spring-boot-starter-web裡面引入瞭spring-boot-starter-tomcat 因此默認使用Tomcat
因此 隻需排除原先的Tomcat 再引入要添加的Servlet容器的依賴 即可:
切換成Jetty:
<!-- 引入Web模塊 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <!-- 排除tomcat容器 --> <exclusion> <artifactId>spring-boot-starter-tomcat</artifactId> <groupId>org.springframework.boot</groupId> </exclusion> </exclusions> </dependency> <!-- 引入其它的Servlet容器 --> <dependency> <artifactId>spring-boot-starter-jetty</artifactId> <groupId>org.springframework.boot</groupId> </dependency>
Jetty啟動成功
同理 切換成undertow:
<!-- 引入Web模塊 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <!-- 排除tomcat容器 --> <exclusion> <artifactId>spring-boot-starter-tomcat</artifactId> <groupId>org.springframework.boot</groupId> </exclusion> </exclusions> </dependency> <!-- 引入其它的Servlet容器 --> <dependency> <artifactId>spring-boot-starter-undertow</artifactId> <groupId>org.springframework.boot</groupId> </dependency>
Undertow啟動成功
SpringBoot web開發_嵌入式Servlet容器
1、切換嵌入式Servlet容器
1.1、SpringBoot支持的Servlet種類及其切換
1)默認支持的webServer:Tomcat、Jrtty、Undertow
2)切換服務器
<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>
1.2、原理
1)SpringBoot應用啟動發現當前是Web應用。web場景包-導入tomcat
2)web應用會創建一個web版的ioc容器 ServletWebServerApplicationContext
3)ServletWebServerApplicationContext 啟動的時候尋找 ServletWebServerFactory(Servlet 的web服務器工廠—> Servlet 的web服務器)
4)SpringBoot底層默認有很多的WebServer工廠;
TomcatServletWebServerFactory
JettyServletWebServerFactory
UndertowServletWebServerFactory
5)底層直接會有一個自動配置類。
ServletWebServerFactoryAutoConfiguration導入瞭ServletWebServerFactoryConfiguration(配置類)
6)ServletWebServerFactoryConfiguration 配置類 根據動態判斷系統中到底導入瞭那個Web服務器的包。(默認是web-starter導入tomcat包),容器中就有 TomcatServletWebServerFactory
7)TomcatServletWebServerFactory 創建出Tomcat服務器並啟動;TomcatWebServer 的構造器擁有初始化方法initialize—this.tomcat.start();
8)內嵌服務器,就是手動把啟動服務器的代碼調用(tomcat核心jar包存在)
2、定制Servlet容器
2.1、修改配置文件
通過對application.properties配置文件的設置,定制Servlet容器
#修改servlet容器 server.port=8000 #server.undertow.accesslog.dir=/tmp
2.2、實現 WebServerFactoryCustomizer
xxxxxCustomizer:定制化器,可以改變xxxx的默認規則
通過WebServerFactoryCustomizer修改 Servlet 容器的響應端口號:
import org.springframework.boot.web.server.WebServerFactoryCustomizer; import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory; import org.springframework.stereotype.Component; @Component public class CustomizationBean implements WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> { @Override public void customize(ConfigurableServletWebServerFactory server) { server.setPort(9000); } }
2.3、ConfigurableServletWebServerFactory
直接自定義 ConfigurableServletWebServerFactory 的接口實現類
public interface ConfigurableWebServerFactory extends WebServerFactory, ErrorPageRegistry { void setPort(int port); void setAddress(InetAddress address); void setErrorPages(Set<? extends ErrorPage> errorPages); void setSsl(Ssl ssl); void setSslStoreProvider(SslStoreProvider sslStoreProvider); void setHttp2(Http2 http2); void setCompression(Compression compression); void setServerHeader(String serverHeader); default void setShutdown(Shutdown shutdown) { } }
ConfigurableServletWebServerFactory 接口實現類(框架中默認實現類):
通過自定義 ConfigurableServletWebServerFactory 接口的實現類,即可定制Servlet容器
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- SpringBoot配置和切換Tomcat流程詳解
- 部署springboot項目到雲服務器的兩種方式(jar+war)
- SpringBoot嵌入式Servlet容器與定制化組件超詳細講解
- springboot項目如何打war包流程的方法
- 詳解如何更改SpringBoot TomCat運行方式