图解HTTP阅读笔记
简单的HTTP协议HTTP协议用于客户端和服务端之间的通信请求访问文本或图像等资源的一端称为客户端,提供资源响应的一 端称为服务器端
通过请求和响应的交换达成通信请求一定是从客户端发出,最后由服务端响应请求,并返回。
请求和响应报文请求报文是由请求方法、请求 URI、协议版本、可选的请求首部字段和内容实体构成的
响应报文基本上由协议版本、状态码(表示请求成功或失败的数字代 码)、用以解释状态码的原因短语、可选的响应首部字段以及实体主体构成
HTTP是不保存状态的协议无状态(stateless)协议:HTTP 协议自身不对请求和响应之间的通信状态进行保存。也就是说在 HTTP 这个级别,协议对于发送过的请求或响应都不做持久化处理
使用 HTTP 协议,每当有新的请求发送时,就会有对应的新响应产 生。协议本身并不保留之前一切的请求或响应报文的信息
这是为了 更快地处理大量事务,确保协议的可伸缩性,而特意把 HTTP 协议设计成如此简单的
HTTP/1.1 虽然是无状态协议,但为了实现期望的保持状态功能,于 是引入了 Cookie 技术。有了 Cookie 再用 HTTP ...
分布式锁
分布式锁为什么需要分布式锁?
在多线程环境中,如果多个线程同时访问共享资源(例如商品库存、外卖订单),会发生数据竞争,可能会导致出现脏数据或者系统问题,威胁到程序的正常运行。
为了实现共享资源的互斥访问,锁是一个比较通用的解决方案,尤其是悲观锁。
共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程。
本地锁
本地锁的示意图如下:
在分布式系统下,不同的服务/客户端通常运行在独立的 JVM 进程上。如果多个 JVM 进程共享同一份资源,使用本地锁就无法实现资源的互斥访问,于是分布式锁就诞生了。
分布式锁
分布式锁应该具备哪些条件?
互斥:任意一个时刻,锁只能被一个线程持有。
高可用:锁服务是高可用的,当一个锁服务出现问题,能够自动切换到另外一个锁服务。即使客户端的释放锁的代码逻辑出现问题,锁最终一定还是会被释放,不会影响其他线程对共享资源的访问。这一般是通过超时机制实现的。
可重入:一个节点获取了锁之后,还可以再次获取锁。
一个好的分布式锁还需要满足以下条件:
高性能:获取和释放锁的操作应该快速完成,并且不应该对整个系统的性能造成过大影响。
非阻塞: ...
分布式事务
分布式事务柔性事务
在 CAP 理论和 BASE 理论的基础上,提出了柔性事务的概念。柔性事务追求的是最终一致性。
柔性事务就是 BASE 理论 + 业务实践。柔性事务追求的目标是:我们根据自身业务特性,通过适当的方式来保证系统数据的最终一致性。
TCC
Saga
MQ事务
本地消息表
刚性事务
刚性事务追求的就是强一致性。
2PC
3PC
2PC
2PC(Two-Phase Commit)的含义:
2 -> 指代事务提交的 2 个阶段
P -> Prepare(准备阶段)
C -> Commit(提交阶段)
2PC 将事务的提交过程分为 2 个阶段:准备阶段 和 提交阶段
准备阶段的核心是“询问”事务参与者执行本地数据库事务操作是否成功:
事务协调者/管理者向所有参与者发送消息询问:“你是否可以执行事务操作呢?”,并等待其答复。
事务参与者接收到消息之后,开始执行本地数据库事务预操作如写 redo log/undo log 日志。但此时并不会提交事务!
事务参与者如果执行本地数据库事务操作成功,那就回复:“就绪”,否则就回复:“ ...
分布式ID
分布式ID如何为不同的数据节点生成全局唯一主键呢?
生成分布式 ID
最基本的分布式 ID 需要满足下面这些要求:
全局唯一:ID 的全局唯一性肯定是首先要满足的!
高性能:分布式 ID 的生成速度要快,对本地资源消耗要小。
高可用:生成分布式 ID 的服务要保证可用性无限接近于 100%。
方便易用:拿来即用,使用方便,快速接入!
一个比较好的分布式 ID 还应保证:
安全:ID 中不包含敏感信息。
有序递增:如果要把 ID 存放在数据库的话,ID 的有序性可以提升数据库写入速度。并且,很多时候,我们还很有可能会直接通过 ID 来进行排序。
有具体的业务含义:生成的 ID 如果能有具体的业务含义,可以让定位问题以及开发更透明化(通过 ID 就能确定是哪个业务)。
独立部署:也就是分布式系统单独有一个发号器服务,专门用来生成分布式 ID。这样生成 ID 的服务可以和业务相关的服务解耦
不过,这样同样带来了网络调用消耗增加的问题。总的来说,如果需要用到分布式 ID 的场景比较多的话,独立部署的发号器服务还是很有必要的。
分布式 ID 常见解决方案数据库
数据库主键自增
...
WebMagic-入门
HttpClient
响应
Post请求填充参数的方式
如下图的两种方式:
WebMagic概览WebMagic 的设计参考了业界最优秀的爬虫 Scrapy,而实现则应用了 HttpClient、Jsoup 等 Java 世界最成熟的工具,目标是做一个 Java 语言 Web 爬虫的教科书般的实现。
WebMagic 总体架构可以分为四个部分,由 Spider 将它们组织起来:
Downloader
负责从互联网上下载页面,以便后续的处理,WebMagic 默认使用了 Apache HttpClient 作为下载工具。
PageProcessor
负责解析页面,抽取有用信息,发现新的连接。WebMagic 使用 Jsoup 作为 HTML 解析工具,并基于其开发了解析 XPath 的工具 Xsoup。
在这四个组件中,PageProcessor 对于每个站点每个页面都不一样,是需要使用者定制的部分。
Scheduler
负责管理待抓取的 URL,以及一些去重的工作。默认提供 JDK 的内存队列来管理 URL,并使用集合来去重,也支持使用 Redis 进行分布式管理。
...
Netty入门
Netty基础Netty 是什么?
Netty 是一个异步的、基于事件驱动的网络应用框架,用于快速开发可维护、高性能的网络服务器和客户端。
一开始需要树立正确的观念:
把 channel 理解为数据的通道。
把 msg 理解为流动的数据,最开始输入是 ByteBuf,但经过 pipeline 的加工,会变成其它类型对象,最后输出又变成 ByteBuf。
把 handler 理解为数据的处理工序:
工序有多道,合在一起就是 pipeline,pipeline 负责发布事件(读、读取完成…)传播给每个 handler,handler 对自己感兴趣的事件进行处理(重写了相应事件处理方法)。
handler 分 Inbound 和 Outbound 两类。
把 eventLoop 理解为处理数据的工人:
工人可以管理多个 channel 的 IO 操作,并且一旦工人负责了某个 channel,就要负责到底(绑定)。
工人既可以执行 IO 操作,也可以进行任务处理,每位工人有任务队列,队列里可以堆放多个 channel 的待处理任务,任务分为普通任务、定时任务。
工人按照 pipeli ...
Spring-Security 入门
SpringSecurity的原理
本质上是一个过滤器链,内部包含了提供各种功能的过滤器。
常见的三种过滤器:
UsernamePasswordAuthenticationFilter:负责处理我们在登录页面填写了用户名密码后的登录请求
ExceptionTranslationFilter:处理过滤器链中抛出的任何 AccessDeniedException 和 AuthenticationException
FilterSecurityInterceptor:负责权限校验的过滤器
通过 debug 可以查看当前系统过滤器链中有哪些过滤器以及它们的顺序
各个 Filter 的作用浏览
WebAsyncManagerIntegrationFilter
提供了对 SecurityContext 和 WebAsyncManager 的集成,其会把 SecurityContext 设置到异步线程中,使其也能获取到用户上下文认证信息。
SecurityContextPersistenceFilter
该类在所有的 Filter 之前,从 SecurityContextR ...
正则表达式
正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为”元字符”)组成的文字模式
普通字符[ABC] : 匹配 […] 内的所有字符
[^ABC] : 匹配除了 […]中字符的所有字符
[A-Z] : 表示一个区间,匹配 A - Z 范围里的字符
. : 匹配除换行符 \n \r 之外的任何单个字符,相当于[^\r\n]
\s:匹配所有空白字符
\S:匹配所有非空白字符
\w:匹配 字母、数字、下划线等价于[A-Za-z0-9_]
\d: 匹配任意一个阿拉伯数字 等价于[0-9]
非打印字符
字符
描述
\cx
匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 ‘c’ 字符。
\f
匹配一个换页符。等价于 \x0c 和 \cL。
\n
匹配一个换行符。等价于 \x0a 和 \cJ。
\r
匹配一个回车符。等价于 \x0d 和 \cM。
\s
匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。注意 Unicode 正 ...
分布式理论与算法
分布式理论CAP
CAP 实际上指的是一致性(Consistency)、可用性(Availability)、分区容错性(Partition Tolerance)。
CAP 理论指出,对于一个分布式系统,当涉及到读写操作的时候,只能满足以下三点中的两个:
一致性:所有节点访问同一份的最新副本。
可用性:非故障的节点在合理的时间返回合理的响应(不是错误或者超时)。
分区容错性:分布式系统出现网络分区的时候,仍然可以对外提供服务。
什么是网络分区?
在分布式系统中,多个节点之间的网络本来是连通的,但是因为某些故障(比如部分节点网络出了问题)导致某些节点之间不再连通,整个网络就分成了几块区域,这就叫网络分区。
不是所谓的“3 选 2”
在发生 P(Partition Tolerance)的条件下,A(Availability)和 C(Consistency)只能满足一个,也就是分布式系统只能选择 CP 或 AP。Zookeeper 是 CP 架构,而 Nacos 不仅支持 CP 架构,也支持 AP 架构。
CAP 的实际应用案例
注册中心负责服务地址的注册与查找,相当于 ...
Java 虚拟机性能监控、故障处理工具
Java 虚拟机性能监控、故障处理工具基础故障处理工具
jps:虚拟机进程状况工具
jstat:虚拟机统计信息监视工具
jinfo:Java 配置信息工具
jmap:Java 内存映像工具
jhat:虚拟机堆转储快照分析工具
jstack:Java 堆栈跟踪工具
可视化故障处理工具
JHSDB:基于服务性代理的调试工具
JConsole:Java 监视与管理控制台
VisualVM:多合-故障处理工具
Java Mission Control:可持续在线的监控工具