超人汪小建(seaboat)
公众号:【远洋号】,笔名seaboat,擅长工程算法、人工智能算法、自然语言处理、计算机视觉、架构、分布式、高并发、大数据和搜索引擎等方面的技术,大多数编程语言都会使用,但更擅长Java、Python和C++。平时喜欢编程、绘画、看书、写作和运动,擅长素描、篮球、跑步、游泳、健身和羽毛球等运动项目。崇尚技术自由,崇尚思想自由。出版书籍:《Tomcat内核设计剖析》、《图解数据结构与算法》、《图解Java并发原理》、《人工智能原理科普》。
展开
-
Tomcat的BIO和NIO一些问题
前言最近一些朋友通过书籍找到我,问了一些关于tomcat中BIO和NIO的问题,这里列一下方便需要的朋友。后续也将前面有朋友问的问题整理下。。问只把 Tomcat 的 b...原创 2017-11-05 18:51:01 · 141 阅读 · 0 评论 -
《Tomcat内核设计剖析》勘误表
《Tomcat内核设计剖析》勘误表书中第95页图request部分印成了reqiest。书中第311页两个tomcat3,其中一个应为tomcat4。书中第5页URL应为URI。书中前言第13行,借签应为借鉴。原创 2017-06-29 11:30:39 · 3135 阅读 · 10 评论 -
谈谈Tomcat内核
========广告时间========鄙人的新书《Tomcat内核设计剖析》已经在京东销售了,有需要的朋友可以到 https://item.jd.com/12185360.html 进行预定。感谢各位朋友。为什么写《Tomcat内核设计剖析》=========================欢迎关注:原创 2017-08-21 18:26:10 · 3429 阅读 · 6 评论 -
ant编译tomcat
安装jdk,用jdk6即可,如果要编译JSR-356 (Java WebSocket 1.1)则需要jdk7.安装ant,Ant 1.8.2或更新版本。连到apache的svn上下载自己想要的版本,比如这里使用TOMCAT_7_0_73。Tomcat目录下新建build.properties文件,可以以build.properties.default文件作为模板修改,比如可以修改base.pa原创 2017-02-06 15:55:43 · 2004 阅读 · 0 评论 -
《Tomcat内核设计剖析》京东评论过百
到京东看了下《Tomcat内核设计剖析》评论都一百多了,上个月也第二次印刷了,这里看下好评、中评和差评。好评:中评对于中评,请看 为什么《写Tomcat内核设计剖析》,就当是回复吧。差评这个物流慢应该打给东哥。原创 2017-07-16 07:58:50 · 2545 阅读 · 0 评论 -
新书预售《Tomcat内核设计剖析》
鄙人的新书《Tomcat内核设计剖析》已经在京东预售了,有需要的朋友可以通过文末的连接进行预定。感谢各位朋友。本书特色?深入剖析Tomcat的每一个设计要点,使读者知其然,更知其所以然;拒绝没营养的直接贴代码分析,而是升华到对Tomcat设计思想的剖析;通篇采用大量插图来辅助文字解释,降低读者的理解门槛;层次分明,脉络清晰,由浅入深,循序渐进,确保知识讲解的连贯性和普适性。通过本书能快速建原创 2017-05-03 09:19:23 · 5909 阅读 · 21 评论 -
tomcat如何共享多个web应用会话
问题今天有位朋友问了个问题,大致是:tomcat下两个Java web,一个是商城,一个是直播,从商城登录后,再跳转到直播,发现处于非登录状态。解决思路将session抽出来成一个session服务,统一通过该服务操作session。tomcat内部用会话管理器获取会话时遍历所有context内的会话。方案1重写获取session方法即可。方案2找了源码发现已经支持类似遍历所有context内原创 2017-02-22 08:14:29 · 7095 阅读 · 8 评论 -
Tomcat怎么实现异步Servlet
有时Servlet在生成响应报文前必须等待某些耗时的操作,比如在等待一个可用的JDBC连接或等待一个远程Web服务的响应。对于这种情况servlet规范中定义了异步处理方式,由于Servlet中等待阻塞会导致Web容器整体的处理能力低下,所以对于比较耗时的操作可以放置到另外一个线程中进行处理,此过程保留连接的请求和响应对象,在处理完成之后可以把处理的结果通知到客户端。下面先看Servlet在同步情况原创 2016-11-17 22:39:29 · 11001 阅读 · 10 评论 -
Tomcat内核、集群、参数及性能
主题简介:内核实现原理 分布式集群生产部署关键参数性能监控和分析一、内核实现原理HTTPWeb服务器与浏览器之间以HTTP协议通信,浏览器要访问服务器即向服务器发送HTTP请求报文。如图,此处用get方法访问了localhost的8080端口的Web、Index、JSP,服务器返回200状态码并将一些HTTP报文返回到客户端。HTTP报文从图中可以看到原创 2018-01-24 10:34:54 · 2438 阅读 · 3 评论 -
Tomcat的BIO和NIO问题
前言最近一些朋友通过书籍找到我,问了一些关于tomcat中BIO和NIO的问题,这里列一下方便需要的朋友。后续也将前面有朋友问的问题整理下。。问只把 Tomcat 的 bio 模式改为 nio 模式,是否能提高服务器的吞吐量?发现在配置一样的情况下,两种模式压出来的吞吐量差不多。答要看你系统是不是整个都异步化了,因为tomcat的nio只是将网络io异步化了,就是接收和读写异步化了,但是网络报文接受原创 2017-11-05 18:41:15 · 3839 阅读 · 2 评论 -
75篇关于Tomcat源码和机制的文章
整理下前面写过的75篇关于Tomcat源码和机制的文章 文章列表 如何设计一个Web容器 Web安全认证机制知多少 Tomcat集群实现源码级别剖析 Tomcat集群如何同步会话 从单机到集群会话的管理之集群模式一 从单机到集群会话的管理之集群模式二(更大的集群) Tomcat集群的failover机制 Tomcat集群应用部署的实现机制 Tomcat集群机制剖原创 2016-12-30 16:00:31 · 20742 阅读 · 4 评论 -
Tomcat如何实现WebSocket
WebSocket协议属于HTML5标准,越来越多浏览器已经原生支持WebSocket,它能让客户端和服务端实现双向通信。在客户端和服务器端建立一条WebSocket连接后,服务器端消息可直接发送到客户端,从而打破传统的请求响应模式,避免了无意义的请求。比如传统的方式可能会使用AJAX不断请求服务器端,而WebSocket则可以直接发送数据到客户端且客户端不必请求。同时,由于有了浏览器的原生支持,编原创 2016-11-25 10:06:20 · 14392 阅读 · 2 评论 -
如何用Ant构建Tomcat
安装jdk,用jdk6即可,如果要编译JSR-356 (Java WebSocket 1.1)则需要jdk7.安装ant,Ant 1.8.2或更新版本。连到apache的...原创 2017-07-26 20:07:48 · 228 阅读 · 0 评论 -
为什么写《Tomcat内核设计剖析》
三四年前更多地还是做web业务开发,基本不关心web层以下的东西,但是每次出故障时面对现象都不能从脑子里形成由底层到应用层的完整的逻辑,往往只能分析到Web应用就无法继续往下,Web容器完全就是一个黑盒,对于问题更多的是靠猜。举个简单的例子,应用突然就不服务了,此时如果对Web容器模型熟悉就可以直接jstack打印虚拟机的栈进行分析。我个人接受不了这种用非完整性逻辑去分析事物的感觉,于是想着还是把T原创 2017-07-01 22:03:21 · 17913 阅读 · 24 评论 -
Tomcat的类加载器
Tomcat拥有不同的自定义类加载器,以实现对各种资源库的控制。一般来说,Tomcat主要用类加载器解决以下4个问题。同一个Web服务器里,各个Web项目之间各自...原创 2017-11-25 10:14:15 · 154 阅读 · 0 评论 -
Tomcat如何实现Comet
Comet模式是一种服务器端推技术,它的核心思想提供一种能让当服务器端往客户端发送数据的方式。Comet模式为什么会出现?刚开始人们在客户端通过不断自动刷新整个页面来更新数据,后来觉得体验不好又使用了AJAX不断从客户端轮询服务器更新数据,然后是使用Comet模式由服务器端通过长连接推数据。Comet模式能大大减少发送到服务器端的请求从而避免了很多开销,而且它还具备更好的实时性。如图所示,客户端发送原创 2016-12-15 16:37:19 · 9552 阅读 · 0 评论 -
Servlet规范总结
Servlet接口Servlet规范的核心接口即是Servlet接口,它是所有Servlet类必须实现的接口,在Java Servelt API中已经提供了两个抽象类方便开发者实现Servlet类,分别是GenericServlet 和 HttpServlet,GenericServlet定义了一个通用的、协议无关的Servlet,而HttpServlet则定义了Http协议的Servlet,这两个原创 2016-10-08 08:49:39 · 11182 阅读 · 4 评论 -
关于tomcat中Servlet对象池
Servlet在不实现SingleThreadModel的情况下运行时是以单个实例模式,如下图,这种情况下,Wrapper容器只会通过反射实例化一个Servlet对象,对应此Servlet的所有客户端请求都会共用此Servlet对象,而对于多个客户端请求tomcat会使用多线程处理,所以应该保证此Servlet对象的线程安全,多个线程不管执行顺序如何都能保证执行结果的正确性。例如刚做web应用开发时原创 2016-08-24 08:07:22 · 5439 阅读 · 2 评论 -
tomcat请求路由映射核心组件Mapper
Mapper组件的核心功能是提供请求路径的路由映射,根据某个请求路径通过计算得到相应的Servlet(Wrapper)。这节看下Mapper的实现细节,包括Host容器、Context容器、Wrapper容器等的映射关系以及映射算法。如果要将整个tomcat容器中所有的web项目以能够以Servlet级别组织起来,需要一个多层级的类似Map结构的存储空间。如上图,以Mapper作为映射的入口,按照容原创 2016-07-17 18:46:59 · 7141 阅读 · 0 评论 -
tomcat集群的failover机制
集群要提供高可用性就必须要有某种机制去保证,常用的机制为failover(故障转移),简单说就是通过一定的heartbeat检测是否有故障,一旦故障发生备份节点则接管故障节点的工作。tomcat使用BackupManager模式管理会话必须由负载均衡器提供会话黏贴(Session Stick)机制配合,所谓会话黏贴其实是一种会话定位技术,即在tomcat节点上生成一种包含位置信息的会话id,一般是附原创 2016-08-03 09:44:22 · 5585 阅读 · 0 评论 -
基于若引用的内存泄漏检测
在Java中,引用分为强引用、软引用、弱引用和虚引用四种。强引用,代码中普遍存在的形式,例如常见的普通类new出对象后的引用。GC不会回收强引用的对象。软引用,软引用对象会在内存溢出异常之前进行回收,也就是说在内存富裕的情况下GC不回收软引用。它可通过SoftReference类实现。弱引用,弱引用对象会在下一次GC时被回收,也就是说不管内存富不富裕,当GC时都会回收弱引用。它可通过WeakRe原创 2016-07-19 09:27:11 · 3714 阅读 · 0 评论 -
注解机制及其原理
什么是注解注解也叫元数据,例如我们常见的@Override和@Deprecated,注解是JDK1.5版本开始引入的一个特性,用于对代码进行说明,可以对包、类、接口、字段、方法参数、局部变量等进行注解。它主要的作用有以下四方面:生成文档,通过代码里标识的元数据生成javadoc文档。编译检查,通过代码里标识的元数据让编译器在编译期间进行检查验证。编译时动态处理,编译时通过代码里标识的元数据动态处原创 2016-06-17 11:23:59 · 30504 阅读 · 8 评论 -
Tomcat如何检测内存泄漏
一般情况下,如果我们重启web应用是通过重启tomcat的话,则不存在内存泄漏问题。但如果不重启tomcat而对web应用进行重加载则可能会导致内存泄漏,因为重加载后有可能会导致原来的某些内存无法让GC回收,例如web应用使用了JDBC,驱动会进行注册,当web应用停止时没有反注册就会导致内存泄漏。看看是什么原因导致tomcat内存泄漏的。这个要从热部署开始说起,因为tomcat提供了不必重启容器而原创 2016-06-20 09:58:15 · 16117 阅读 · 10 评论 -
应用直接中断连接导致数据被锁(生产故障)
这是一个由应用重启连接直接而导致数据被锁的问题。系统大致结构基本情况:整个架构为了统一管理db连接,共享连接。应用通过loadbalance连接db访问层。db访问层后端代理若干db。应用到loadbalance以mysql协议通信。db访问层到db以JDBC方式通信。故障: 某些数据库中的表数据相当长一段时间被锁,导致应用某些场景失败。故障分析:应用开启一个事务的set autoco原创 2016-07-05 12:24:46 · 2530 阅读 · 0 评论 -
Tomcat集群如何同步会话
Tocmat集群中最重要的交换信息就是会话消息,对某个tomcat实例某会话做的更改要同步到集群其他tomcat实例的该会话对象,这样才能保证集群所有实例的会话数据一致。在tribes组件的基础上完成这些工作就相当容易些,tribes是tomcat实现的一个通信框架。如下图,tomcat实现会话同步的过程中大致会使用如下组件,现在假设中间的tomcat实例的会话改变了,它会通过会话管理器Manage原创 2016-08-05 08:59:20 · 9095 阅读 · 1 评论 -
tomcat中Servlet的工作机制
在研究Servlet在tomcat中的工作机制前必须先看看Servlet规范的一些重要的相关规定,规范提供了一个Servlet接口,接口中包含的重要方法是init、service、destroy等方法,Servlet在初始化时要调用init方法,在销毁时要调用destroy方法,而对客户端请求处理时则调用service方法。对于这些机制的支持都必须由Tomcat内部去支持,具体则是由Wrapper容原创 2016-08-22 08:27:56 · 7347 阅读 · 11 评论 -
dbcp连接池不合理的锁导致连接耗尽
应用报错,表象来看是连接池爆满了。org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for transaction; nested exception is org.apache.commons.dbcp.SQLNestedException: Canno原创 2016-08-08 09:39:41 · 23240 阅读 · 0 评论 -
Tomcat集群应用部署的实现机制
集群应用部署是一个很重要的应用场景,设想一下如果没有集群应用部署功能,每当我们发布应用时都要登陆每台机器对每个tomcat实例进行部署,这些工作量都是繁杂且重复的,而对于进步青年的程序员来说是不能容忍重复的事情发生的。于是需要一种功能可以在集群中某实例部署后,集群中的其他tomcat实例会自动完成部署。集群部署主要分两部分内容。第一部分是关于应用传输问题,主要是关于在tomcat中如何一个web应原创 2016-08-10 08:30:09 · 13245 阅读 · 0 评论 -
ServletContainerInitializer初始化器
在web容器启动时为提供给第三方组件机会做一些初始化的工作,例如注册servlet或者filtes等,servlet规范中通过ServletContainerInitializer实现此功能。每个框架要使用ServletContainerInitializer就必须在对应的jar包的META-INF/services 目录创建一个名为javax.servlet.ServletContainerIni原创 2016-07-24 14:08:56 · 17452 阅读 · 10 评论 -
tomcat配置集群
在Tomcat中使用集群功能相对简单。最简单的用法是直接在server.xml文件的或节点下添加<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>配置,这意味着集群相关的配置都使用默认的,它其实等同于<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpClus原创 2016-08-16 14:44:10 · 2711 阅读 · 0 评论 -
类加载器的双亲委派及打破双亲委派
一般的场景中使用Java默认的类加载器即可,但有时为了达到某种目的又不得不实现自己的类加载器,例如为了达到类库的互相隔离,例如为了达到热部署重加载功能。这时就需要自己定义类加载器,每个类加载器加载各自的类库资源,以此达到资源隔离效果。在对资源的加载上可以沿用双亲委派机制,也可以打破双亲委派机制。一、沿用双亲委派机制自定义类加载器很简单,只需继承ClassLoader类并重写findClass方法即可原创 2016-06-30 08:52:26 · 14846 阅读 · 12 评论 -
tomcat如何路由映射网址
对于web容器来说,根据请求客户端路径路由到对应的资源属于其核心功能,假设用户在自己电脑上使用浏览器输入网址http://www.test.com/test/index.jsp,报文通过互联网网络到达该主机服务器,服务器应将其转到test应用的index.jsp页面中进行处理,然后再返回。针对tomcat,为了更加详细说清楚这个过程,引入一张图, 客户端浏览器输入http://tomcat.a原创 2016-07-11 09:56:22 · 9210 阅读 · 2 评论 -
DBCP连接池TestOnBorrow的坑
生产环境连接池TestOnBorrow设置为false,导致有时获取的连接不可用。分析如下:TestOnBorrow=false时,由于不检测池里连接的可用性,于是假如连接池中的连接被数据库关闭了,应用通过连接池getConnection时,都可能获取到这些不可用的连接,且这些连接如果不被其他线程回收的话,它们不会被连接池被废除,也不会重新被创建,占用了连接池的名额。The last packet原创 2016-08-15 11:03:04 · 41406 阅读 · 6 评论 -
Tomcat如何实现资源安全管理
在了解了认证模式及Realm域后,我们看看Tomcat是如何设计实现资源安全管理的。在认证模式上,必须要支持多种认证模式,包括Basic模式、Digest模式、Form模式、Spnego模式、SSL模式及NonLogin模式。如何实现这些认证模式比较优雅,或者说比较清晰?看下图,在tomcat中一个请求从浏览器发送过来后,请求接收后会流向四个级别容器处理,即Engine->Host->Contex原创 2016-04-26 09:10:04 · 2701 阅读 · 0 评论 -
web安全认证机制知多少
如今web服务随处可见,成千上万的web程序被部署到公网上供用户访问,有些系统只针对指定用户开放,属于安全级别较高的web应用,他们需要有一种认证机制以保护系统资源的安全,本文将探讨五种常用的认证机制及优缺点。Basic模式HTTP协议规范中有两种认证方式,一种是Basic认证,另外一种是Digest认证,这两种方式都属于无状态认证方式,所谓无状态即服务端都不会在会话中记录相关信息,客户端每次访问原创 2016-05-07 08:37:24 · 19599 阅读 · 0 评论 -
tomcat的realm域
Realm域,其实可以看成是一个包含了用户及密码的数据库,而且每个用户还会包含了若干角色。也就是包含了用户名、密码、角色三个列的数据记录集合,如下图,最下面椭圆内的包含的整块即可以看成realm域。它的出现是为了方便统一地提供一种X(用户,密码,权限)与Y(web资源)的映射关系。 我们有三个web应用的资源及对应资源访问角色,web1应用中url1资源必须拥有role1角色的用户才可以访原创 2016-04-26 09:13:12 · 2922 阅读 · 0 评论 -
Web资源认证原理
Web服务器与浏览器之间的认证流程没有规定的步骤,根据不同的认证模式及鉴权方式可能会有不同的执行步骤。下图用一个最简单的流程了解整个认证过程是如何工作的,首先浏览器向服务器发起请求,然后服务器向浏览器质问用户名及密码,浏览器带上用户名及密码重新请求,服务器根据用户名获取相应角色并判断是否有权限访问该资源,最后通过认证后返回受保护资源。 在这整个过程中可以分为客户端与服务端交互、服务端权限验原创 2016-04-26 09:16:36 · 4303 阅读 · 0 评论 -
JSP编译成Servlet(一)语法树的生成——语法解析
一般来说,语句按一定规则进行推导后会形成一个语法树,这种树状结构有利于对语句结构层次的描述。同样Jasper对JSP语法解析后也会生成一棵树,这棵树各个节点包含了不同的信息,但对于JSP来说解析后的语法树比较简单,只有一个父节点和n个子节点。例如node1是表示形如字符串 -->的注释节点,节点里面包含了一个表示注释字符串的属性;而node2则可能是表示形如的表达式节点,节点里面包含一个表示表达式原创 2016-03-18 16:46:28 · 4516 阅读 · 1 评论 -
非阻塞通道
非阻塞通道非阻塞通道用于负责将数据读到缓冲区中,或将数据从缓冲区中写入,这个类的作用主要是用于屏蔽非SSL与SSL读写操作细节的不同,这个类实现了ByteChannel接口,此接口只有write、read两个操作字节流的方法,细节正是屏蔽在这两个操作中,例如非SSL通信时,报文本来就是明文,可直接读取,而对于SSL通信,报文属于加密后的密文,解密后才是真正需要的报文。同样地,对于非SSL通信直接写原创 2016-01-04 11:49:22 · 2506 阅读 · 0 评论 -
认证模式之Form模式
上面介绍的两种模式都属于HTTP协议规范范畴,由于它的规范使得很多东西无法自定义,例如登录窗口、错误展示页面。所以需要另外一种模式提供更加灵活的认证,也就是基于Form的认证模式。Form模式的认证流程如下:①浏览器发送http报文请求一个受保护的资源。②服务端的web容器判断此uri为受保护资源,于是将请求重定向到自定义的登陆页面上,例如login.html页面,可以自定义登陆页面的样式,但要遵原创 2016-04-15 18:13:39 · 6081 阅读 · 0 评论