TABLE OF CONTENTS

  1. 深入Web请求过程
    1. DNS域名解析
      1. 资源记录(Resource Records)
      2. DNS工具
      3. 常见域名解析记录类型
    2. CDN工作机制
  2. 深入分析Java I/O的工作机制
    1. Java NIO
  3. 深入理解Java Web中的编码问题

深入Web请求过程

Web请求过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
                                http	        +----------+                                                                                                     
+---------------------> DNS |
| +----------+
|
| http +----------------------+
| +----------------------------------------> CDN | http反向代理
| | |css/js/img等静态资源 |<-----------------------+
| | +----------------------+ |
| | +-------------------------------------------v---------+
+---------|----|----+ +--------------------+ | +------------+ +----------------------------+ |
| User Browser | |Elastic Load Balance| | |Load Balance| | 服务端系统 | |
--------------> css/html/js/img |------> | +---------+ ------------> +---------+| | | |
| | http | | ELB | | http | | | SLB || | +----------+ +---------+ | |
+-------------------+ | +---------+ | | | +---------+|------> | | | | | |
| +---------+ | | | +---------+| | | AZ 1 | | AZ 2 | | |
| | ELB | | | | | SLB || | +----------+ +---------+ | |
| +---------+ | | | +---------+| +----------------------------+ |
+--------------------+ | +------------+ ^ ^ ^ |
+----------------------|---------|---------------|----+
| | v
+-----------v-+ +---v--------+ +--------+
| | | 文件系统 | | |
| 分布式缓存 | +------------+ | 数据库 |
| | | |
+-------------+ +--------+

DNS域名解析

资源记录(Resource Records)

所有RRs的顶层格式都相同。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
                                1  1  1  1  1  1
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| |
/ /
/ NAME /
| |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| TYPE |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| CLASS |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| TTL |
| |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| RDLENGTH |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--|
/ RDATA /
/ /
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

格式说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
NAME            an owner name, i.e., the name of the node to which this
resource record pertains.

TYPE two octets containing one of the RR TYPE codes.

CLASS two octets containing one of the RR CLASS codes.

TTL a 32 bit signed integer that specifies the time interval
that the resource record may be cached before the source
of the information should again be consulted. Zero
values are interpreted to mean that the RR can only be
used for the transaction in progress, and should not be
cached. For example, SOA records are always distributed
with a zero TTL to prohibit caching. Zero values can
also be used for extremely volatile data.

RDLENGTH an unsigned 16 bit integer that specifies the length in
octets of the RDATA field.

一级域名:主机名+域名后缀。例如:tsukasa.moe
二级域名:一级域名下面的主机名。例如:www.tsukasa.moe

浏览器缓存->操作系统缓存(host)->本地域名服务器(LDNS)->根域名服务器->主域名服务器(gTLD Server)->Name Server

DNS工具

host
nslookup
dig

这三个工具功能丰富度、复杂度依次递增,其中nslookup在windows中也可以使用。

dig命令用法:

  • dig tsukasa.moe
  • dig tsukasa.moe ns
  • dig tsukasa.moe mx
  • dig tsukasa.moe +trace

nslookup命令用法:可以使用交互或非交互模式进行查询。

  • 直接输入nslookup进入交互式模式,默认连接到默认域名服务器(即/etc/resolv.conf的第一个dns地址),输入域名即可查询。
  • 交互模式中,使用set type=mx可以修改要查询的记录类型,再输入域名即可返回相应结果
  • 非交互模式下,nslookup - 127.0.0.1即设置域名服务器ip

host命令用法:
host baidu.com -> 默认输出只有A和MX记录
host -a baidu.com -> 输出与dig baidu.com一样的信息
host -t ns baidu.com -> -t是指定type,可以用host –help查看
host -C baidu.com -> 查询SOA权威域名服务器

常见域名解析记录类型

TTL:缓存失效时间。
MX优先级:数值越低,优先级越高

记录类型 定义 示例 说明
A记录 将域名指向一个ip 主机记录www,记录值127.0.0.1 将二级域名www.tsukasa.moe映射到127.0.0.1
CNAME记录 将域名指向另一个域名,再由另一个域名提供IP地址 主机记录@,记录值www
MX记录 设置邮箱,让邮箱能够收到邮件 主机记录@,记录值填域名m.tsukasa.moe或IP地址,MX优先级5 邮箱地址为xxx@m.tsukasa.moe
NS记录 将子域名交给其他DNS服务商解析 主机记录www,记录值DNS服务器域名f1g1ns1.dnspod.net 将子域名www.tsukasa.moe授权给DNS服务器解析
AAAA记录 将域名指向一个 IPv6 地址 主机记录www,记录值ipv6地址1030::C9B4:FF12:48AA:1A2B,线路类型为联通 连通用户单独访问1030::C9B4:FF12:48AA:1A2B
SRV记录 标识某台服务器使用了某个服务,常见于微软系统的目录管理 主机记录_sip._tcp(格式:服务的名字.协议的类型),记录值0 5 5060 sipserver.tsukasa.moe(格式:优先级 权重 端口 目标地址)

参考

https://tools.ietf.org/html/rfc1035
https://skyao.io/learning-dns/
http://luodw.cc/2015/12/27/dns03/
https://blog.csdn.net/a19881029/article/details/19486949

CDN工作机制

内容分布网络(Centent Delivery Network):一种先进流量分配网络,用户可以就近边缘节点访问网站发布内容,响应快速。
CDN=镜像+缓存+整体负载均衡

