成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

實戰!16條SpringBoot Web服務配置指南及優化技巧

開發 前端
對于反應堆棧應用程序,spring-boot-starter-webflux 通過加入 spring-boot-starter-reactor-netty 包含了 Reactor Netty,但你也可以使用 spring-boot-starter-tomcat、spring-boot-starter-jetty 或 spring-boot-starter-undertow 代替。

環境:SpringBoot3.2.5

1. 切換其它Web Server

對于 servlet 棧應用程序,spring-boot-starter-web 通過包含 spring-boot-starter-tomcat 將 Tomcat 包括在內,但也可以使用 spring-boot-starter-jetty 或 spring-boot-starter-undertow 代替。

對于反應堆棧應用程序,spring-boot-starter-webflux 通過加入 spring-boot-starter-reactor-netty 包含了 Reactor Netty,但你也可以使用 spring-boot-starter-tomcat、spring-boot-starter-jetty 或 spring-boot-starter-undertow 代替。

當切換到不同的 HTTP 服務器時,需要將默認依賴項替換為你需要的依賴項。為了幫助完成這一過程,Spring Boot 為每個受支持的 HTTP 服務器都提供了一個單獨的啟動器。

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
  <exclusions>
    <!-- 排除 Tomcat dependency -->
    <exclusion>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
    </exclusion>
  </exclusions>
</dependency>
<!-- 使用 Jetty 替換-->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-jetty</artifactId>
</dependency>

注:替換web server后在application.yml中的配置要進行相應的調整

2. 禁用Web Server

如果在類路徑包含啟動 Web 服務器所需的組件,Spring Boot 會自動啟動它。要禁用此行為,請在 application.yml 中配置 WebApplicationType,如下示例:

spring:
  main:
    web-application-type: "none"

這樣配置后,在實例化ApplicationContext容器對象時將不會實例化WebServer相關的容器對象。

3. 修改端口

默認為 8080,但可以使用 server.port 進行設置(例如,在 application.properties 中或作為系統屬性)。由于放寬了環境值的綁定,你還可以使用 SERVER_PORT(例如,作為操作系統環境變量)。

若要完全關閉 HTTP 端點,但仍要創建 WebApplicationContext,請使用 server.port=-1(這樣做有助于測試)。

4. 隨機分配端口

要掃描空閑端口(使用操作系統本地端口以防止沖突),請使用 server.port=0。

你還可以指定范圍內隨機生成端口

server:
  port: ${random.int[5000,10000]}

這里指定端口在5000~10000范圍內。

5. 運行時獲取 HTTP 端口

要想在運行時獲取端口號,你可以添加一下@Bean獲取

@Component
public class PackWebServerListener implements ApplicationListener<WebServerInitializedEvent> {
  @Override
  public void onApplicationEvent(WebServerInitializedEvent event) {
    System.out.printf("服務運行端口: %d%n", event.getWebServer().getPort()) ;
  }
}

使用 @SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT) 的測試也可以通過 @LocalServerPort 注解將實際端口注入字段,如下示例:

@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class MyWebIntegrationTests {


  @LocalServerPort
  int port ;
}

@LocalServerPort 是 @Value("${local.server.port}")的元注解。 不要嘗試在常規應用程序中注入端口。只能在測試環境下使用

6. 啟用HTTP響應壓縮

Jetty、Tomcat、Reactor Netty 和 Undertow 支持 HTTP 響應壓縮。可在 application.properties 中啟用,如下所示:

server:
  compression:
    enabled: true

默認情況下,響應長度必須至少達到 2048 字節才能執行壓縮。可以通過配置進行修改大小,如下所示:

server:
  compression:
    min-response-size: 1024

默認情況下,只有當響應的內容類型為以下類型之一時,才會對其進行壓縮:

  • text/html
  • text/xml
  • text/plain
  • text/css
  • text/javascript
  • application/javascript
  • application/json
  • application/xml

可通過如下屬性進行配置

server:
  compression:
    mime-types:
    - xxx

這里是數組類型。

7. 配置SSL

SSL 可通過設置各種 server.ssl.* 屬性進行聲明式配置,通常在 application.properties 或 application.yaml 中設置。下面的示例展示了使用 Java KeyStore 文件設置 SSL 屬性:

server:
  port: 8443
  ssl:
    key-store: "classpath:pack.keystore"
    key-store-password: "xxxooo"
    key-password: "xxxooo"

密鑰庫可通過如下方式生成

