《码农翻身》读书笔记
搞清楚Socket
所谓IP 层,就是把数据分组从一台主机跨越千山万水搬运到另一台主机,并且这搬运服务都不可靠,丢包、重复、失序常常发生。
脏活、累活只好让TCP 来做了,在两台主机的应用(进程)之间通过失败重传来实现可靠性的传输。
Socket 指的是(IP, Port);
指令 -- 也需要在内存中才能被CPU 访问到,CPU 从内存中读取到指令以后,会进行分析(译码),看看这条指令是干什么的,然后再进行运算。
那内存的数据又是从哪里来的?肯定是硬盘了,我们写好的程序会放在硬盘上,在运行的时候才会被调入内存。
Java帝国
为了实现跨平台,我们在操作系统和应用程序之间,增加了一个抽象层:Java虚拟机。
用Java写的程序都运行在虚拟机上。
日志系统
到了第四代国王(JDK1.4),臣民们终于看到了帝国提供的java.util.logging包,也是用来记录日志的,并且其中的核心概念Logger, Formatter, Handler 和 Log4j非常相似,只是为时已晚, Log4j早已深入人心了, 不可撼动了。
logback 比log4j 还要快。
这抽象层就叫做Simple Logging Facade for Java,简称SLF4J。
对于Log4j , JDK logging, tinylog 等工具, 需要一个适配层, 把SLF4J 的API转化成具体工具的调用接口。
由于Logback这个工具也是出自小张之手, 直接实现了SLF4J的API,所以连适配层都不需要了, 用起来速度飞快,效率最高,SLFJ4+Logback 成为了很多人的最爱, 大有超越Apache Common Logging + Log4j 之势。
面向切面编程AOP
切面类Aspect
切入点PointCut
在方法调用之前/之后,需要执行xxx,用另一个时髦的词来描述,就是通知Advice。
Web
HTTP的报文,被打包在TCP 报文段中,又被放到 IP 层数据报中,最后形成链路层的帧,通过网卡发出去。
数据库连接Connection
对于每一个Connection,数据库那里需要开辟不少缓冲区,用来读取表中的数据,进行join 操作、sort 操作等,既费时又费力。
状态信息
用户的登录信息、购物车等都是状态信息。
- 应用服务器可以把状态信息在集群的各台服务器之间复制,让集群的各台服务器达成一致。
- 使用session sticky 技术,保证同一个客户端的请求,一直被转发到同一台server上。
- 把session 保存到MYSQL中,采用集中式存储。
- 把session 保存到 Redis 集群中。
数据库的读写分离
在一个分布式的环境中,保持数据的强一致性是非常难的。
Master库 -- 可读可写;
Slave库 -- 只能读,不能写;
Master库的数据尽快复制到 Slave 库,让数据保持一致。
重构
- 没有人敢重构我们这些遗留代码;
- 原因是业务这么复杂,重写怎么能考虑这么多细节,重写出来的代码Bug 会更多;
- 慢慢地重构代码,让代码的质量朝着更好的方向发展;
分层的好处是隔离变化
在接口不变的情况下,某一层的变化只局限于本层次内。
分而治之 -- 将一个规模比较大的问题,分解为多个规模比较小的子问题。