HackToday Walk Blog


  • Home

  • Tags

  • Archives

  • Search

HTTP-2 的简单介绍和理解

Posted on 2017-05-14

演进时间点
HTTP 发明(1989 Tim Berers-Lee) –> HTTP 1.0 (1996) –> HTTP 1.1 (1999) –> HTTP/2 (2015)

HTTP 1.0 中的问题:
每次请求都是一次独立的 TCP (3次握手)连接建立和关闭的过程;
HOL (Head-of-line blocking)如果由于前面的请求不能及时处理,后续请求需要被阻塞直到前面的请求处理完毕才能继续发送。

HTTP 1.1 相比 1.0 改进了包括:
持久化连接,重用了 TCP 连接,减少不必要的资源的建立和释放过程。
Pipeline 机制:多个请求可以同时发送,但是服务端仍然要按序一个个返回,所以仍然有一定程度的(HOL), 各个浏览器对于这个特性不太感冒,很多禁掉或者没有实现这个Pipeline 机制

除了上述主要修改,还涵盖Cache,扩展性(引入的比如路径追踪的头部和OPTIONS 方法),带宽利用(断点续传,部分资源请求,压缩),网络连接管理(持久化,Pilelining),消息传递(分块传输,编码方式指定),网络地址维护,错误通知的管理(新的状态码和警告头部),安全和完整性

为了有效利用带宽和提高Web 服务性能,采用了一些技术

拼接技术: 多个 js 文件整合一个,减少请求次数,但是也造成杀鸡牛刀的影响(小改动大数据的重新下载)

嵌入内联 (将一些图片原始数据嵌入 css 中,也是减少请求次数,缓存无法有效利用,无法页面共享)

Sprite 技术 (将很多小图拼接大图,然后使用js和css 等重新切割出来的小图,维护开发相对复杂)

Sharding 技术(浏览器限制某一个域最多有 5(不同浏览器有些小的差别)连接,所以有些网站为了提高性能,使用新的主机名,提高同时连接的数目,实现资源请求的效率的提升)

HTTP/2 登场
HTTP 1.1 虽然较 1.0 改进了了很多,但是在如今随着网页的越来越复杂丰富,移动网络的兴起(相比传统的有线稳定的网络),如今的带宽往往处理这些越来越力不从心,所以演进了 HTTP/2 (基于 Google SPDY)

HTTP/2 有如下特点:

二进制的协议(相比原来的文本方式,解析处理更加容易)

采用多路复用(共享连接上双方可以同时发送请求和响应,这样原来 HTTP/1.1 的中一些技术比如sharding,嵌入内联,Spriting 就没有必要了)

每个流可以设置优先级和依赖关系 (服务器或者客户端对于并行发送的这些独立的帧的设置,可以控制资源的获取先后顺序)

服务器推送 (服务器主动将资源推送给客户端,减少客户端额外请求的延迟)

头部压缩 (HPACK 压缩格式,主要是静态Huffman 对头部字段编码 ,并且客户端和服务端同时维护,更新这些头部字段的索引列表)

流量控制 (服务器和客户端可以实现自己的数据流流量控制,更加接近应用级别的流控)

HTTP/2 的支持

现在基本所有大型浏览器对提供了对于 HTTP/2 的支持,包括Firefox, Chrome 等。 (HTTP/2本身并不强制使用TLS,但是一些浏览器要求使用HTTP/2 必须使用 TLS) ,一些主要的Web 服务器也提供了支持,比如Nginx,Apache 等。

部署 HTTP/2 需要客户端和服务器同时支持,如果对于普通的Web 程序,浏览器支持就够了。

HTTP/2 性能比较一个例子

通过https://imagekit.io/demo/http2-vs-http1 这个例子,我们开启 Chrome 中的protocol 显示,发现 HTTP/2 的请求几乎是同时,然后完成加载

而 HTTP/1.1 同一时间是大约是5~6 个并发请求,所以对于这种100 个小图拼接的图像,HTTP/2 完败 HTTP/1.1

