Undertow webコンテナ


Undertow webコンテナ
  • 一、Undertow紹介
  • 、undetowを使う
  • 2.1、依存追加
  • 2.2、起動クラスに、undewtow-server bean
  • を配置する。
  • 2.3、Tomcat起動ログ出力を比較する
  • 2.4、HTTP 2.0へのサポート
  • 2.5、undetowを配置する
  • 、undetowの深度
  • 一、Undertow紹介
    Undertowは、赤ずきんが開発したNIOベースの高性能Web埋め込みサーバーです。
    赤ずきん(RedHat)のオープンソース製品で、WildFly 8(JBoos)のデフォルトのWebサーバーです。
  • 公式サイトAPIは、Undertow:Undertow is a flexible performant web server written in java、providing both blocking and non-blocking API's based on NIO.訳文:Undadtowはjavaで編纂されたフレキシブルな高機能のWebサーバで、NIOのブロックを提供します。
  • 公式サイトAPIのまとめ特徴:
     Lightweight(   )
        Undertow     ,Undertow  jar  1Mb  。            ,                4Mb    
    
     HTTP Upgrade Support(  http  )、HTTP/2 Support
          HTTP  ,        HTTP        
          HTTP 2.0
    
     Web Socket Support(  WebScoket)
        Undertow   Web Socket     ,  JSR-356  
    
     Servlet 4.0  
         Undertow   Servlet 4.0   ,       ,      servlet   。            Servlet   Undertow       
    
     Embeddable(    )
         Undertow               ,      
    
     Flexible(   )
       Undertow  jar : undertow-core.jar undertow-servlet.jar
    
  • まとめ:1、UndertowはWebサーバであり、Servlet、JSP、ファイルサーバ、プロキシサーバ、セキュリティ認証などの現代Webサーバの基本的な特性が必要である。understowは現在、圧倒的多数の機能を実現しており、また、WildflyはJavaEE 7 TCK認証を通過したため、つまりServlet 3.1を通じて認証されたWebサーバとコンテナであり、最新バージョンはservlet 4.0にも対応している。2、Undertowの設計の目的はwebサーバとして使用するためです。現在、多くのJavaと他の言語のオープンソースプロジェクトは、小型のweb serverを組み込んで、サービス能力を提供しています。出力でもいいです。REST方式のjsonテキストを出力することもできます。HTTP(s)プロトコルをサポートしており、多くのアプリケーションが必要を満たすことができます。3、デフォルトの場合Spring CloudはTomcatをインラインServlet容器として使用して、TomcatのSpring Bootプログラムを起動して、Under towのSpring BootプログラムとVisual VMツールで比較して、Undertowの性能がTomcatより優れていることが分かります。4、公式サイトの参考:http://undertow.io
    二、アンダードレッドを使う
    2.1、依存追加
    
        org.springframework.boot
        spring-boot-starter-web
        
            
                org.springframework.boot
                spring-boot-starter-tomcat
            
        
    
    
        org.springframework.boot
        spring-boot-starter-undertow
    
    
    注意:アンダードレーを導入するには、後に並べばロードに失敗します。
    2.2、スタートクラスに、undewtow-server beanを配置する
    @EnableFeignClients
    @EnableDiscoveryClient
    @SpringBootApplication
    @EntityScan("com.sunred.framework.domain.course")//     
    @ComponentScan(basePackages={"com.sunred.api"})//    
    @ComponentScan(basePackages={"com.sunred.manage_course"})
    @ComponentScan(basePackages={"com.sunred.framework"})//  common     
    public class ManageCourseApplication {
        public static void main(String[] args) throws Exception {
            SpringApplication.run(ManageCourseApplication.class, args);
        }
    
        @Bean //       undertow server   spring-context  ,     tomcat       
        public ServletWebServerFactory servletContainer() {
            UndertowServletWebServerFactory tomcat = new UndertowServletWebServerFactory();
            return tomcat;
        }
    }
    
    2.3、Tomcat起動ログ出力を比較する
    ========= undertow =========================
    2019-07-23 22:37:21.926 [main] DEBUG o.s.b.w.s.f.OrderedRequestContextFilter - Initializing filter 'requestContextFilter'
    2019-07-23 22:37:21.928 [main] DEBUG o.s.b.w.s.f.OrderedRequestContextFilter - Filter 'requestContextFilter' configured successfully
    2019-07-23 22:37:21.928 [main] DEBUG o.s.b.w.s.f.OrderedHttpPutFormContentFilter - Initializing filter 'httpPutFormContentFilter'
    2019-07-23 22:37:21.928 [main] DEBUG o.s.b.w.s.f.OrderedHttpPutFormContentFilter - Filter 'httpPutFormContentFilter' configured successfully
    2019-07-23 22:37:21.928 [main] DEBUG o.s.b.w.s.f.OrderedHiddenHttpMethodFilter - Initializing filter 'hiddenHttpMethodFilter'
    2019-07-23 22:37:21.928 [main] DEBUG o.s.b.w.s.f.OrderedHiddenHttpMethodFilter - Filter 'hiddenHttpMethodFilter' configured successfully
    2019-07-23 22:37:21.928 [main] DEBUG o.s.b.w.s.f.OrderedCharacterEncodingFilter - Initializing filter 'characterEncodingFilter'
    2019-07-23 22:37:21.928 [main] DEBUG o.s.b.w.s.f.OrderedCharacterEncodingFilter - Filter 'characterEncodingFilter' configured successfully
    2019-07-23 22:37:21.992 [main] INFO  o.s.b.w.e.u.UndertowServletWebServer - Undertow started on port(s) 31200 (http) with context path ''
    2019-07-23 22:37:21.993 [main] INFO  o.s.c.n.e.s.EurekaAutoServiceRegistration - Updating port to 31200
    2019-07-23 22:37:21.995 [main] INFO  c.x.m.ManageCourseApplication - Started ManageCourseApplication in 9.859 seconds (JVM running for 10.944)
    2019-07-23 22:37:35.612 [XNIO-2 task-1] INFO  io.undertow.servlet - Initializing Spring FrameworkServlet 'dispatcherServlet'
    2019-07-23 22:37:35.613 [XNIO-2 task-1] INFO  o.s.web.servlet.DispatcherServlet - FrameworkServlet 'dispatcherServlet': initialization started
    2019-07-23 22:37:35.632 [XNIO-2 task-1] INFO  o.s.web.servlet.DispatcherServlet - FrameworkServlet 'dispatcherServlet': initialization completed in 19 ms
    2019-07-23 22:37:35.640 [XNIO-2 task-1] DEBUG o.s.b.w.s.f.OrderedRequestContextFilter - Bound request context to thread: HttpServletRequestImpl [ GET / ]
    2019-07-23 22:37:35.668 [XNIO-2 task-1] DEBUG o.s.b.w.s.f.OrderedRequestContextFilter - Cleared thread-bound request context: HttpServletRequestImpl [ GET / ]
    2019-07-23 22:37:35.803 [XNIO-2 task-2] DEBUG o.s.b.w.s.f.OrderedRequestContextFilter - Bound request context to thread: HttpServletRequestImpl [ GET /favicon.ico ]
    
    ======= tomcat =======
    2019-07-23 22:45:42.156 [main] INFO  o.a.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-31200"]
    2019-07-23 22:45:42.164 [main] INFO  o.a.tomcat.util.net.NioSelectorPool - Using a shared selector for servlet write/read
    2019-07-23 22:45:42.182 [main] INFO  o.s.b.w.e.tomcat.TomcatWebServer - Tomcat started on port(s): 31200 (http) with context path ''
    2019-07-23 22:45:42.183 [main] INFO  o.s.c.n.e.s.EurekaAutoServiceRegistration - Updating port to 31200
    2019-07-23 22:45:42.185 [main] INFO  c.x.m.ManageCourseApplication - Started ManageCourseApplication in 10.445 seconds (JVM running for 11.686)
    2019-07-23 22:46:55.193 [http-nio-31200-exec-1] INFO  o.a.c.c.C.[Tomcat].[localhost].[/] - Initializing Spring FrameworkServlet 'dispatcherServlet'
    2019-07-23 22:46:55.194 [http-nio-31200-exec-1] INFO  o.s.web.servlet.DispatcherServlet - FrameworkServlet 'dispatcherServlet': initialization started
    2019-07-23 22:46:55.235 [http-nio-31200-exec-1] INFO  o.s.web.servlet.DispatcherServlet - FrameworkServlet 'dispatcherServlet': initialization completed in 41 ms
    2019-07-23 22:46:55.251 [http-nio-31200-exec-1] DEBUG o.s.b.w.s.f.OrderedRequestContextFilter - Bound request context to thread: org.apache.catalina.connector.RequestFacade@44c8bbdb
    2019-07-23 22:46:55.327 [http-nio-31200-exec-1] DEBUG o.s.b.w.s.f.OrderedRequestContextFilter - Cleared thread-bound request context: org.apache.catalina.connector.RequestFacade@44c8bbdb
    2019-07-23 22:46:55.342 [http-nio-31200-exec-2] DEBUG o.s.b.w.s.f.OrderedRequestContextFilter - Bound request context to thread: org.apache.catalina.connector.RequestFacade@44c8bbdb
    2019-07-23 22:46:55.353 [http-nio-31200-exec-2] DEBUG o.s.b.w.s.f.OrderedRequestContextFilter - Cleared thread-bound request context: org.apache.catalina.connector.RequestFacade@44c8bbdb
    2019-07-23 22:46:55.362 [http-nio-31200-exec-5] DEBUG o.s.b.w.s.f.OrderedRequestContextFilter - Bound request context to thread: org.apache.catalina.connector.RequestFacade@44c8bbdb
    
    重要な情報を見ることができます。undetowは19 msスタートします。tomcatは41 msスタートします。これも一つの面から見て、undetowはライト級が多いです。
    2.4、HTTP 2.0へのサポート
    参考:https://segmentfault.com/a/1190000013644784
    2.5、under towを配置する
    # Undertow       
    server.undertow.accesslog.dir
    #       
    server.undertow.accesslog.enabled=false 
    #     
    server.undertow.accesslog.pattern=common
    #        
    server.undertow.accesslog.prefix=access_log
    #        
    server.undertow.accesslog.suffix=log
    # HTTP POST       
    server.undertow.max-http-post-size=0 
    #   IO   ,            ,         ,       CPU      
    server.undertow.io-threads=4
    #        ,      servlet      , undertow            ,             
    server.undertow.worker-threads=20
    #         buffer,  buffer         IO  ,    netty       
    #   buffer     ,           
    server.undertow.buffer-size=1024
    #       buffer   ,   pool    buffer-size * buffers-per-region
    server.undertow.buffers-per-region=1024
    #          
    server.undertow.direct-buffers=true
    
    三、アンダードレッドの深化
    まず簡単に埋め込まれたWebServerのコードの例を見てください。
    public class HelloWorldServer {  
      
        public static void main(final String[] args) {  
            Undertow server = Undertow.builder()  
                    .addHttpListener(8080, "localhost")  
                    .setHandler(new HttpHandler() { //  HttpHandler      
                        @Override  
                        public void handleRequest(final HttpServerExchange exchange) throws Exception {  
                            exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "text/plain");  
                            exchange.getResponseSender().send("Hello World");  
                        }  
                    }).build();  
            server.start();  
        }  
    }  
    
    under towの中で、最も主要なインターフェースはHttpHandlerで、XNIOの中のChanelListenerの概念と似ています。HttpHandlerも一つの方法しかありません。パラメータはHttpServerExchangeです。
    このプログラムにはWebサーバが埋め込まれています。本機の8080ポートを開けて、要求を受け付けます。ブラウザが接続されていると、純粋なテキスト「Hello World」を送ります。
    Http ServerExchangeはすべてのコンテキスト状態情報を携帯しています。このクラスも現在のunder towの中で一番長いコードです。2000行以上あります。requestとレスポンスに関する情報も含まれており、get Request Headers()/gets RespnseHeaders()により対応するヘッダ情報を取得することができます。
    Undertow類は入り口点であり、builderからパラメータが入ることでWebコンテナを構築する。
    上記の例:APIすなわちio.under tow.Undertowを使用するのが一番簡単です。もう一つは、XNIOとUndertowトランシーバー類を直接使ってサーバーを組み立てることです。この方法を使うにはもっと多くのコードが必要ですが、より多くの柔軟性を与えます。ほとんどの場合、APIを通じて構築すればいいです。
    参考:http://blog.hubwiz.com/2016/12/01/webserver-Undertow/ https://blog.csdn.net/fayeyiwang/article/details/54729514