云计算百科
云计算领域专业知识百科平台

UnderTow服务器

1.Undertow架构概述

Undertow是一个灵活的、高性能的Web服务器,它的设计理念是通过组合不同的组件来满足不同的应用需求。以下是对Undertow架构的详细分析:

1. 整体架构

Undertow服务器由三个主要部分组成:

  • XNIO工作者实例:负责管理IO线程和工作线程池。
  • 连接器:处理传入的连接。
  • 处理器链:处理传入的请求。

2. XNIO

Undertow基于XNIO,这是一个对Java NIO的轻量级抽象层,提供了以下功能:

  • IO和工作线程管理:XNIO工作者管理IO线程和一个可用于阻塞任务的线程池。非阻塞处理器通常在IO线程中运行,而阻塞任务(如Servlet调用)则被分派到工作线程池。
  • 通道API:XNIO提供了一个通道抽象,通过ChannelListener API通知事件,而不必直接处理NIO的兴趣操作集(interest OPs)。
  • 监听器:Undertow包含多种监听器,如HTTP/1.1、HTTPS、AJP和HTTP/2监听器,它们通常在IO线程中使用异步IO处理所有IO操作。
  • 处理器:Undertow的主要功能由io.undertow.server.HttpHandler实例提供,这些处理器可以链接在一起形成一个完整的服务器。

3. 监听器

监听器是Undertow应用的入口点,负责将请求转换为HttpServerExchange对象,并将结果转换为响应发送回客户端。Undertow提供了多种监听器类型,包括HTTP/1.1、AJP和HTTP/2监听器,以及对HTTPS和代理协议的支持。

4. 处理器

处理器是Undertow的核心功能单元,它们通过实现io.undertow.server.HttpHandler接口来定义。处理器可以被链接在一起,形成一个处理请求的链条。常见的处理器包括路径匹配处理器、虚拟主机处理器、资源处理器等,它们提供了诸如路径匹配、虚拟主机支持、资源服务、请求过滤等功能。

5. 配置选项

Undertow的监听器和工作者可以通过org.xnio.Option类和io.undertow.UndertowOptions类进行配置。这些选项包括工作者线程数量、缓冲区大小、请求和响应的各种限制等。

6. 内置处理器

Undertow包含了许多内置的处理器,提供了常见的功能,如路径匹配、虚拟主机支持、资源服务、请求过滤等。这些处理器可以通过io.undertow.Handlers工具类的静态方法创建。

通过这种模块化的设计,Undertow能够提供高度的灵活性和可定制性,使其适用于各种不同的Web应用场景。

2.将请求对象(HttpServerExchange)转换为Servlet规范中的ServletRequest和ServletResponse对象

在Undertow中,请求对象(HttpServerExchange)被转换为Servlet规范中的ServletRequest和ServletResponse对象,然后传递给Servlet进行处理。这个过程涉及到Undertow的Servlet容器实现,它负责管理Servlet的生命周期和请求处理。