以上只是简单的总结,更加深入的介绍还需要对于 HTTP/2 规范等细致的通读一下。

https://www.w3.org/Protocols/HTTP/1.0/spec.html
https://www.w3.org/Protocols/History.html
http://www8.org/w8-papers/5c-protocols/key/key.html
https://bagder.gitbooks.io/http2-explained/content/zh/part3.html
https://developers.google.com/web/fundamentals/performance/http2/
https://linjunzhu.github.io/blog/2016/03/10/http2-zongjie/
http://www.jianshu.com/p/52d86558ca57
https://imququ.com/post/header-compression-in-http2.html
http://if-true.com/2015/04/27/tech-difference-between-http-1.1-2.0.html
https://blog.imagekit.io/still-not-using-http-2-327d56397b58
https://tools.ietf.org/html/rfc7540
https://en.wikipedia.org/wiki/Head-of-line_blocking
https://en.wikipedia.org/wiki/HTTP_pipelining
http://www.cnblogs.com/xiaohuochai/p/6159326.html
https://imagekit.io/demo/http2-vs-http1

screen 的优化配置

Posted on 2017-04-22

在原来的一篇文章中曾经提到过 screen 的一些使用方法,参见下面的内容

http://blog.chinaunix.net/blog/post/id/4033839.html

但是在使用过程中,发现一个好的 screen 配置是十分必要的,比如一个自己使用的例子如下
点击(此处)折叠或打开

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
vbell off
bell_msg ""
startup_message off
# Tell screen how to set colors. AB = background, AF=foreground
termcapinfo xterm 'Co#256:AB=\E[48;5;%dm:AF=\E[38;5;%dm'
#
# Enables use of shift-PgUp and shift-PgDn
termcapinfo xterm|xterms|xs|rxvt ti@:te@
#
# Enable 256 color term
term xterm-256color
#
# Cache 30000 lines for scroll back
defscrollback 30000
# https://wiki.archlinux.org/index.php/GNU_Screen#Start_at_window_1
bind c screen 1
bind ^c screen 1
bind 0 select 10
screen 1
hardstatus off
# https://bbs.archlinux.org/viewtopic.php?id=12571
# http://man7.org/linux/man-pages/man1/screen.1.html
hardstatus alwayslastline
hardstatus string '%{= kG}%c %06=%-Lw%{= RW}%50>%n%f* %t%{-}%+Lw%<'

其中最复杂的配置部分就是 hardstatus,这里 string 里的配置依次是: 设置颜色,显示标题时间(固定),当前窗口的显示颜色,窗口标号,
窗口的标志,星号,窗口标题。其中比较晦涩的地方就是缩短的控制(screen 窗口过多的情况下,避免后续新开的窗口无法显示出来,
完成一个类似可以动态窗口显示的功能)

Docker 开始了新的容器生态系统玩法

Posted on 2017-04-19

这两天在Austin, Texas.举办的 DockerCon 2017 释放了重要的信息,Docker 官方发布了两个开源的项目,一个是 LinuxKit ,一个是 Moby

LinuxKit 目前看应该是为容器系统搭建基础的可定制化,可裁剪的 Linux 发行版,这个是为了解决目前容器系统运行的一些基础镜像过分笨重的问题

Moby 更是 Docker 官方升级容器系统的一个大玩法,不再局限于单纯的 Swarm 或者 Docker 运行时了,而是面向系统集成厂商或者创新实现的 Hacker们,开创的一种 Framework + Library 方法,可以利用广泛的开源的容器相关的组件(比如 runtime,build,image,volume 等)搭建出个定制化的容器化大系统,这种策略可以初期看出来更像平台玩法,吸引更多的集成商进来助力Docker 相关容器系统的推广和使用。当然这个项目不是针对应用开发者的,毕竟应用开发者不关心底层的系统构建。

通过这两个重要信息,我们可以看出以前的工具类的玩法逐渐变为平台玩法,平台开发吸引更多的厂商加入,才可能把市场影响力扩大。为了支持这个平台玩法,从基础镜像裁剪到运行时,到build,security 等组件化,为新的玩法提供了这种可能。