负载均衡通常有3种架构:链路负载均衡、集群负载均衡、操作系统负载均衡

  • 链路:DNS解析来完成
  • 集群:分硬件、软件负载均衡两种,硬件负载均衡如F5设备,较为昂贵。

深入分析Java I/O的工作机制

I/O接口分类

  • 字节:InputStream和OutputStream
  • 字符:Reader和Writer
  • 磁盘:File
  • 网络:Socket

前面两组主要是传输数据的数据格式,后两组是传输数据的方式,可以组合使用。
文件是操作系统与磁盘交互的最小单元,最小的存储单元是字节,而非字符。

1.标准访问文件的方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
           read()                              write()                   
^ |
| v
+---------------------------------------------------------+
| +-----------------+ +-----------------+ |
| | 应用缓存 | 用户地址空间 | 应用缓存 | |
| +-----------------+ +-----------------+ |
+---------^-----------------------------------------------+
| |
---------------|-----------------------------------|---------------------
| v
+---------------------------------------------------------+
| +-----------------+ +-----------------+ |
| | 高速页面缓存 | 内核地址空间 | 高速页面缓存 | |
| +-----------------+ +-----------------+ |
+---------------------------------------------------------+
^ |
| |
| v
+-----------------------------------------+
| 物理磁盘 |
| |
+-----------------------------------------+

2.直接I/O方式:应用程序直接访问磁盘数据,而不经过操作系统内核缓冲区,加载速度慢。
3.同步访问:性能较差。
4.异步访问:当请求数据返回后继续处理下面的操作,可以提高应用效率,但不改变访问文件的效率。
5.内存映射:将内存中某一块区域与磁盘中的文件关联起来,访问内存中的一段数据时,转为访问文件的某一段数据。

Java序列化

  • 将一个对象转化为二进制表示的字节数组,通过保存或者转移这些字节数据可以实现持久化,继承java.io.Serializable接口即可实现序列化。反序列化则是将这个字节数组重新构造成对象。
  • 序列化的属性是对象,则属性类也需要实现Serializable接口

网络I/O

  • 三次握手四次挥手
  • TCP拥塞控制

Java Socket机制

  • 应用程序间通信,通过Socket建立连接,建立连接则必须由底层TCP/IP建立TCP连接,一台主机上有多个程序,通过TCP或UDP的地址即端口号可以与对应的应用进行通信。

Java NIO

BIO(阻塞I/O):可以采用线程池减少线程创建和回收的成本,提高重用率。
NIO:Channel和Selector关键组件。有个比喻很形象,如果把Channel比作汽车或高铁,那么Selector比作车辆运行调度系统,负责监控每辆车的状态,Buffer则是汽车上(Channel)的座位。

Buffer工作方式:
position, capacity, limit, mark

HeapByteBuffer DirectByteBuffer
存储位置 Java Heap中 Native内存中
I/O 需要在用户地址空间与内核地址空间中复制数据 不需要复制
内存管理 Java GC回收,创建和开销少 System.gc()释放Java对象引用的DirectByteBuffer内存空间,长期持有可能导致Native内存泄漏,创建和回收内存开销大
适用场景 并发连接数少于1000,I/O操作较少 数据量大、生命周期长的情况

深入理解Java Web中的编码问题

编码:字符编码,字符到字节,转为机器能够理解的语言,计算机只认识0和1。
解码:字节流解码,字节到字符,转为人类容易理解的语言。

无论是存储还是传输,不管是文件还是图片、视频,在计算机存储上一视同仁,全部是0和1的序列,都以字节的形式存在。
从方便人们阅读的角度,文件分为文本文件和二进制文件(非文本文件),文本文件的可视形式是文本字符,例如Test.java,存储时以某种编码格式进行编码,显示时以对应编码格式进行解码,方便文本编辑器、查看。
不同的编程语言中,提供了专门用于读写文本文件的类。Java中文本文件读写有BufferedReader和BufferedWriter.

I/O操作中的编码

  • 写入存储要编码,对磁盘写,网络上写,传输以流的方式进行,如果读取的是字符需要编码为字节,写入的内容需要指定编码Charset
  • 读取要解码,对磁盘读出来的数据解码,对网络上获取的流解码,读取字节解码为字符,具体解码过程需要用户指定Charset,默认使用本地环境的字符集,中文环境是GBK编码
  • 用什么编码写入,就用什么编码读出来,参考示例程序。

内存操作中的编码

  • 常见的是字符串到字节的数据类型转换,String str = “中文字符串”; str.getBytes(‘UTF-8’); String s = new String(b, “UTF-8”);
  • Charset类提供encode, decode方法,分别对应char[]到byte[]byte[]到char[],通过forName(String)方法设置字符集
    1
    2
    3
    Charset charset = Charset.forName("UTF-8");
    ByteBuffer byteBuf = charset.encode(str);
    CharBuffer charBuf = charset.decode(byteBuf);

乱码问题
本质是编解码使用了不同的编码格式,乱码的呈现是屏幕,是人的视觉感受。出现在磁盘文件的读写,网络数据传输,数据库存取。

编码的类型:

todo…

参考:
https://blog.csdn.net/Alexshi5/article/details/79513018

声明:本站所有文章均为原创或翻译,遵循署名 - 非商业性使用 - 禁止演绎 4.0 国际许可协议,如需转载请确保您对该协议有足够了解,并附上作者名 (Tsukasa) 及原文地址