小工具      在线工具  汉语词典  css  js  c++  java

Tomcat连接器:Coyote框架

Java 额外说明

收录于:97天前

不管Tomcat容器设计得多么精巧,Tomcat本质上还是一个http服务器,需要从socket获取HTTP数据流;另一方面,容器只能处理封装好的org.apache.coyote.Request(该类的具体用途(下面会讲到),需要有一个从socket到Request的转换过程。因此,重要的是连接套接字和容器的任务留给了 Coyote

Coyote简介
coyote(北美的一种狼、山狗)

Coyote 是 tomcat 的 Connector 框架的名称。简单来说,coyote 处理底层的 socket,将 http 请求、响应等字节流级别的东西封装成两个类:Request 和 Response(这两个类是 tomcat 定义的,而不是 servlet 中的 ServletRequest 和 ServletResponse),供容器使用;同时,为了让我们编写的servlet能够获取ServletRequest,tomcat使用门面模式将更底层、更底层的Request封装成ServletRequest(这个过程通常发生在Wrapper容器层面),这个也是很多人津津乐道的tomcat对设计模式的巧妙运用。具体流程稍后再讲。

因此,coyote本质上以Request类的形式为tomcat容器提供了对底层socket连接数据的封装,让容器能够访问底层数据。

至于连接池、线程池等直接处理socket的事情,tomcat就交给了org.apache.tomcat.util.net包的类来完成,这里暂时不讨论。

http://www.webweavertech.com/costin/archives/000421.html 
这个网页很好的描述了coyote的作用和设计思想,并介绍了其中几个影响性能的核心类

org.apache.coyote
这个包里面的主要是coyote框架的接口

Adapter
“适配器”在这里的意思,是指“凡是使用coyote连接器的容器,都要实现这个接口,以便从coyote连接器接收请求和响应数据”,当然这里的请求和响应是org.apache.coyote.Request和Response

ProtocolHandler
每个ProtocolHandler,代表着对一种协议的支持,比如tomcat默认支持的协议有http1.1和ajp。根据支持的协议,ProtocolHandler里面通常包含了一个实现对应协议的Handler接口的处理类,用于接收socket对象,再交给对应协议的Processor类(然而这个Processor类没有实现Processor接口,而是实现了ActionHook接口),最后由Processor类交给实现了Adapter接口的容器(准确的说是该容器的Pipeline的第一个Valve)

Processor
这个接口已经废弃了,通常tomcat的Processor实现类实现的接口是ActionHook。你会看到许多名为“XXXProcessor”的类,但其实他们实现的接口却是ActionHook

ActionHook
本接口代替了Processor接口,成为所有Processor实现类的标准接口。其方法只有一个:public void action( ActionCode actionCode, Object param); 
ActionCode是一个静态类,说白了是一堆常量(估计以后会改成enum),即对应不同的ActionCode,ActionHook要作出不同的动作,至于param是用于传递一些信息的,通常会把调用者“this”传递进去

InputBuffer和OutputBuffer
两个接口都只有一个方法,分别是doread和dowrite,就是把数据从ByteChunk参数读出或者写入ByteChunk。然而“数据”从何而来、怎样写进ByteChunk,还得看不同的类实现

Request,Response
鉴于其重要性,下面专文讲述

Request和Response
Request这个类可谓tomcat的一大核心,几乎所有connector和容器都要用到它

Request类实现了底层http字节流的封装,因为http本质上是一串来自网络的字节流,按照http协议逻辑上分为header和body,而header有很多字段(包括 MIME 字段)。 Request的作用就是将这些字节封装成相应的字段,达到最优的处理效率。

因此,Request中的大部分方法都是字段get方法(set方法不多,因为大多数字段都是不可变的)。另外,还有为容器提供的方法,比如recycle、inputbuffer等,但最重要的是Request如何提高处理效率

对于底层处理字节流的DO(数据对象)来说,性能瓶颈在于内存的使用(因为字节是放在内存块中的)。如果内存能够被有效地利用,那么它就能被有效地利用。提高溶解氧性能。

如果我们被要求实现这个Request类,大多数人的第一反应是使用String来表示每个http头字段。但是String的效率低下,根本无法满足服务器的性能要求。

Request 的注释告诉我们,它的大部分字段都是“GC free”的,也就是说,它们很少甚至从不被垃圾回收。消除了Java中最大的性能瓶颈之一,Request的自然性能得到了很大的提升。

另外,对其字段的一些耗时操作会延迟到用户代码级别。也就是说,在内部使用Request时,tomcat会尽力确保其字段处于原始字节状态(而不是尝试到处使用String)。直到用户代码(即我们编写的servlet)需要时才会执行转换。如果不使用(实际上我们编程时http请求的大部分字段都没有使用),则不会进行任何转换。这进一步挖掘了更多的性能潜力,其思想与“延迟加载”设计模式如出一辙。

当然,Tomcat程序员也是人,也喜欢偷懒。没有人愿意直接操作字节数组,因为出错的风险也很高。因此,tomcat的org.apache.tomcat.util包定义了很多用于操作和维护字节数组的底层工具类。 Request的字段是MessageBytes类型的,它就是其中之一。

至于Response,原理和Request类似,但是Response要简单得多。最明显的就是里面的字段效率不如Request。相反,直接使用 String。也许Response对整体效率影响不大。或者当前版本的tomcat还没有修改


原文:https://blog.csdn.net/wangchengsi/article/details/2973012 
 

. . .

相关推荐

额外说明

收缩 tempdb 数据库

文章目录 客户需求 需求分析 尝试 解决方案 参考资料 客户需求 这是一个生产环境,在夜深人静的时候发现 tempdb 已经超过500GB。 需求分析 我们知道,如果重启 SQL Server,tempdb 会自动重新创建,从而使 tempdb 回归到初

额外说明

MYBATIS04_@Param参数,#{}和${},返回参数resultMap,主键写回两种方式

文章目录 ①. @Param参数详解 ②. ${}和#{}的区别 ③. resultType、resultMap ④. 主键回写两种方式 ①. @Param参数详解 ①. @Param的作用就是给参数命名,比如在mapper里面某方法A(int id),

额外说明

如何修改domino应用库签名与dos输出重定向

问题1 如何修改应用库签名   描述:当从另外一台服务器上拷贝一个应用库到新建立的一台服务器上,应用库的签名还是原来的签名,面对这样的问题,我们应该怎样来修改其签名,将签名改成自己想要的签名。 基本办法: 首先用自己想要的用户登陆服务器。 其次打开管理控

额外说明

编译原理(龙书):第六章部分题目参考答案

目录 6.1.1 6.1.2 6.2.1 (1) (3) 6.3.1 6.4.1 6.4.2 6.4.3 6.4.6 6.5.1 6.6.1 (2) 6.6.2 6.6.4 6.7.1 6.7.2 6.7.3 6.1.1 6.1.2 6.2.1 (1)

额外说明

使用GDIView排查GDI对象泄漏导致的程序UI界面绘制异常问题

目录 1、问题说明 2、初步分析 3、查看任务管理器,并使用GDIView工具分析

额外说明

Python-Matplotlib可视化(9)——精通更多实用图形的绘制

Python-Matplotlib可视化(9)——精通更多实用图形的绘制 前言 可视化二维数组的内容 为图形添加色彩映射图例 二维标量场的可视化 等高线的可视化 二维向量场的可视化 系列链接 前言 Matplotlib是Python的绘图库,它提供了一整

额外说明

【从删库到跑路】MySQL数据库的查询(单表查询,多表查询,内外连接,联合查询,子查询)

-专栏【MySQL】 -喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 -音乐分享【如愿】 大一同学小吉,欢迎并且感谢大家指出我的问题- 文章目录 -多表查询 ⭐多表关系 -一对多(多对一) -实现 -多对多 -实现 -以图形化的方式来表示 -一对一 -实

额外说明

项目解读_v2

1. 项目介绍 如果使用task2-1作为示例时, 运行process.py的过程中需要确认 process调用的是函数 preprocess_ast_wav2vec(wav, fr) 1.1 任务简介 首个开源的儿科呼吸音数据集, 通过邀请11位医师标

额外说明

系统资源分析CPU和内存统计以及网络分析

CPU统计 CPU与GPU的关系 GPU是一种图形处理器,它不会与CPU直接去通信,而是通过中间件链接这两部分,中间层会维护一个队列,CPU会把displayed list放在队列中,而GPU会从队列中取出数据进行绘制 我们可以借助安卓手机的GPU渲染模

额外说明

elsticsearch搭建集群报错:with the same id but is a different node instance

with the same id but is a different node instance :具有相同的ID但却是不同的节点实例 报错:     搭建elsticsearch集群,配置信息都是正确的,但是只要一个节点A启动另一个节点B在启动就会报

ads via 小工具