或无疑问,这种开放策略必将容器生态扩大,但这种策略能否助力 Docker 公司自身的成功,还是需要一些生态推进和执行力保证的。让我们拭目以待。

来源:

https://blog.docker.com/2017/04/introducing-the-moby-project/
http://www.eweek.com/cloud/docker-opens-ups-container-platform-with-linuxkit-and-moby-project

值得收藏的几个快捷Linux操作,提高工作效率

Posted on 2017-04-08

https://www.linux.com/learn/intro-to-linux/2017/4/fabulous-bash-navigation-shortcuts
记录了一些命令使用技巧,有些自己没太常用,觉得熟悉这些还是很有帮助的,至少提高工作的效率,挑选了几个觉得有用的如下:

locate filename 查找文件
Shift+PageUp / Shift+PageDown 浏览比较长的命令输出结果
locate filename 查找文件
鼠标选择(middle 点击) 拷贝命令
cd - 当前和上一次的目录快速切换

Ctrl+l == clear 命令
Ctrl+a == Home
Ctrl+e == End
Alt+b 向后一个单词
Alt+f 向前一个单词
Ctrl+c 清除当前命令
Ctrl+u 删除从光标到最前面的所有字符
Ctrl+k 删除从光标到最后面的所有字符
Ctrl+y 粘贴删除的字符

Google 新的开源领导力见证- opensource.google.com 起航

Posted on 2017-03-30

Google 一直是开源领域重量级的参与者,一方面因为技术人才辈出,另一方面因为涉猎的领域颇为广泛,所以从中积累了大量的优秀的开源软件产品和经验,如何更加有效的整合这些开源产品,如何管理,如何发布和支持,Google 有一套自己的处事哲学。相比基于这些出点点启动的opensource.google.com 对于技术人员不是一个坏事情,所以大家可以结合自己的兴趣到网站上去了解一些自己刚兴趣的项目的较为全方位的信息,从中受益。

参考:

https://opensource.googleblog.com/2017/03/a-new-home-for-google-open-source.html?m=1

有趣的 Go 语言 2016 调查

Posted on 2017-03-13

golang网站的一篇blog 记录了 2016 关于 go 语言的一些用户调查,有些和 stackoverflow 调查相似的结论,有点意思,大概总结我感兴趣的几点

调查人群以美国和欧洲为主体
调查开发平台多是 Linux
对 golang 的使用较多的编辑器是 Vim, 并且大家感到比较满意,同时希望在debug 上有更亲民的进展(这个都是 VIM 的深粉丝啊)
golang 应用到 web 开发, RPC, API 服务上(看看网上一些微服务的相关的,新火的 web 框架,可想而知)
在评价语言的偏好上,go 被列为了第一(这个和stackoverflow 不太一样,而是伟大的 javascript)
大家觉得 go 语言简单易学
stackoverflow 依然是大家获取问题解答的主要阵地

参考:

https://blog.golang.org/survey2016-results?utm_source=golangweekly&utm_medium=email&imm_mid=0ee8ca&cmp=em-prog-na-na-newsltr_20170311

Linux 非常实用的命令技巧

Posted on 2017-03-06

1.格式化表格输出命令结果
通过 column 命令来格式化结果

例如: mount | column -t

因为默认的以空格作为分隔符,如果对于一些命令的输出分隔符不是空格的情况下,使用下面的方式:
还有类似的 cat /etc/passwd | column -t -s :

  1. 重复的执行命令直到成功
    这个没有什么特别的的地方,使用 while 循环

  2. 巧妙的使用sort来对某些列进行排序

例如根据内存使用来对进程进行排序:
ps aux | sort -nk 4

  1. 同时查看监控多个log文件

单个文件的查看的时候通常是使用 tail,如果同时查看多个文件的话使用multitail 命令【TODO】

  1. 回退到上一次目录

cd -

6.
Make a Non-Interactive Shell Session Interactive
To do this, change the settings from ~/.bashrc to ~/.bash_profile.

