原文鏈接:https:///articles/introducing-servlet-40-server-push-using-spring-bo 作者: Naveen Katiyar 譯者:Darren Luo
想要了解有關(guān)新 Servlet 4.0 的更多信息,?查看這篇文章,,了解更多關(guān)于在 Spring Boot 2.1 中使用服務(wù)器推送的信息,。 在本文,,我們將討論服務(wù)器推送技術(shù),,它實(shí)際上是 HTTP/2 規(guī)范的一部分,。 因?yàn)?HTTP/2,,Servlet 最重要的特性是服務(wù)器推送功能的實(shí)現(xiàn)。該技術(shù)背后的概念:如果客戶端/瀏覽器請(qǐng)求某個(gè)資源,,服務(wù)器預(yù)先假設(shè)其他關(guān)聯(lián)資源也可能很快被請(qǐng)求,。由于這個(gè)假設(shè),它在它們實(shí)際需要之前將它們推入緩存(稱為“緩存推送”),。例如,,很可能在網(wǎng)頁加載時(shí),它最終可能請(qǐng)求 CSS 文件或其他圖片,。同時(shí)服務(wù)器主動(dòng)開始推送這些資源的字節(jié),,不再需要客戶端發(fā)出明確的請(qǐng)求。 Servlet 4.0 是 Java EE 8 的一部分,,因此,,它需要 Java 9 以及 Spring 5.x。Tomcat 支持 HTTP/2,,但是它必須配置為使用 TLS,。Tomcat 9 只能在 Spring Boot 2.1.0 中使用,,但是它尚未發(fā)布,我們需要在本文中使用里程碑版本,。 在 Spring Boot 中開啟 TLS 支持只是 application.properties 文件中的幾個(gè)屬性的問題,。只需使用以下代碼來啟用它: #enable/diable https
server.ssl.enabled=true
server.ssl.key-store: classpath:keystore.jks
server.ssl.key-store-password: tomcatssl
server.ssl.keyStoreType: JKS
server.ssl.keyAlias: tomcatssl
server.port=8443
假如李不知道如何生成 keystore.jks,,清點(diǎn)擊此鏈接,。 要在 Tomcat 中啟用 HTTP/2 支持,需要添加以下屬性,。 server.http2.enabled=true
在使用 TLS 配置我們的服務(wù)器之后,,我們很高興公開我們的 endpoint,,其由 HTTP/2 技術(shù)提供支持。 @GetMapping(path = '/serviceWithPush')
public String serviceWithPush(HttpServletRequest request,PushBuilder pushBuilder) {
if (null != pushBuilder) {
pushBuilder.path('resources/OnlineJavaPapers.png')
.push();
}
return 'index';
}
我們還配置另一個(gè)類似于上面的 endpoint,,它主要使用傳統(tǒng)的 pull 技術(shù),,并嘗試在客戶端瀏覽器上找出差異。 @GetMapping(path = '/serviceWithoutPush')
public String serviceWithoutPush() {
return 'index';
}
使用 Firefox dev tool,,我們可以確認(rèn),,對(duì)于 serviceWIthPush endpoint ,只有一個(gè)請(qǐng)求是從瀏覽器發(fā)起的: 然而,,當(dāng)我們調(diào)用 serviceWithoutPush ,,會(huì)觸發(fā)兩個(gè)請(qǐng)求。
總而言之,,當(dāng)使用服務(wù)器推送技術(shù)結(jié)合適當(dāng)?shù)木彺婕夹g(shù),,我們可以大大增強(qiáng)頁面加載時(shí)間和我們網(wǎng)站的整體響應(yīng)能力。
可在這里找到示例代碼,。 下面是譯者我自己補(bǔ)充的一點(diǎn)點(diǎn)內(nèi)容: 可能有部分讀者不知道怎么使用 Spring Boot 的里程碑版本,,我在這里貼一個(gè) pom.xml 文件供大家參考使用: <?xml version='1.0' encoding='UTF-8'?>
<project xmlns='http://maven./POM/4.0.0' xmlns:xsi='http://www./2001/XMLSchema-instance'
xsi:schemaLocation='http://maven./POM/4.0.0 http://maven./xsd/maven-4.0.0.xsd'>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>myproject</artifactId>
<version>0.0.1-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.0.M4</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-snapshots</id>
<url>https://repo./snapshot</url>
<snapshots><enabled>true</enabled></snapshots>
</repository>
<repository>
<id>spring-milestones</id>
<url>https://repo./milestone</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-snapshots</id>
<url>https://repo./snapshot</url>
</pluginRepository>
<pluginRepository>
<id>spring-milestones</id>
<url>https://repo./milestone</url>
</pluginRepository>
</pluginRepositories>
</project>
PS:圖片在 google 的服務(wù)器上,可能看不到,,該怎么做大家都知道的啦~
關(guān)注公眾號(hào)
|