高效能非阻塞Web 伺服器Undertow
概述
WildFly 8 包含了一個全新的Web伺服器(Undertow),WildFly 8 預設的Web伺服器為Undertow。一句話概括什麼是Undertow - 高效能非阻塞 Web 伺服器。Undertow 主要有以下幾個特點:
- 輕量化 - Undertow 是一個Web 伺服器,但它不像傳統的Web 伺服器有容器的概念,它由兩個核心jar包組成,使用API載入一個Web應用可以使用小於10MB的記憶體
- HTTP Upgrade 支援 - 設計WildFly時一個重要的考慮因素是在雲環境中減少埠數量的需求。在雲環境中,一個系統可能運行了幾百個甚至幾千個WildFly例項。基於HTTP使用HTTP Upgrade可以升級成多種協議,Undertow提供了複用這些協議的能力。
- Web Socket 支援 - 對Web Socket的完全支援,用以滿足Web應用現在面對巨大數量的客戶端,以及對JSR-356規範的支援
- Servlet 3.1 的支援 - Undertow支援Servlet 3.1,提供了一個機會來構建一個超越Servlet規範、對開發人員非常友好的系統。
- 可巢狀性 - Web 伺服器不在需要容器,我們只需要通過API在J2SE程式碼下快速搭建Web服務
相關連結及快速開始示例
Undertow 社群主頁(http://undertow.io/):包括Undertow相關的所有新聞,訊息。
Java程式碼-
<dependency>
- <groupId>io.undertow</groupId>
- <artifactId>undertow-core</artifactId>
- <version>1.0.0.Final</version>
- </dependency>
- <dependency>
- <groupId>io.undertow</groupId>
- <artifactId>undertow-servlet</artifactId>
-
<version>1.0
- </dependency>
使用軟體資料安裝和下載章節中所描述方法使用Git下載quickstart應用。下載完成後使用如下命令編譯
Java程式碼- mvn clean install dependency:copy-dependencies
編譯完成或生成undertow-quickstart.jar包位於target目錄下,執行時所有依賴包位於target/dependency目錄下。
Undertow Hello World 示例
Undertow是一個高效能非阻塞 Web 伺服器,接下來我們演示如何建立一個Web 伺服器,如下為HelloWorldServer類程式碼明細:
Java程式碼- public class HelloWorldServer {
- public static void main(String[] args) {
- Undertow server = Undertow.builder().addHttpListener(8080, "localhost").setHandler(new HttpHandler(){
- public void handleRequest(HttpServerExchange exchange)throws Exception {
- exchange.getRequestHeaders().put(Headers.CONTENT_TYPE, "text/plain");
- exchange.getResponseSender().send("Hello World");
- }
- }).build();
- server.start();
- }
- }
通過如下方法可以執行HelloWorldServer:
Java程式碼- java -cp target/dependency/*:target/undertow-quickstart.jar org.wildfly.undertow.quickstart.HelloWorldServer
執行後開啟瀏覽器輸入http://localhost:8080,則頁面輸出“Hello World”字串。如上面,我們演示Undertow Web 伺服器使用非同步IO的方式向介面輸出字串。
Undertow 部署Servlet示例
Web 伺服器主要是部署執行Web應用,接下來我們演示如何在Undertow 中通過API部署兩個Servlet(MyServlet,MessageServlet),然後分別訪問這兩個Servlet。兩個Servlet程式碼明細分別如下:
MessageServlet 類程式碼
Java程式碼- public class MessageServlet extends HttpServlet {
- private static final long serialVersionUID = 6861632231065498153L;
- private static final String message = "This is MessageServlet";
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- doPost(req, resp);
- }
- protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- PrintWriter writer = resp.getWriter();
- writer.write(message);
- writer.close();
- }
- }
MyServlet 類程式碼
Java程式碼- public class MyServlet extends HttpServlet {
- private static final long serialVersionUID = 2378494112650465478L;
- private static final String message = "This is MyServlet";
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- doPost(req, resp);
- }
- protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- PrintWriter writer = resp.getWriter();
- writer.write(message);
- writer.close();
- }
- }
接下來我們使用Undertow提供的API,啟動Web伺服器,部署這兩個Servlet,相關的ServletServer類程式碼如下:
Java程式碼- public class ServletServer {
- public static final String MYAPP = "/myapp";
- public static void main(String[] args) throws ServletException {
- DeploymentInfo servletBuilder = Servlets.deployment().setClassLoader(ServletServer.class.getClassLoader())
- .setContextPath(MYAPP)
- .setDeploymentName("myapp.war")
- .addServlets(Servlets.servlet("MessageServlet", MessageServlet.class).addMappings("/messageServlet")
- , Servlets.servlet("MyServlet", MyServlet.class).addMappings("/myServlet"));
- DeploymentManager manager = Servlets.defaultContainer().addDeployment(servletBuilder);
- manager.deploy();
- HttpHandler servletHandler = manager.start();
- PathHandler path = Handlers.path(Handlers.redirect(MYAPP)).addPrefixPath(MYAPP, servletHandler);
- Undertow server = Undertow.builder().addHttpListener(8080, "localhost").setHandler(path).build();
- server.start();
- }
- }
相關推薦
高效能非阻塞Web 伺服器Undertow
概述 WildFly 8 包含了一個全新的Web伺服器(Undertow),WildFly 8 預設的Web伺服器為Undertow。一句話概括什麼是Undertow - 高效能非阻塞 Web 伺服器。Undertow 主要有以下幾個特點: 輕量化 - Underto
200行自定義異步非阻塞Web框架
object sock key break bin 準備就緒 ram host style Python的Web框架中Tornado以異步非阻塞而聞名。本篇將使用200行代碼完成一個微型異步非阻塞Web框架:Snow。 一、源碼 本文基於非阻塞的Socket以及I
常常寫出不阻塞的爬蟲?分享5個用Python編寫非阻塞web爬蟲的方法 python
常常寫出不阻塞的爬蟲?分享5個用Python編寫非阻塞web爬蟲的方法 大家在讀爬蟲系列的帖子時常常問我怎樣寫出不阻塞的爬蟲,這很難,但可行。通過實現一些小策略可以讓你的網頁爬蟲活得更久。那麼今天我就將和大家討論這方面的話題。 使用者代理 你需要關心的第一件事是設定使用者代理。pytho
Java NIO: Non-blocking Server 非阻塞網路伺服器
本文翻譯自 Jakob Jenkov 的 Java NIO: Non-blocking Server ,原文地址:http://tutorials.jenkov.com/java-nio/non-blocking-server.html 文中所有想法均來自原作者,學習之餘,覺得很不錯,對以後深入學習伺服
11 非阻塞式伺服器
即使你知道Java NIO 非阻塞的工作特性(如Selector,Channel,Buffer等元件),但是想要設計一個非阻塞的伺服器仍然是一件很困難的事。非阻塞式伺服器相較於阻塞式來說要多上許多挑戰。本文將會討論非阻塞式伺服器的主要幾個難題,並針對這些難題給出一些可能的解決
常常寫出不阻塞的爬蟲?分享5個用Python編寫非阻塞web爬蟲的方法 python
常常寫出不阻塞的爬蟲?分享5個用Python編寫非阻塞web爬蟲的方法 大家在讀爬蟲系列的帖子時常常問我怎樣寫出不阻塞的爬蟲,這很難,但可行。通過實現一些小策略可以讓你的網頁爬蟲活得更久。那麼今天我就將和大家討論這方面的話題。 使用者代理 你需要關心的第一件事是
《Java NIO文件》非阻塞式伺服器
原文連線 原文作者:Jakob Jenkov 譯者:higher 即使你知道Java NIO 非阻塞的工作特性(如Selector,Channel,Buffer等元件),但是想要設計一個非阻塞的伺服器仍然是一件很困難的事。非阻塞式伺服器相較於阻塞式來說要多上許多挑戰。本文將會討論非阻塞式伺服器
150行程式碼搭建非同步非阻塞Web框架
最近看Tornado原始碼給了我不少啟發,心血來潮決定自己試著只用python標準庫來實現一個非同步非阻塞web框架。花了點時間感覺還可以,一百多行的程式碼已經可以撐起一個極簡框架了。 一、準備工作 需要的相關知識點: HTTP協議的請求和響應 IO多路複用 asyncio 掌握上面三個點的知識就完全沒有
Python web框架 Tornado(二)異步非阻塞
.py thread bind log class multiple fin ini lex 異步非阻塞 阻塞式:(適用於所有框架,Django,Flask,Tornado,Bottle) 一個請求到來未處理完成,後續一直等待 解決方案:多線程,多進程 異步
Netty 一個非阻塞的客戶端/伺服器框架
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
《Nginx高效能Web伺服器》系列分享專欄
《Nginx高效能Web伺服器》系列分享專欄 [作者:Poechant] Nginx是目前最流行的基於BSD-like協議、輕量級、高效能的HTTP伺服器、反向代理伺服器和電子郵件(SMTP/POP3/IMAP)伺服器。CSDN的Nginx專欄引領大家Step by Step地一起領略當今最強大高效能的W
Nginx 1.14.2 穩定版釋出,高效能 Web 伺服器
Nginx 1.14.2 穩定版已釋出,更新如下: stream 模組中新增 “proxy_requests” 指令 “limit_req” 指令新增 “delay” 引數 修復重構期間的記憶體洩漏 修復 $ upstream_response_time、$ u
Tomcat結合Apache、Nginx實現高效能的web伺服器
一、Tomcat為什麼需要與apache、nginx一起結合使用? Tomcat雖然是一個servlet和jsp容器,但是它也是一個輕量級的web伺服器。它既可以處理動態內容,也可以處理靜態內容。不過,tomcat的最大優勢在於處理動態請求,處理靜態內容的
web伺服器(併發)、非堵塞、epoll
返回瀏覽器請求的頁面: 這是用網路助手模擬:tcp伺服器,然後用瀏覽器,連結伺服器,伺服器接收到瀏覽器的請求。 我們需要返回瀏覽器請求的頁面,我們就需要用正則表示式,將上面的一大串字串提取請求的頁面。 步驟: 1.切割字串。 2.正則表示式提取。 im
一個高可擴充套件的基於非阻塞IO的伺服器架構
目錄 執行緒體系結構 反應堆模式 元件架構 接收器 分配器 分配器級別事件處理器 應用程式級別事件處理器 總結 參考資料 如果你被要求去寫一個高可擴充套件性的基於JAVA的伺服器,你很快就會決定使用JAVA NIO包。為了讓伺服器跑起來,你可能會花很多時間閱讀部落格和教程來了解執行緒同
Nginx 1.15.8 主線版釋出,高效能 Web 伺服器
Nginx 1.15.8 已釋出,這是最新的主線(Mainline)版本,更新如下: Feature: the $upstream_bytes_sent variable. Feature: new directives in vim syntax hi
Spring webflux--響應式、非阻塞、事件驅型web框架
一、基本概念---阻塞(Blocking I/O)/非阻塞(Non-blocking I/O),同步(Synchronous I/O)/非同步(Asynchronous I/O): 在進行網路程式設計時,我們常常見到同步(Synchronous I/O)/非同步(As
非阻塞伺服器需要注意的主要問題(譯)
非阻塞伺服器有一個嚴重的問題,一些人甚至在沒解決這個問題的背景下就開發自己的應用框架(比如Python的Tornado) 當你使用非阻塞伺服器的時候,你會獲得出色的效能並且不需要擔心可擴充套件性,然而同時你需要意識到一個問題:你的IO呼叫、網路系統呼叫也都是非阻塞的嗎?很
Jexus V5.8.2 正式釋出,強勁的高效能 web 伺服器
Jexus 是一款運行於 Linux 平臺,以支援 ASP.NET、PHP 為特色的集高安全性和高效能為一體的 WEB 伺服器和反向代理伺服器。最新版 5.8.2 已經發布。 有如下更新: 1,新增HTTPS多證書支援,每個網站都可以配置自己獨立的SSL證書。 2,為AppHost.Port(應用程式
基於非阻塞socket的多執行緒伺服器的實現------一個伺服器如何與多個客戶端進行通訊?
我們首先來看服務端(涉及非阻塞socket和多執行緒): #include <stdio.h> #include <winsock2.h> #include <windows.h> #pragma comment(li