个人注:【这个目前在平常没有发现使用的场景 ,不做进一步的介绍】

  1. 固定间隔下监控命令的输出
1
watch df -h

8.在session(shell)结束的时候仍然保持程序的运行

1
nohup wget site.com/file.zip

这个也可以通过screen 来实现

  1. 在一些交互式的命令中自动的回答yes 和 no
    通过yes 命令来完成,
    例如:
1
yes | apt-get update

如果是想回答no的话,使用 yes no | command

10.创建一个特定大小的文件,
使用dd 命令来完成,
例如:

1
dd if=/dev/zero of=out.txt bs=1M count=10

11.以root身份运行上一个命令
sudo !!

  1. 记录你的Linux 终端回话记录
    这个不是单纯的history 记录执行的命令,它除了记录执行的命令,还有执行的结果。
    使用方式:
    script

…. 执行的命令

exit

它会自动生成一个typescript 文件,包含了你说执行的命令和输出结果

同时可以结合 scriptreplay 来回放你刚才执行的过程。

  1. 使用tab 来替换掉空格
    通过使用tr命令,
    例如:
1
cat geeks.txt | tr ':[space]:' '\t' > out.txt
  1. 使用xargs 命令来完成一些高级的管道命令操作
1
find. -name *.png -type f -print | xargs tar -cvzf images.tar.gz

注意这里默认是使用上一个命令的输出给xargs命令的最后面

如果你的命令需要的是中间的位置,比如 cp xx /somepath

这样可以借助 {} 和 -i 参数

例如:

1
ls /etc/*.conf | xargs -i cp {} /home/likegeeks/Desktop/out

参考:

https://dzone.com/articles/most-useful-linux-command-line-tricks

当 Virtualbox 5.x 在 4.9内核中遇到了编译错误

Posted on 2017-02-16

在使用 VBox 安装的 Fedora 25 虚拟机,安装Guest Addition 过程中,发现无法安装,报编译错误

查看Vbox 官方问题列表发现 https://www.virtualbox.org/ticket/16286
这个在 5.1.12 修复了,具体changelog 参考列表
https://www.virtualbox.org/wiki/Changelog

解决方法,升级5.1.12 或者最新的 5.1.14 版本

另外附上:具体常规的安装步骤如下:

1
2
3
dnf update kernel*

reboot

从 GUI 上选择安装增强功能

1
2
3
4
5
6
7
8
mkdir /media/VirtualBoxGuestAdditions
mount -r /dev/cdrom /media/VirtualBoxGuestAdditions

dnf install gcc kernel-devel kernel-headers dkms make bzip2 perl

cd /media/VirtualBoxGuestAdditions

./VBoxLinuxAdditions.run

参考:

https://www.if-not-true-then-false.com/2010/install-virtualbox-guest-additions-on-fedora-centos-red-hat-rhel/

谈谈 stackoverflow 2016 开发者调查结果

Posted on 2017-02-11

调查从 技术,工作,社区三大方面展开,每个大方面都包含若干个小的方面,根据自己感兴趣的几个地方,汇总如下:
接受调查提供反馈的人以英语国家为主,平均年龄是29.6,编程经验为6.5 年(这里注意一下,这里不一定是职业编程经验,因为有些学生称自己有 3.4 年的编程经验)

开发者职业方向最多的是 full-stack web开发者占据 28%, 学生也占据一个比较大的比例约为 11%

在语言的使用上,javascript 占据优势

女性更偏向从事设计师,QA,机器学习等

73% 开发者偏向多样化的工作环境

69% 都会将自学作为学习新知识的途径

技术趋势方面: React, Node.js, and AngularJS 仍在增长,还有 spark, cloud 等继续保持增长

平均每个工程师使用4-5门语言,比如一些开发者经常使用 javascript,php 和sql

工程师开发环境主要还是 notepad++,VS, Sublime Text 和 vim, 一般使用 2-3 中开发环境。桌面操作系统Mac 居多,为26.2%,但是Linux 也相差不多,约为21.7%

求职方面,开发者在求职考虑中,会包括薪水,工作生活平衡,公司文化,好的团队成员等
一般薪水低的国家的开发者对于薪水的考虑更多一些。

开发者最讨厌不切实际的开发期望,糟糕的文档,不具体的产品需求
越是资深的开发者这方面表现的越明显,而经验越少的开发者对于为人友善更加强调。

开发者更喜欢自己代码有实际用处,并且在生产环境中使用。

资料参考来源: http://stackoverflow.com/research/developer-survey-2016

DevOps, SRE and system engineering 的一些必备知识技能

Posted on 2017-02-05

有一篇很不错的英文如下,总结了一些基本的知识点,这个对于工作和面试的一些方面有参考价值,希望对其他人有帮助之处:

来源: https://hackernoon.com/the-must-know-checklist-for-devops-system-reliability-engineers-f74c1cbf259d?imm_mid=0ec6e8#.1qvl6v6uoSource

我本着学习和兴趣的需要,总结分类如下:

系统基础

熟悉理解和使用 *nix 系统,了解不同发行版的区别,理解系统内部的基本原理
熟练掌握查看系统、CPU 内存等性能数据
理解和使用 cron,
理解和掌握一种shell,shell相关文件的配置。知道 bash/dash/sh/ash/zsh 区别
设置环境变量,如何持久化
知道 init 系统原理,upstart systemd,会使用systemctl journalctl 分析和调试问题
会编译源代码
理解ext4, ntfs, fat 等文件系统,知道Union文件系统
系统如何备份,备份策略,如何验证工作
md5, SHA 验证和使用

网络

配置和理解 IP/DNS/DHCP 的原理,router 查看和调试问题
SSH keys 和无密码访问配置
会配置firewal 设置rule,
知道TCP/UDP 区别, OSI模型和 TCP/IP 模型, 知道Vxlan
熟悉tcpdump wireshark等分析调试网络问题
熟悉使用进程管理ps, top, htop, atop,性能查看nmon, iostat, sar, vmstat
网络分析nmap, tcpdump, ping, traceroute, airmon, airodump等
熟悉完全协议相关的TLS, STARTTLS, SSL, HTTPS, SCP, SSH, SFTP, FTPS
知道 PPTP, OpenVPN, L2TP/IPSec 不同
SSL/TLS 如何工作,数字证书(https)如何工作
HTTP不同状态码的意义

Web

懂得配置 Web Server(Nginx Apache)
Nginx、Apache 区别
配置反向代理(Nginx..) 负载均衡,缓存服务器

Devops

懂得配置管理工具,例如chef puppet ansible etc
懂得Jenkfins 等 CI的基本配置和使用
监控系统的Nagios, Zabix, Sensu, prometheus 搭建和配置使用
了解chatops,基本的一些流行的框架

开发基础

脚本语言的使用python ruby 等
分布式版本控制工具 Git 的使用和基本原理
Vim Vagrant 开发环境的使用,熟悉一种 IDE 环境
熟悉理解 docker 和容器的底层技术
熟悉理解 Kubernetes/Mesos/SwarmKit 等相关的技术和区别
深入掌握 DB (mysql 等)
熟悉Redis/Memcache 类似的工具

架构

理解 PaaS/Iaas/Saas/CaaS/FaaS/DaaS and serverless 架构关联和区别
理解monolithic和microservices不同,和优缺点
理解stateful 和 stateless应用
如何设计可扩展,高可靠的分布式系统
熟悉理解微服务相关的API和服务知识,例如 RESTfull, RESTful-like, API gateways, Lambda functions, serverless computing,SOA, SOAP, JMS, CRUD

学习方法

Google, StackOverflow, Quora 和其他论坛的使用
跟踪其他知名公司 blog, github 开源项目

1…345…26

Kai Qiang Wu

This is a place for thinking and writing

253 posts
32 tags
GitHub
© 2020 Kai Qiang Wu
Powered by Hexo
|
Theme — NexT.Gemini v5.1.4
Visitor Total Visit