转换过程

  • 创建ServletRequest和ServletResponse:

    • 在Undertow的FilterHandler类中,首先会创建ServletRequest和ServletResponse对象。这是通过ServletRequestContext来完成的,它是从HttpServerExchange中获取的附件(attachment)。
    • 代码示例:

      final ServletRequestContext servletRequestContext = exchange.getAttachment(ServletRequestContext.ATTACHMENT_KEY);
      ServletRequest request = servletRequestContext.getServletRequest();
      ServletResponse response = servletRequestContext.getServletResponse();

  • 调用Servlet的service方法:

    • 一旦ServletRequest和ServletResponse对象被创建,Undertow会调用Servlet的service方法。这个方法是在ServletHandler类中被调用的。
    • 代码示例:

      servlet.getInstance().service(request, response);

  • HttpServlet的service方法:

    • 在HttpServlet类中,service方法会将ServletRequest和ServletResponse对象转换为HttpServletRequest和HttpServletResponse对象,然后根据请求的HTTP方法(如GET、POST)调用相应的doGet、doPost等方法。
    • 代码示例:

      public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
      HttpServletRequest request;
      HttpServletResponse response;
      if (!(req instanceof HttpServletRequest && res instanceof HttpServletResponse)) {
      throw new ServletException("non-HTTP request or response");
      }
      request = (HttpServletRequest) req;
      response = (HttpServletResponse) res;
      service(request, response);
      }

  • 配置和初始化

    • Servlet的初始化:
      • Undertow会在第一次请求时初始化Servlet。这是通过firstRequestHandler来实现的,它会执行一系列的nextHandler.call方法,直到ServletDispatchingHandler被调用,这时Servlet才会被初始化。
      • 代码示例:

        private void dispatchRequest(final HttpServerExchange exchange, final ServletRequestContext servletRequestContext, final ServletChain servletChain, final DispatcherType dispatcherType) throws Exception {
        servletRequestContext.setDispatcherType(dispatcherType);
        servletRequestContext.setCurrentServlet(servletChain);
        if (dispatcherType == DispatcherType.REQUEST || dispatcherType == DispatcherType.ASYNC) {
        firstRequestHandler.call(exchange, servletRequestContext);
        } else {
        next.handleRequest(exchange);
        }
        }

    总结

    Undertow通过一系列的内部机制,将原生的HttpServerExchange对象转换为Servlet规范中的ServletRequest和ServletResponse对象(其实是jAVAEE规范的),然后调用Servlet的service方法进行处理。这个过程涉及到多个类的协作,包括FilterHandler、ServletHandler和HttpServlet等。在实际应用中,开发人员通常不需要直接处理这些转换过程,而是通过配置和部署Servlet来处理业务逻辑

    3.所以直接从servlet组件的容器入手

    4.DeploymentInfo类好像很中用哇,基本能看出类似于tomcat的架构

    servlet应用应该指的就是部署上的一个应用,DeploymentInfo

    以下是对这个DeploymentInfo类的分析:

    一、类的总体概述

    • DeploymentInfo类用于配置在Undertow中Servlet应用的部署相关信息。它实现了Cloneable接口,这意味着可以对这个部署配置进行克隆操作,可能在需要创建相似但略有不同的部署配置场景下会用到。

    二、成员变量分析

    1. 版本相关
    • DEFAULT_MAJOR_VERSION:
      • 类型:static final int。
      • 含义:定义了默认的主版本号为6,这个版本号可能与Servlet规范或者Undertow自身的内部版本控制相关。
    • majorVersion和minorVersion:
      • 类型:int。
      • 含义:分别表示部署的主版本号和次版本号,默认主版本号为DEFAULT_MAJOR_VERSION,次版本号为0。这些版本号可以用于确保与特定版本的Servlet规范或者Undertow的兼容性。
    • containerMajorVersion和containerMinorVersion:
      • 类型:int。
      • 含义:可能与容器(这里指Undertow作为Servlet容器)相关的版本号设置,同样主版本号默认是DEFAULT_MAJOR_VERSION,次版本号为0。
    2. 名称与路径相关
    • deploymentName:
      • 类型:String。
      • 含义:是这个部署的名称,用于在Undertow中标识这个Servlet部署,类似于一个逻辑名称,例如在管理多个部署时方便区分。
    • displayName:
      • 类型:String。
      • 含义:可能用于显示目的的名称,例如在管理界面(如果有的话)中显示这个部署的更友好的名称。
    • contextPath:
      • 类型:String。
      • 含义:定义了Servlet应用在Web服务器中的根路径,例如设置为"/"表示在服务器根路径下提供服务。
    • hostName:
      • 类型:String。
      • 含义:指定了与这个部署相关的主机名,默认设置为"localhost",可能在多主机环境或者需要特定主机标识的场景下使用。
    3. 类加载与资源管理相关
    • classLoader:
      • 类型:ClassLoader。
      • 含义:用于加载Servlet应用中的类的类加载器,正确设置类加载器确保了类的正确加载,包括Servlet类、过滤器类等。
    • resourceManager:
      • 类型:ResourceManager。
      • 含义:负责管理部署相关的资源,初始化为ResourceManager.EMPTY_RESOURCE_MANAGER,可能在需要扩展资源管理功能(如加载外部资源等)时被修改。
    • classIntrospecter:
      • 类型:ClassIntrospecter。
      • 含义:用于类的内省操作,默认使用DefaultClassIntrospector.INSTANCE,可能在处理Servlet类、过滤器类等需要反射或内省操作的场景下使用。
    4. 执行器相关
    • executor和asyncExecutor:
      • 类型:Executor。
      • 含义:这两个执行器可能分别用于处理常规的Servlet请求和异步Servlet请求。合适的执行器设置可以提高请求处理的效率和并发处理能力。
    5. 临时目录相关
    • tempDir:
      • 类型:Path。
      • 含义:指定了一个临时目录的路径,可能在处理文件上传、临时文件生成等操作时会用到这个临时目录。
    6. JSP配置相关
    • jspConfigDescriptor:
      • 类型:JspConfigDescriptor。
      • 含义:用于配置与JSP相关的设置,如果这个部署涉及JSP页面的话,这个对象包含了JSP的配置信息。
    7. 会话管理相关
    • sessionManagerFactory:
      • 类型:SessionManagerFactory。
      • 含义:用于创建会话管理器的工厂,默认使用InMemorySessionManagerFactory,这意味着默认的会话管理可能是基于内存的,不过可以根据需求替换为其他的会话管理方式(如基于数据库等)。
    • defaultSessionTimeout:
      • 类型:int。
      • 含义:定义了默认的会话超时时间,单位可能是分钟(从代码看是60 * 30秒,即30分钟),用于控制用户会话在多长时间无活动后被销毁。
    • servletSessionConfig:
      • 类型:ServletSessionConfig。
      • 含义:用于配置Servlet会话相关的一些额外设置。
    • changeSessionIdOnLogin:
      • 类型:boolean。
      • 含义:表示在用户登录时是否更改会话ID,默认设置为true,这可能是出于安全考虑,防止会话固定攻击等。
    • sessionIdGenerator:
      • 类型:SessionIdGenerator。
      • 含义:用于生成会话ID的对象,默认使用SecureRandomSessionIdGenerator,确保生成的会话ID具有足够的随机性和安全性。
    • sessionPersistenceManager:
      • 类型:SessionPersistenceManager。
      • 含义:用于管理会话的持久化,如果需要将会话数据持久化到存储(如数据库)中,可以通过这个对象进行配置。
    8. 安全相关
    • loginConfig:
      • 类型:LoginConfig。
      • 含义:配置登录相关的信息,例如登录的方式(表单登录、基本认证等)等与用户登录认证相关的设置。
    • identityManager:
      • 类型:IdentityManager。
      • 含义:用于管理用户身份信息,可能在认证和授权过程中用于验证用户身份等操作。
    • confidentialPortManager:
      • 类型:ConfidentialPortManager。
      • 含义:可能与在安全端口(如HTTPS端口)上处理机密信息相关的管理对象。
    • authorizationManager:
      • 类型:AuthorizationManager。
      • 含义:用于管理授权操作,默认使用DefaultAuthorizationManager.INSTANCE,负责决定用户是否有权限访问特定的资源。
    • authenticationMechanism:
      • 类型:AuthenticationMechanism。
      • 含义:定义了认证机制,用于验证用户身份,例如基于用户名/密码、令牌等的认证方式。
    • securityContextFactory:
      • 类型:SecurityContextFactory。
      • 含义:用于创建安全上下文的工厂,安全上下文可能包含用户的认证和授权信息等。
    • authenticationMode:
      • 类型:AuthenticationMode。
      • 含义:定义了认证模式,例如是主动认证(PRO_ACTIVE)还是其他模式,这影响了认证操作何时以及如何被触发。
    • securityRoles:
      • 类型:Set<String>。
      • 含义:定义了一组安全角色,用于在授权过程中确定用户的角色权限。
    • securityConstraints:
      • 类型:List<SecurityConstraint>。
      • 含义:用于定义安全约束,例如哪些URL路径需要特定的角色或者认证才能访问等。
    9. 编码与缓存相关
    • defaultEncoding、defaultRequestEncoding和defaultResponseEncoding:
      • 类型:String。
      • 含义:分别定义了默认的编码(可能是整个部署的、请求的、响应的编码),用于处理字符编码相关的操作,确保正确的字符处理。
    • urlEncoding:
      • 类型:String。
      • 含义:可能是专门用于URL编码的设置。
    • ignoreFlush:
      • 类型:boolean。
      • 含义:如果设置为true,可能表示忽略某些刷新操作,具体取决于Undertow内部的逻辑与实现。
    • disableCachingForSecuredPages:
      • 类型:boolean。
      • 含义:用于决定是否对安全页面(例如需要认证才能访问的页面)禁用缓存,默认设置为true,这有助于提高安全性,防止缓存的页面被未授权用户访问。
    10. 其他配置相关
    • servletContextAttributeBackingMap:
      • 类型:ConcurrentMap<String, Object>。
      • 含义:用于存储Servlet上下文属性的后备映射,可能在处理Servlet上下文属性时提供额外的存储或者映射功能。
    • initParameters:
      • 类型:Map<String, String>。
      • 含义:用于存储Servlet的初始化参数,这些参数可以在Servlet初始化时被读取和使用。
    • servletContextAttributes:
      • 类型:Map<String, Object>。
      • 含义:用于存储Servlet上下文的属性,这些属性可以在整个Servlet应用中被共享和访问。
    • localeCharsetMapping:
      • 类型:Map<String, String>。
      • 含义:定义了本地字符集的映射关系,可能用于处理不同地区的字符编码转换等操作。
    • welcomePages:
      • 类型:List<String>。
      • 含义:定义了欢迎页面的列表,当用户访问根路径或者特定路径且没有指定具体资源时,可能会显示这些欢迎页面。
    • errorPages:
      • 类型:List<ErrorPage>。
      • 含义:定义了错误页面的配置,当发生特定类型的错误(如404、500等)时,会显示对应的错误页面。
    • mimeMappings:
      • 类型:List<MimeMapping>。
      • 含义:定义了MIME类型的映射关系,用于将文件扩展名与对应的MIME类型进行映射,确保正确的内容类型处理。
    • notificationReceivers:
      • 类型:List<NotificationReceiver>。
      • 含义:可能是用于接收通知的对象列表,具体通知内容和用途取决于Undertow的内部机制。
    • authenticationMechanisms:
      • 类型:Map<String, AuthenticationMechanismFactory>。
      • 含义:定义了不同名称对应的认证机制工厂的映射关系,用于根据名称创建不同的认证机制。
    • lifecycleInterceptors:
      • 类型:List<LifecycleInterceptor>。
      • 含义:定义了生命周期拦截器的列表,这些拦截器可以在Servlet的生命周期(如初始化、销毁等)过程中执行额外的操作。
    • sessionListeners:
      • 类型:List<SessionListener>。
      • 含义:定义了会话监听器的列表,这些监听器可以监听会话的创建、销毁、属性变化等事件。
    • servletExtensions:
      • 类型:List<ServletExtension>。
      • 含义:用于存储额外的Servlet扩展对象,可能用于扩展Servlet的功能或者添加自定义行为。
    • principalVersusRolesMap:
      • 类型:Map<String, Set<String>>。
      • 含义:定义了主体(可能是用户或者其他实体)与角色的映射关系,可能用于更复杂的授权或者角色管理场景。
    • initialHandlerChainWrappers、outerHandlerChainWrappers、innerHandlerChainWrappers、initialSecurityWrapper和securityWrappers:
      • 类型:List<HandlerWrapper>或者HandlerWrapper。
      • 含义:这些是与请求处理链包装器相关的成员变量。不同的包装器在请求处理的不同阶段被应用,例如在初始的Servlet处理之前、安全处理之后等不同阶段,用于添加额外的处理逻辑或者修改请求处理流程。
    • defaultMultipartConfig:
      • 类型:MultipartConfigElement。
      • 含义:用于配置多部分(例如文件上传涉及的多部分内容)相关的默认配置,如果Servlet没有显式设置自己的多部分配置,将使用这个默认配置。
    • contentTypeCacheSize:
      • 类型:int。
      • 含义:定义了内容类型缓存的大小,缓存内容类型可能是为了提高性能,减少重复解析内容类型的开销。
    • crawlerSessionManagerConfig:
      • 类型:CrawlerSessionManagerConfig。
      • 含义:用于配置与爬虫(可能是搜索引擎爬虫等)会话管理相关的配置,如果需要对爬虫的会话进行特殊处理的话。
    • securityDisabled:
      • 类型:boolean。
      • 含义:用于标识是否禁用安全相关的功能,如果设置为true,可能会跳过认证、授权等安全操作。
    • checkOtherSessionManagers:
      • 类型:boolean。
      • 含义:可能用于决定是否检查其他的会话管理器,具体含义取决于Undertow内部的会话管理机制。
    • deploymentCompleteListeners:
      • 类型:List<ServletContextListener>。
      • 含义:定义了部署完成监听器的列表,这些监听器在部署完成时会被触发,可以用于执行一些初始化或者后置处理操作。
    • preCompressedResources:
      • 类型:Map<String, String>。
      • 含义:定义了内容编码到文件扩展名的映射关系,可能用于处理预压缩资源(如已经压缩好的gzip文件),以便正确识别和处理这些资源。

    高级模式搜索该问题

    重写

    复制

    DeploymentInfo类的cloneable有哪些

    如何使用DeploymentInfo类的cloneable

    DeploymentInfo类的cloneable有什么用

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » UnderTow服务器
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!