使用 Spring Boot 內(nèi)嵌容器 Undertow創(chuàng)建服務(wù)器的方法
Undertow是一個(gè)Web服務(wù)器,那么它就需要具備的現(xiàn)代Web服務(wù)器的基本特性,比如Servlet,JSP,文件服務(wù)器,代理服務(wù)器,安全認(rèn)證等。undertow目前已經(jīng)實(shí)現(xiàn)了絕大多數(shù)功能,并且因?yàn)閣ildfly通過了JavaEE7 TCK認(rèn)證,所以可以說Undertow是一個(gè)通過Servlet 3.1認(rèn)證的Web服務(wù)器和容器。這篇文章只分析Undertow的主干流程上的主要功能,即undertow-core和undertow-servlet。
1、簡介
Undertow是一個(gè)非常輕量并高性能的web server,它來自 JBoss。支持blocking和non-blocking兩種NIO API。
由于它是用Java寫的,所以它可以被那些JVM-based 的應(yīng)用通過內(nèi)嵌的方式來使用。甚至JBoss的WilfFly服務(wù)器在內(nèi)部使用Undertow來提高服務(wù)器的性能。
在本文中,我們將介紹Undertow的主要功能并給出使用代碼。
2. 為什么要選擇Undertow?
- 輕量級 :Undertow 是非常小的,只有不到1MB。在內(nèi)嵌模式下,運(yùn)行時(shí)只占heap空間的4MB左右。
- Servlet 3.1:完美支持 Servlet 3.1
- Web Socket :支持 Web Socket (包括JSR-356)
- 長連接 :默認(rèn)情況下 ,Undertow 通過添加keep-alive 的response header來支持長連接。它通過重用連接信息(connection details)來改善長連接的性能。
3. 使用Undertow
不多說,讓我們使用Undertow來創(chuàng)建一個(gè)簡單的web server吧!
3.1. Maven 依賴
加入如下依賴:
要構(gòu)建一個(gè)可運(yùn)行的jar,我們還需要添加一個(gè)maven-shade-plugin。像下面這樣:
最新版的Undertow已經(jīng)放到了maven 中央倉庫,隨便玩耍吧。
3.2. 簡單的Server
僅僅需要下面的幾行代碼,就可以創(chuàng)建一個(gè)簡單的web server,Undertow的入口使用的是Builder API。
這里我們使用Builder API把server綁定到8080端口上。同時(shí)我們使用了lambda表達(dá)式配置了一個(gè)handler。你也可以不用lambda表達(dá)式做同樣的事情:
最主要的事情就是這里對HttpHandler API的使用。這個(gè)是根據(jù)我們的需要定制Undertow應(yīng)用程序的最重要的武器。
在這里,我們添加了一個(gè)自定義的handler,邏輯就是讓每個(gè)request都有一個(gè)Content-Type: text/plain response header。
同樣的,如果你想讓每個(gè)response都返回默認(rèn)的text文本,你可以像下面這樣來定義:
3.3.安全訪問
在大多數(shù)情況下,我們不希望所有的用戶都可以訪問我們的server。通常,只有那些攜帶了合法“護(hù)照”的才可以訪問。在Undertow上,我們同樣可以實(shí)現(xiàn)這樣的機(jī)制。
要想實(shí)現(xiàn)這個(gè),我們只需要?jiǎng)?chuàng)建一個(gè)認(rèn)證管理器,這個(gè)管理器會(huì)檢查每個(gè)請求的用戶信息。
下面我們就來實(shí)現(xiàn)一個(gè)自定義的IdentityManager:
一旦認(rèn)證mananger被創(chuàng)建,我們需要?jiǎng)?chuàng)建一個(gè)“領(lǐng)地”來保存用戶的信息。
這里我們使用了 AuthenticationMode.PRO_ACTIVE,表示每個(gè)來到這個(gè)server的請求都將會(huì)經(jīng)過我們指定的認(rèn)證機(jī)制來踴躍的進(jìn)行認(rèn)證。
如果我們使用了AuthenticationMode.CONSTRAINT_DRIVEN模式,那么只有那些被明確要求過濾的請求才會(huì)經(jīng)過認(rèn)證機(jī)制。
現(xiàn)在,我們只需要把保存用戶信息的“領(lǐng)地”和認(rèn)證管理器關(guān)聯(lián)起來就可以了。
截止目前,我們已經(jīng)創(chuàng)建了兩個(gè)用戶實(shí)例。一旦server啟動(dòng)了以后,要想訪問,我們就需要使用這個(gè)兩個(gè)證書才行。
3.4. Web Socket
使用Undertow的WebSocketHttpExchange API創(chuàng)建web socket exchange channel 同樣非常簡單。
下面,我們就打開一個(gè)socket通信channel,在/importsourceApp path上:
然后我們就可以創(chuàng)建一個(gè)HTML頁面 index.html,然后使用js的WebSocket API來連接到這個(gè)channel上了。
3.5. File Server
使用Undertow,我們也可以創(chuàng)建一個(gè)文件服務(wù)器(file server),它可以顯示目錄內(nèi)容,并直接從目錄中提供文件:
你甚至都不需要穿件任何UI來顯示目錄。Undertow 為你提供了一個(gè)開箱即用的頁面。
4. Spring Boot Plugin
Spring Boot把Undertow也內(nèi)嵌進(jìn)去了,作為繼Tomcat和Jetty之后第三個(gè)內(nèi)嵌的servlet 容器。要想在Spring Boot中使用Undertow只需要加下面的依賴就是了:
5. 總結(jié)
在本文中,我們了解了Undertow以及如何使用它創(chuàng)建不同類型的服務(wù)器。
以上所述是小編給大家介紹的Spring Boot 內(nèi)嵌容器 Undertow,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
Java設(shè)計(jì)模式之中介模式(Mediator模式)介紹
這篇文章主要介紹了Java設(shè)計(jì)模式之中介模式(Mediator模式)介紹,本文講解了為何使用Mediator模式、如何使用中介模式等內(nèi)容,需要的朋友可以參考下2015-03-03Java實(shí)戰(zhàn)網(wǎng)上電子書城的實(shí)現(xiàn)流程
讀萬卷書不如行萬里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+JSP+maven+Mysql實(shí)現(xiàn)一個(gè)網(wǎng)上電子書城,大家可以在過程中查缺補(bǔ)漏,提升水平2022-01-01詳解java一維數(shù)組及練習(xí)題實(shí)例
在本篇文章里小編給大家整理了關(guān)于java一維數(shù)組及練習(xí)題的相關(guān)知識點(diǎn)和實(shí)例代碼,有需要的朋友們跟著學(xué)習(xí)下。2019-07-07SpringBoot配置MyBatis-Plus實(shí)現(xiàn)增刪查改
本文主要介紹了SpringBoot配置MyBatis-Plus實(shí)現(xiàn)增刪查改,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08解決java web應(yīng)用線上系統(tǒng)偶發(fā)宕機(jī)的情況
這篇文章主要介紹了解決java web應(yīng)用線上系統(tǒng)偶發(fā)宕機(jī)的情況,具有好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09帶你重新認(rèn)識Java動(dòng)態(tài)代理
這篇文章主要為大家介紹了Java的動(dòng)態(tài)代理,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2021-11-11Java服務(wù)限流算法的6種實(shí)現(xiàn)
服務(wù)限流是指通過控制請求的速率或次數(shù)來達(dá)到保護(hù)服務(wù)的目的,本文主要介紹了Java服務(wù)限流算法的6種實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2023-05-05MyBatis 三表外關(guān)聯(lián)查詢的實(shí)現(xiàn)(用戶、角色、權(quán)限)
這篇文章主要介紹了MyBatis 三表外關(guān)聯(lián)查詢的實(shí)現(xiàn)(用戶、角色、權(quán)限),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08