keytool -genkey -alias pack -keyalg RSA -keystore f:/pack.keystore

使用上例這樣的配置意味著應用程序不再支持 8080 端口的純 HTTP 連接器。Spring Boot 不支持通過 application.properties 同時配置 HTTP 連接器和 HTTPS 連接器。

8. 配置HTTP/2

可以使用 server.http2.enabled 配置屬性在 Spring Boot 應用程序中啟用 HTTP/2 支持。h2(HTTP/2 over TLS)和 h2c(HTTP/2 over TCP)均受支持。要使用 h2,還必須啟用 SSL。未啟用 SSL 時,將使用 h2c。例如,當應用程序在執行 TLS 終止的代理服務器后面運行時,就可能需要使用 h2c。

使用 Tomcat 的 HTTP/2

Spring Boot 默認隨附 Tomcat 10.1.x,它支持開箱即用的 h2c 和 h2。另外,如果主機操作系統安裝了 libtcnative 庫及其依賴項,也可以使用 libtcnative 來支持 h2。

如果 JVM 庫路徑中還沒有庫目錄,則必須提供該庫目錄。可以使用 JVM 參數(如 -Djava.library.path=/usr/local/opt/tomcat-native/lib)來這樣做。 

9. 配置Web Server

一般來說,你應該首先考慮使用許多可用配置的key(即在配置文件中進行的配置)。server.* 命名空間在此非常有用,它包括 server.tomcat.*、server.jetty.* 等命名空間,用于實現特定于服務器的功能。當,相應server.*下沒有你需要的配置,那么你可以通過如下編程方式進行自定義配置

@Component
public class PackTomcatWebServerCustomizer implements WebServerFactoryCustomizer<TomcatServletWebServerFactory> {


  @Override
  public void customize(TomcatServletWebServerFactory factory) {
    // TODO
  }
}

通過該種方式進行針對性的配置。

10. 添加Servlet,Filter或Listener

在基于 Servlet 棧應用程序中,有兩種方法可以在應用程序中添加 Servlet、Filter、ServletContextListener 和 Servlet API 支持的其他監聽器:

  • 定義Servlet, Filter, Listener類型的Bean對象

對于Filter和Servlet,你可以分別注冊FilterRegistrationBean 和 ServletRegistrationBean 來進行更多的配置選項。

@Bean
public FilterRegistrationBean<CustomFilter> registration(CustomFilter filter) {
    FilterRegistrationBean<CustomFilter> registration = new FilterRegistrationBean<>(filter) ;
    registration.setUrlPatterns(Arrays.asList("/**")) ;
    // ...
    return registration;
}
  • 通過掃描的機制自動注冊

分別使用@WebServlet, @WebFilter, and @WebListener注解標注對應的類,然后在配置類上添加@ServletComponentScan注解。

11. 日志配置

訪問日志可通過 Tomcat、Undertow 和 Jetty 各自的命名空間進行配置。

Tomcat

server:
  tomcat:
    basedir: "my-tomcat"
    accesslog:
      enabled: true
      pattern: "%t %a %r %s (%D microseconds)"

Undertow

server:
  undertow:
    accesslog:
      enabled: true
      pattern: "%t %a %r %s (%D milliseconds)"
    options:
      server:
        record-request-start-time: true

請注意,除了啟用訪問日志和配置其模式外,還啟用了記錄請求開始時間。在訪問日志模式中包含響應時間 (%D) 時需要這樣做。日志存儲在相對于應用程序工作目錄的日志目錄中。可以通過設置 server.undertow.accesslog.dir 屬性來自定義該位置。

Jetty

server:
  jetty:
    accesslog:
      enabled: true
      filename: "/var/log/jetty-access.log"

默認情況下,日志會重定向到 System.err。 

12. 自定義Tomcat代理配置

如果你使用Tomcat,還可以進一步配置用于攜帶“轉發”信息的頭名稱,如下所示:

server:
  tomcat:
    remoteip:
      remote-ip-header: "x-your-remote-ip-header"
      protocol-header: "x-your-protocol-header"

Tomcat 還配置了一個正則表達式,用于匹配需要信任的內部代理。有關其默認值,請查看server.tomcat.remoteip.internal-proxies 。你可以通過在 application.properties 中添加一個條目來自定義閥門的配置,如下所示:

server:
  tomcat:
    remoteip:
      internal-proxies: "192\\.168\\.\\d{1,3}\\.\\d{1,3}"

13. Tomcat注冊多個Connector

