2020年的第二篇读书笔记,陶醉在读书笔记和博客之间,作为一种正反馈,不断吸引着去记录学到的知识,和学生时代一样,边学边记录,时间在这里似乎变得珍贵了不少。
浏览器,超文本,标记语言,网络服务器,共享内存来通信,自定义socket通信,Web服务通信,HTTP GET/POST+JSON
Web通信过程 :HTTP发送请求,HTTP报文打包在TCP报文段中,又被放在IP层数据报中,传给链路层的帧,到了物理层则通过网卡发送出去。
HTTPS通信加密: 对称加密算法只有密钥、非对称加密(RSA)有公钥和私钥,若公钥加密则私钥解密、若私钥加密则公钥解密
对称加密很快、非对称加密很慢,目前是用非对称加密算法传输对称加密密钥,随后通信采用对称加密算法,但是在用非对称加密的前提是得想办法将非对称加密的公钥发送给对方,在发送公钥的时候可能会出现中间人劫持。
中间人劫持: 非对称加密,会出现中间人劫持,即公钥是公开的,中间人可以劫持发送者发过来的信息(公钥),然后换成自己的公钥,这样后续通信会经过劫持者转发。
为了解决中间人劫持问题,非对称加密的公钥直接采用数字证书的方式下发。
数字证书: 证书包含对方的公钥等信息
数字签名: 为了防止篡改数字证书,证书采用数字签名 方式下发,证书里面的公钥等信息被hash过了,具备唯一性,不可逆的操作。但是,我不篡改数字证书内容,我直接替换成我的数字证书,也是可以实现狸猫换太子的把戏,所以需要 具备网络中的可信认证中心(CA Certification Authority机构), 这个 数字证书 采用CA私钥加密数字签名,这样只能是用CA的公钥来解密这个数字签名 ,只有正确解开,才证明这里面的公钥是真的,就不怕直接换数字证书来瞒天过海了。
[网图,侵删]
服务器的session、浏览器的cookie
账号密码 用户输入账号和密码直接登陆
token: 用户访问我的服务时,需要是用第三方服务的登陆授权,不保存密码,而是采用token的方式获取登陆授权,我的服务重定向到第三方服务登陆,第三方服务拿到我的服务注册在第三方服务的的app_id和app_secret,然后验证通过后发送一个token,表示用户登陆成功。但是浏览器会接触到token,是明文的。
授权码+token: 第三方服务给浏览器一个授权码,我的服务拿到授权码,在服务中去访问第三方服务拿到token,这样浏览器就不会接触到token了。
SSO(单点登陆): cookie无法跨域名,但可以将cookie放置在顶级域名下,这样所有二级及以下业务都能访问cookie,可以采用共享session的方式,将session写入到一个公共的存储服务中。
1、解决单点登陆,多采用cookie里面写token的方式,跨域访问带上token,但要求业务侧都统一账号才行。
2、还可以采用认证中心(CAS)的方式,认证中心建立一个session和ticket, 浏览器此时会有两个cookie,一个是认证中心服务保存的,一个是业务侧服务保存的。
浏览器,Web服务器(Nginx),应用服务器(tomcat),数据库服务器,缓存服务器
可以将程序中的对象序列化成二进制数据存放在数据库或者缓存中。
假如redis缓存服务器很多,这个时候就需要jedis设计一个好的分配算法来将数据缓存在具体的redis缓存服务器上了。
缓存分配算法: 余数算法、一致性Hash算法、Hash Slot
Redis Cluster 解决redis缓存服务器相互通信的问题,集群的故障转移:mater节点和salve节点
硬件比较常见的有:
F5 Big-IP
Citrix Netscaler
软件比较常见的有:
LVS(Linux Virtual Server)
HAProxy
Nginx
Nginx的高可用性,解决单点失败问题,用keepalived 将Nginx服务器形成 master-salve集群,对外提供一个ip地址,
tomcat集群,可能会出现失效转移,状态可能会丢失,这就需要访问的数据是统一的,Redis-Cluster、MySQL-Cluster,
MySQL-Cluster: master库可读可写,slave库只可读不可写,读写分离,master库负责写,slave库负责读,一般web服务读的操作远远多于写的操作,效率会提高很多,为了实现数据库事务的不同隔离级别,发明X锁(排他锁,写数据用)、S锁(共享锁,读数据用),如果读写分离,则会缓解程序对数据库X锁和S锁的竞争。用MySQL Proxy 来解决master库和slave库的换置工作。
跨域网络的调用:socket建立连接,商量好格式、次序来post和get数据。
将异构系统包装成粗粒度的服务
微服务
基于HTTP的RESTful来对外提供接口,docker部署服务,代码和环境可以做成一个image,将image放到服务器端的docker运行环境就可以了
框架
是一个半成品,无法独立运行的最佳实践,用框架实现业务是很小的一方面,还有系统结构设计、缓存、性能、高可用性、分布式、安全、备份等
HTTP Server
阻塞:HTTP Server 1.0、HTTP Server 2.0(多进程)、
非阻塞:HTTP Server 3.0(select模型、epoll模型)
select模型需要自己主动轮询活跃的socket, epoll模型是操作系统通知活动的socket
不同的VCS(Version Control System)
SVN: 集中式的
工具: TortoiseSVN
服务端:存放代码,进行版本管理
客户端:和服务端通信,checkout/checkin代码,放弃文件锁,提供一个合并的功能即可。
Git:分布式的
工具:Sourcetree
自动化Build
Ant 项目目录约定,依赖关系用pom.xml来声明
Maven 开源的Ant2, 加入了公共包版本库,约定重于配置
JavaScript 作者 Brendan Eich只花了10天就设计出来了,结果因为弱类型遭到吐槽,目前TypeScript 为JavaScript 添加了可选的类型、类和模块系统。
1998年的IE5, XMLHttpRequest 称之为AJAX
HTML负责页面结构、CSS负责展示、JavaScript负责逻辑
把JavaScript放到服务器上运行,需要JavaScript执行引擎,Chrome V8执行引擎解决了运行缓慢的问题,2009年的Ryan Dahl 开发了 Node.js可以将JavaScript放在服务器上运行,Node.js是单线程模型,异步非阻塞,只适用于IO密集型,不适用于CPU密集型
C语言的链接是在编译器完成的,Java的链接是在运行期完成的
命令式编程
语句对应到计算机运行的具体步骤
声明式编程
是函数式编程的一个重要特点
例如SQL,只告诉做什么事情,但具体怎么做由底层数据库管理系统来实现的。
需要知道的规则:
局部性原理:时间局部性、空间局部性
缓存:本质原因是速度的不匹配
抽象:《深入理解计算机系统》一说中提到
指令集是对CPU的抽象,文件是对输入/输出设备的抽象,虚拟存储器是对程序存储的抽象,进程是对一个正在运行的程序的抽象,二虚拟机是对整个计算机(包括操作系统、处理器和程序)的抽象
分层:隔离变化
异步调用、分而治之。
本书作者,15年编程生涯,一名架构师的总结
好奇心:对技术的好奇心/兴趣是一切的基础
坚持,时间上的花费是一步一步来的,所以需要定一个小目标