1. 程式人生 > >高效能非阻塞Web 伺服器Undertow

高效能非阻塞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程式碼  收藏程式碼
  1. <dependency>  
  2.     <groupId>io.undertow</groupId>  
  3.     <artifactId>undertow-core</artifactId>  
  4.     <version>1.0.0.Final</version>  
  5. </dependency>  
  6. <dependency>  
  7.     <groupId>io.undertow</groupId>  
  8.     <artifactId>undertow-servlet</artifactId>  
  9.     <version>1.0
    .0.Final</version>  
  10. </dependency>  

 使用軟體資料安裝和下載章節中所描述方法使用Git下載quickstart應用。下載完成後使用如下命令編譯

Java程式碼  收藏程式碼
  1. mvn clean install dependency:copy-dependencies    

編譯完成或生成undertow-quickstart.jar包位於target目錄下,執行時所有依賴包位於target/dependency目錄下。

Undertow Hello World 示例

Undertow是一個高效能非阻塞 Web 伺服器,接下來我們演示如何建立一個Web 伺服器,如下為HelloWorldServer類程式碼明細:

Java程式碼  收藏程式碼
  1. public class HelloWorldServer {  
  2.     public static void main(String[] args) {  
  3.         Undertow server = Undertow.builder().addHttpListener(8080"localhost").setHandler(new HttpHandler(){  
  4.                     public void handleRequest(HttpServerExchange exchange)throws Exception {  
  5.                         exchange.getRequestHeaders().put(Headers.CONTENT_TYPE, "text/plain");  
  6.                         exchange.getResponseSender().send("Hello World");  
  7.                     }  
  8.                 }).build();  
  9.         server.start();  
  10.     }  
  11. }  

 通過如下方法可以執行HelloWorldServer:

Java程式碼  收藏程式碼
  1. 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程式碼  收藏程式碼
  1. public class MessageServlet extends HttpServlet {  
  2.     private static final long serialVersionUID = 6861632231065498153L;  
  3.     private static final String message = "This is MessageServlet";  
  4.     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {  
  5.         doPost(req, resp);  
  6.     }  
  7.     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {  
  8.         PrintWriter writer = resp.getWriter();  
  9.         writer.write(message);  
  10.         writer.close();  
  11.     }  
  12. }  

MyServlet 類程式碼

Java程式碼  收藏程式碼
  1. public class MyServlet extends HttpServlet {  
  2.     private static final long serialVersionUID = 2378494112650465478L;  
  3.     private static final String message = "This is MyServlet";  
  4.     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {  
  5.         doPost(req, resp);  
  6.     }  
  7.     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {  
  8.         PrintWriter writer = resp.getWriter();  
  9.         writer.write(message);  
  10.         writer.close();  
  11.     }  
  12. }  

 接下來我們使用Undertow提供的API,啟動Web伺服器,部署這兩個Servlet,相關的ServletServer類程式碼如下:

Java程式碼  收藏程式碼
  1. public class ServletServer {  
  2.     public static final String MYAPP = "/myapp";  
  3.     public static void main(String[] args) throws ServletException {  
  4.         DeploymentInfo servletBuilder = Servlets.deployment().setClassLoader(ServletServer.class.getClassLoader())  
  5.                                                              .setContextPath(MYAPP)  
  6.                                                              .setDeploymentName("myapp.war")  
  7.                                                              .addServlets(Servlets.servlet("MessageServlet", MessageServlet.class).addMappings("/messageServlet")  
  8.                                                                         , Servlets.servlet("MyServlet", MyServlet.class).addMappings("/myServlet"));  
  9.         DeploymentManager manager = Servlets.defaultContainer().addDeployment(servletBuilder);  
  10.         manager.deploy();  
  11.         HttpHandler servletHandler = manager.start();  
  12.         PathHandler path = Handlers.path(Handlers.redirect(MYAPP)).addPrefixPath(MYAPP, servletHandler);  
  13.         Undertow server = Undertow.builder().addHttpListener(8080"localhost").setHandler(path).build();  
  14.         server.start();  
  15.     }  
  16. }  

相關推薦

高效能阻塞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