@Configuration(proxyBeanMethods = false)
public class MyTomcatConfiguration {


  @Bean
  public WebServerFactoryCustomizer<TomcatServletWebServerFactory> connectorCustomizer() {
    return (tomcat) -> tomcat.addAdditionalTomcatConnectors(createConnector());
  }
  private Connector createConnector() {
    Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
    connector.setPort(8081) ;
    return connector ;
  }
}

這里又開啟了一個8081端口。

14. 開啟Tomcat MBean

嵌入式 Tomcat 的 MBean 注冊表默認是禁用的。這最大限度地減少了 Tomcat 的內存占用。你可以通過如下配置開啟

server:
  tomcat:
    mbeanregistry:
      enabled: true

15. Undertow開啟多個Listener

向 UndertowServletWebServerFactory 添加一個 UndertowBuilderCustomizer,并向 Builder 添加一個監聽器,如下所示:

@Configuration(proxyBeanMethods = false)
public class MyUndertowConfiguration {


  @Bean
  public WebServerFactoryCustomizer<UndertowServletWebServerFactory> undertowListenerCustomizer() {
    return (factory) -> factory.addBuilderCustomizers(this::addHttpListener);
  }
  private Builder addHttpListener(Builder builder) {
    return builder.addHttpListener(8080, "0.0.0.0") ;
  }
}

16. 使用@ServerEndpoint創建WebSocket端點

如果要在嵌入式容器的 Spring Boot 應用程序中使用 @ServerEndpoint,則必須聲明一個 ServerEndpointExporter @Bean,如下所示:

@Configuration(proxyBeanMethods = false)
public class MyWebSocketConfiguration {


  @Bean
  public ServerEndpointExporter serverEndpointExporter() {
    return new ServerEndpointExporter();
  }
}

上例中顯示的 Bean 會向底層 WebSocket 容器注冊任何帶有 @ServerEndpoint 注釋的 Bean。當部署到獨立的 servlet 容器時,這一角色由 servlet 容器初始化器執行,而不需要 ServerEndpointExporter Bean。

責任編輯:武曉燕 來源: Spring全家桶實戰案例源碼
相關推薦

2022-01-07 06:09:23

Web性能優化

2023-01-26 01:33:09

web性能優化

2022-05-11 12:15:50

scriptweb性能

2019-08-14 15:40:05

Web圖片優化前端

2022-04-06 11:18:46

SpringBoot代碼實踐

2009-02-18 11:24:24

優化加速PHP

2020-10-26 15:01:02

Spring Boot源碼參數

2011-08-29 09:33:48

2018-01-01 20:56:43

AndroidUIAPI

2009-09-18 14:02:09

Nis服務器

2009-12-24 16:15:17

2024-08-27 09:09:49

Web系統JSP

2025-05-26 08:40:00

Linux系統SWAP

2021-01-28 10:04:40

JavaScript開發技術

2010-06-07 09:08:38

Cacti配置

2011-04-01 10:49:42

vSphereWeb Access管

2020-01-16 18:30:07

技術SQL優化

2017-02-05 17:33:59

前端優化Web性能

2022-04-27 10:53:34

web優化性能

2020-05-26 15:05:30

Spark安裝環境
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 综合久久一区 | 日日夜夜精品免费视频 | 欧美日韩精品在线一区 | 亚洲成人综合在线 | 色综合99| 亚洲网站在线观看 | 欧美视频第三页 | 日本一区二区高清不卡 | 国产精品欧美一区喷水 | av网站免费看 | 精品在线一区 | 日本免费一区二区三区 | a久久 | 亚洲欧美一区二区三区在线 | 一区二区三区中文字幕 | 有码在线 | 国产精品日韩欧美一区二区三区 | 波多野结衣中文字幕一区二区三区 | 污片在线观看 | 午夜精品在线观看 | 亚洲一区网站 | 一区二区三区在线观看视频 | 中文字幕一区二区三区四区五区 | 免费国产网站 | 国产色婷婷| 亚洲一区自拍 | 最新免费av网站 | 自拍第1页| 亚洲午夜视频 | 在线免费观看毛片 | 久婷婷 | 精品国产欧美日韩不卡在线观看 | 青春草91| 欧美精品久久久 | 国产精品精品久久久 | 亚洲不卡一| 欧美成人a∨高清免费观看 老司机午夜性大片 | 久久久999免费视频 999久久久久久久久6666 | 久久久久久999 | 成人三级视频在线观看 | aaaaaaa片毛片免费观看 |