
获得徽章 10
- #青训营笔记创作活动#
2023.01.29_Day17
【MySQL全解(二)】
从诞生到全链路;
本文的大体目录如下:
一、一条SQL是如何诞生的?
二、一条SQL执行前会经历的过程
2.1、数据库连接池的必要性
2.2、SQL执行前会发生的事情
三、一条SQL语句在数据库中是如何执行的?
3.1、一条查询SQL的执行过程
SQL接口会干的工作
解析器中会干的工作
优化器中会干的工作
存储引擎中会干的工作
3.2、一条写入SQL的执行过程
缓冲区中会做的工作
写操作时的日志
四、一条SQL执行完成后是如何返回的?
4.1、读类型的SQL返回
4.2、写类型的SQL返回
4.3、执行结果是如何返回给客户端的?
五、SQL执行篇总结
先mark一下,等需要系统学习的时候就来看。展开11 - #青训营笔记创作活动#
2023.01.26_Day14
【网络原理】
网络原理,How and Why?
单机→互联:本质是通信!
数据传输方式:电路交换、报文交换、分组交换;
其中一个重要的思想:转发&标识思想,它们是网络设计的核心问题,因为它们是一个网络扩大的基础。
结点&链路: 从计算机、集线器,交换机、路由器;
网络的边界:个人区域网、局域网、城域网、广域网、互联网展开评论1 - #青训营笔记创作活动#
2023.01.27_Day15
【优秀后端都应该具备的开发好习惯】
1.注释尽可能全面,写有意义的方法注释
2.项目拆分合理的目录结构
3. 不在循环里远程调用、或者数据库操作,优先考虑批量进行。
4. 封装方法形参
5. 封装通用模板
6. 封装复杂的逻辑判断条件
7. 保持优化性能的嗅觉
8. 可变参数的配置化处理
9. 会总结并使用工具类。
10. 控制方法函数复杂度
11. 在finally块中对资源进行释放
12.把日志打印好
13. 考虑异常,处理好异常
14. 考虑系统、接口的兼容性
15. 代码采取措施避免运行时错误展开11 - #青训营笔记创作活动#
2023.01.28_Day16
【502问题】
首先文章介绍了HTTP状态码,其中5xx的状态码是服务器有问题。
但是这个时候服务端是不可能给客户端返回状态码的,一般情况下5xx的状态码其实并不是服务器返回给客户端的,它们是由网关返回的,常见的网关,比如Nginx。
Nginx屏蔽掉具体有哪些服务器的代理方式就是所谓的反向代理。
接着,文章介绍了502的常见产生原因。
502 (Bad Gateway) 状态代码表示服务器在充当网关或代理时,在尝试满足请求时从它访问的入站服务器接收到无效响应。后端服务端应用如果发生崩溃,nginx在访问服务端时会收到服务端返回的RST报文,然后给客户端返回502报错。502并不是服务端应用发出的,而是nginx发出的。因此发生502时,后端服务端很可能没有没有相关的502日志,需要在nginx侧才能看到这条502日志。
最后,解决方法是,如果发现502,优先通过监控排查服务端应用是否发生过崩溃重启,如果是的话,再看下是否留下过崩溃堆栈日志,如果没有日志,看下是否可能是oom或者是其他原因导致进程主动退出。如果进程也没崩溃过,去排查下nginx的日志,看下是否将请求打到了某个不知名IP端口上。展开11 - #青训营笔记创作活动#
2023.01.24_Day12
为什么没能抓到包
这其实是因为他访问的是HTTPS协议的baidu.com。HTTP协议里的Host和实际发送的request body都会被加密。
正因为被加密了,所以没办法通过http.host进行过滤。
但是虽然加密了,如果想筛选还是可以筛的。
HTTPS握手中的Client Hello阶段,里面有个扩展server_name,会记录你想访问的是哪个网站,通过下面的筛选条件可以将它过滤出来。
然后需要解密数据包,得到pre_master_key,最后通过设置SSLKEYLOGFILE环境变量,再让curl或chrome会请求HTTPS域名。展开评论1 - #青训营笔记创作活动#
2023.01.25_Day13
【MySQL全解(一)】
MySQL整体结构浅析
从上往下看,依次会分为网络连接层、系统服务层、存储引擎层、以及文件系统层,往往编写SQL后,都会遵守着MySQL的这个架构往下走。
连接层:主要是指数据库连接池,会负责处理所有客户端接入的工作。
服务层:主要包含SQL接口、解析器、优化器以及缓存缓冲区四块区域。
存储引擎层:这里是指MySQL支持的各大存储引擎,如InnoDB、MyISAM等。
文件系统层:涵盖了所有的日志,以及数据、索引文件,位于系统硬盘上。
更进一步地,
网络连接层中有数据库连接池;
系统服务层中有SQL接口、解析器、优化器、缓存&缓冲;
存储引擎层;
文件系统层中有日志模块、数据模块。展开评论1 - #青训营笔记创作活动#
2023.01.22_Day10
【UDP&TCP】
本文主要介绍了:
使用socket进行数据传输
对于异常情况的处理
重传机制
流量控制机制
滑动窗口机制
拥塞控制机制
分段机制
乱序重排机制
连接机制
TCP为了实现可靠性,引入了重传机制、流量控制、滑动窗口、拥塞控制、分段以及乱序重排机制。而UDP则没有实现,因此一般来说TCP比UDP快。
TCP是面向连接的协议,而UDP是无连接的协议。这里的"连接"其实是,操作系统内核在两端代码里维护的一套复杂状态机。
大部分项目,会在基于UDP的基础上,模仿TCP,实现不同程度的可靠性机制。
对于UDP+重传的场景,如果要传超大数据包,并且没有实现分段机制的话,那数据就会在IP层分片,一旦丢包,那就需要重传整个超大数据包。而TCP则不需要考虑这个,内部会自动分段,丢包重传分段就行了。这种场景下,其实TCP更快。
展开评论1 - #青训营笔记创作活动#
2023.01.23_Day11
【代码书写】
1、规范命名
2、规范代码格式
3、写好代码注释
4、try catch 内部代码抽成一个方法
5、方法别太长
6、抽取重复代码
7、多用return
8、if条件表达式不要太复杂
9、优雅地参数校验
10、统一返回值
11、统一异常处理
12、尽量不传递null值
13、尽量不返回null值
14、日志打印规范
15、统一类库
16、尽量使用工具类
17、尽量不要重复造轮子
18、类和方法单一职责
19、尽量使用聚合/组合代替继承
20、使用设计模式优化代码
21、不滥用设计模式
22、面向接口编程
23、经常重构旧的代码
24、null值判断
25、pojo类重写toString方法
26、魔法值用常量表示
27、资源释放写到finally
28、使用线程池代替手动创建线程
29、线程设置名称
30、涉及线程间可见性加volatile
31、考虑线程安全问题
32、慎用异步
33、减小锁的范围
34、有类型区分时定义好枚举
35、远程接口调用设置超时时间
36、集合使用应当指明初始化大小
37、尽量不要使用BeanUtils来拷贝属性
38、使用StringBuilder进行字符串拼接
39、@Transactional应指定回滚的异常类型
40、谨慎方法内部调用动态代理的方法
41、需要什么字段select什么字段
42、不循环调用数据库
43、用业务代码代替多表join
44、装上阿里代码检查插件
45、及时跟同事沟通
展开评论1 - #青训营笔记创作活动#
2023.01.19_Day7
【Websocket】
Q:怎么样才能在用户不做任何操作的情况下,网页能收到消息并发生变更?
A:网页的前端代码里不断定时发HTTP请求到服务器,服务器收到请求后给客户端响应消息。这其实时一种伪服务器推的形式。它其实并不是服务器主动发消息到客户端,而是客户端自己不断偷偷请求服务器,只是用户无感知而已。这是使用HTTP不断轮询。
Q:有什么应用场景?
A:扫码登录。登录页面二维码出现之后,前端网页根本不知道用户扫没扫,于是不断去向后端服务器询问,看有没有人扫过这个码。而且是以大概1到2秒的间隔去不断发出请求,这样可以保证用户在扫码后能在1到2s内得到及时的反馈,不至于等太久。
Q:这样做有什么坏处?
A:1. 当你打开F12页面时,你会发现满屏的HTTP请求。虽然很小,但这其实也消耗带宽,同时也会增加下游服务器的负担。2. 最坏情况下,用户在扫码后,需要等个1~2s,正好才触发下一次http请求,然后才跳转页面,用户会感到明显的卡顿。
Q:有什么解决办法?
A:手机扫电脑上的码→手机端确认扫码——长轮询,但这只限于简单场景,网页游戏的话就需要用到websocket了。
Q:那是什么?
A:WebSocket是一种在单个TCP连接上进行全双工通信的协议。WebSocket通信协议于2011年被IETF定为标准RFC 6455,并由RFC7936补充规范。WebSocket API也被W3C定为标准。WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接
可以创建持久性的连接,并进行双向数据传输。
余下内容包括怎么建立websocket连接;websocket抓包;websocket的消息格式;websocket的使用场景,篇幅限制不做展开。展开11 - #青训营笔记创作活动#
2023.01.18_Day6
【IP与DHCP】
DHCP:
插上网线之后,获得IP的方式主要有两种。
第一种是,自己手动在电脑里配。
第二种获取IP的方式,DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)。
通过DHCP,在联网之后可以自动获取到本机需要的IP地址,子网掩码还有路由器地址。
DHCP的工作原理:
向某个管IP分配的服务器,也就是DHCP服务器,申请IP地址。家里用的路由器就自带这个功能。
DHCP Discover:在联网时,本机由于没有IP,也不知道DHCP服务器的IP地址是多少,所以根本不知道该向谁发起请求,于是索性选择广播,向本地网段内所有人发出消息,询问"谁能给个IP用用"。
DHCP Offer:不是DHCP服务器的机子会忽略你的广播消息,而DHCP服务器收到消息后,会在自己维护的一个IP池里拿出一个空闲IP,通过广播的形式给回你的电脑。
DHCP Request:你的电脑在拿到IP后,再次发起广播,就说"这个IP我要了"。
DHCP ACK:DHCP服务器此时再回复你一个ACK,意思是"ok的"。你就正式获得这个IP在一段时间(比如24小时)里的使用权了。后续只要IP租约不过期,就可以一直用这个IP进行通信了。
DHCP在抓包:
返回给我们需要的IP、子网掩码、路由器地址以及DNS服务器地址。
为什么是DHCP而不是TCP?
因为TCP是面向连接的,而UDP是无连接的。展开评论1