5. 与 HTTP 协作的 Web 服务器
一台 Web 服务器可搭建多个独立域名的Web网站,也可作为通信路径上的中转服务器提升传输效率
用单台虚拟主机实现多个域名HTTP/1.1 规范允许一台 HTTP 服务器搭建多个Web站点。比如,提 供 Web 托管服务(Web Hosting Service)的供应商,可以用一台服务器为多位客户服务,也可以以每位客户持有的域名运行各自不同的网站。这是因为利用了虚拟主机(Virtual Host,又称虚拟服务器)的功能
在互联网上,域名通过DNS服务映射到IP地址(域名解析)之后访问目标网站。可见,当请求发送到服务器时,已经是以 IP 地址形式访问了。
所以,如果一台服务器内托管了 www.tricorder.jp 和 www.hackr.jp 这 两个域名,当收到请求时就需要弄清楚究竟要访问哪个域名。
在相同的 IP 地址下,由于虚拟主机可以寄存多个不同主机名和域名的Web网站,因此在发送HTTP请求时,必须在Host首部内完整指定主机名或域名的URI。
通信数据转发程序 :代理、网关、隧道HTTP 通信时,除客户端和服务器以外,还有一些用于通信数据转发的应用程序 ...
5. 布隆过滤器
我们先思考一个问题,如果想要判断一个元素是否存在,你通常会怎么做?一般的做法都是将其保存起来然后通过比较确认,一共会有如下几种情况:
如果使用线性表或者数组存储,则查找的时间复杂度为 O(n)。
如果使用树存储,则查找的时间复杂度为 O(logn)。
如果使用哈希表存储,则查找的时间复杂度为 O(log(n/m)),m 为哈希分桶数。
对于上述三种情况,肯定倾向于哈希表,因为其时间复杂度最低(在极端情况下时间复杂度可以为 O(1) )。
但是哈希表也有缺陷,例如存储容量占比高,考虑到负载因子的存在,通常存储空间都不会被用完。当然无论是哈希表、树、线性表,一旦元素的数量极多时,查询的速度会变得很慢,而且占用的空间也会大到无法想象。那么有办法解决没有呢?答案是有,布隆过滤器就是解决该问题的利器。
设计思想布隆过滤器是一个由 一个长度为 M 比特的位数组(bit array)与 K 个哈希函数(hash function) 组成的数据结构。布隆过滤器主要用于用于检索一个元素是否在一个集合中。位数组中的元素初始值都是 0 ,所有哈希函数可以把输入的数据均匀低散列。图例如下 ...
6. 请求处理一览
FrameworkServlet实际上,FrameworkServlet 才是真正的入门。FrameworkServlet 会实现
#doGet(HttpServletRequest request, HttpServletResponse response)
#doPost(HttpServletRequest request, HttpServletResponse response)
#doPut(HttpServletRequest request, HttpServletResponse response)
#doDelete(HttpServletRequest request, HttpServletResponse response)
#doOptions(HttpServletRequest request, HttpServletResponse response)
#doTrace(HttpServletRequest request, HttpServletResponse response)
#service(HttpServletRequest re ...
6. 内存回收(收集器种类)
垃圾收集器概述垃圾收集器是垃圾回收算法(标记-清除算法、复制算法、标记-整理算法、火车算法)的具体实现,不同商家、不同版本的JVM所提供的垃圾收集器可能会有很在差别,本文主要介绍HotSpot虚拟机中的垃圾收集器。
垃圾收集器组合JDK7/8后,HotSpot虚拟机所有收集器及组合(连线),如下图:
图中展示了7种不同分代的收集器:
Serial(串行GC)收集器
ParNew(并行GC)收集器
Parallel Scavenge(并行回收GC)收集器(串行GC)收集器
Serial Old(串行GC)收集器
Parallel Old(并行GC)收集器
CMS(并发GC)收集器
G1 JDK1.7提供的一个新收集器
它们所处区域,则表明其是属于新生代收集器还是老年代收集器:
新生代收集器:Serial、ParNew、Parallel Scavenge;
老年代收集器:Serial Old、Parallel Old、CMS;
整堆收集器:G1;
两个收集器间有连线,表明它们可以搭配使用
其中Serial Old作为CMS出现”Concurrent Mo ...
6. CPU消耗分析
在 Linux 中, CPU 主要用于中断、内核及用户进程的任务处理,优先级为中断 > 内核 > 用户进程,在学习如何分析 CPU 消耗状况前,还有三个重要的概念要阐述。
##概念
上下文切换每个 CPU (或多核心 CPU 中的每核 CPU )同一时间只能执行一个线程, Linux 采用的是抢占式调度,即为每个线程分配一定的执行时间。线程执行时间到达而切换到其它线程时,就会触发上下文切换。上下文切换过多会造成内核占据较多的 CPU 使用,使得应用的响应速度下降。
对于JAVA应用,典型的是进行文件IO操作、网络IO操作、锁等待或线程sleep时,当线程进入阻塞或等待,会触发上下文切换
运行队列每个 CPU 都维护了一个可运行的线程队列。
例如:4核CPU,JAVA应用启动了8个线程,且都是出于运行状态,那么在平均分配情况下,每个CPU中的运行队列就有2个线程
通常系统的load由CPU运行队列来决定,运行队列值越大则线程需要消耗越长的时间才能执行完
通常建议控制在每个 CPU 核上的运行队列为 1-3 个。
利用率CPU 利用率为 CPU 在用户进程、内核、 ...
6. ⼀级缓存
在进行数据库查询之前,MyBatis首先会检查以及缓存中是否有相应的记录,若有的话直接返回即可。一级缓存是数据库的最后一道防护,若一级缓存未命中,查询请求将落到数据库上。
一级缓存是在 BaseExecutor 被初始化的
123456789public abstract class BaseExecutor implements Executor { protected PerpetualCache localCache; // 省略其他字段 protected BaseExecutor(Configuration configuration, Transaction transaction) { this.localCache = new PerpetualCache("LocalCache"); // 省略其他字段初始化方法 }}
一级缓存的类型为 PerpetualCache,没有被其他缓存类装饰过。
一级缓存所存储从查询结果会在MyBatis执 ...
6
假设我们有这样一条 SQL 语句:
1SELECT * FROM author WHERE name = #{name} AND age = #{age}
SQL 语句中包含两个#{}占位符,在运行时这两个占位符会被解析成两个ParameterMapping 对象。如下:
12345ParameterMapping{property='name', mode=IN, javaType=class java.lang.String, jdbcType=null, ...} ParameterMapping{property='age', mode=IN, javaType=class java.lang.Integer, jdbcType=null, ...}
#{xxx}占位符解析完毕后,得到的 SQL 如下:
1SELECT * FROM Author WHERE name = ? AND age = ?
假设下面这个方法与上面的 S ...
6. 解析sql节点
sql节点用来定义一些可重用的 SQL 语句片段,比如表名,或表的列名等。在映射文件中,我们可以通过include节点引用sql节点定义的内容。
12345678910<sql id="table"> article</sql><select id="findOne" resultType="Article"> SELECT id, title FROM <include refid="table"/> WHERE id = #{id}</select><update id="update" parameterType="Article"> UPDATE <include refid="table"/> SET title = #{title} WHERE id = #{id}< ...
6. 解析plugins节点
插件是 MyBatis 提供的一个拓展机制,通过插件机制我们可在 SQL 执行过程中的某些点上做一些自定义操作。
实现一个插件需要比简单,首先需要让插件类实现 Interceptor接口。然后在插件类上添加@Intercepts 和@Signature 注解,用于指定想要拦截的目标 方法。MyBatis 允许拦截下面接口中的一些方法:
Executor: update,query,flushStatements,commit,rollback,getTransaction,close,isClosed
ParameterHandler: getParameterObject,setParameters
ResultSetHandler: handleResultSets,handleOutputParameters
StatementHandler: prepare,parameterize,batch,update,query
比较常见的插件有分页插件、分表插件等
实例:
12345<plugins> <plugin interceptor=&qu ...
6. HTTP 首部
HTTP 协议的请求和响应报文中必定包含 HTTP 首部,只是我们平时 在使用 Web 的过程中感受不到它。
HTTP 报文首部HTTP 协议的请求和响应报文中必定包含HTTP首部。
首部内容为客户端和服务器分别处理请求和响应提供所需要的信息。对于客户端用户来说,这些信息中的大部分内容都无须亲自查看。
HTTP 请求报文在请求中,HTTP 报文由方法、URI、HTTP 版本、HTTP 首部字段等 部分构成。
示例信息
HTTP 响应报文在响应中,HTTP 报文由 HTTP 版本、状态码(数字和原因短语)、 HTTP 首部字段 3 部分构成。
示例信息
在报文众多的字段当中,HTTP首部字段包含的信息最为丰富。首部字段同时存在于请求和响应报文内,并涵盖 HTTP报文相关的内容信息。
HTTP 首部字段
HTTP 首部字段传递重要信息HTTP 首部字段是构成 HTTP报文的要素之一。在客户端与服务器之间以HTTP协议进行通信的过程中,无论是请求还是响应都会使用首部字段,它能起到传递额外重要信息的作用。
使用首部字段是为了给浏览器和服务器提供报文主体大小、所使用的语言、认证信息等内 ...