掘金 & bilibili学习笔记
Arthas
Java监控诊断产品
场景的弊端
客户线上问题,应该如何复现,让客户再点一下吗?
异常被吃掉,手足无措,看是哪个家伙写的,竟然是自己!
排查别人线上的 bug,不仅代码还没看懂,还没一行日志,捏了一把汗!
预发 debug,稍微时间长点,群里就怨声载道!
加日志重新部署,半个小时就没了,问题还没有找到,头顶的灯却早已照亮了整层楼……
线上机器不能 debug,也不能开 debug 端口,重新部署会不会破坏现场呢?
怀疑入参有问题,怀疑合并代码有问题,怀疑没有部署成功,全是问号……
一个问题排查一天,被 Diss 排查问题慢……
使用的案例:
排查CPU起飞的问题
使用thread查看所有线程信息,同时会列出每个线程的CPU使用率
使用命令thread 12 查看12号线程信息,可以看到该线程中使用CPU较高的方法和行数
dashboard 查看系统实时数据面板
watch com.Arthas addHashSet ‘{params[0],returnObj}’ 查看入参和出参…
分布式锁
分布式系统中的并发问题
竟态条件
指多个进程 / 线程在执行顺序上产生了不确定性,从而导致程序的行为不可预测
分布式系统中,多个节点同时访问共享资源,需要一个合理的同步机制
数据不一致
分布式系统中由于数据的拆分和复制,数据的一致性会受到影响
CAP 定理指出,在分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)这三个属性不可能完全同时满足。因此,在设计分布式系统时,需要在一致性、可用性和分区容错性之间做出权衡,这可能导致数据不一致的情况发生。
死锁
分布式系统中,多个节点可能同时竞争资源,类似多个进程竞争同一主机的资源;需要一个良好的协调机制
基于数据库的分布式锁
本质是在分布式集群外,抽出一台服务器负责管理锁,在此将管理的模式匹配到数据库中
优缺点
优点 缺点 实现相对简单,不需要引入额外的组件。 性能相对较差,数据库的IO开销较大。 可以使用数据库的事务机制确保数据的一致性。 容易产生死锁,需要谨慎设计。 不适用于高并发场景,可能成为系统的瓶颈。 基于缓存的分布式锁
也是抽出一台服务器负责管理锁,在此将管理模式匹配到Redis
命令:
SETNX(set if not exists) / 确定是没办法同时设置expire time,需要在下一个命令中设置 expire
set key value ex 10 nx / 更原子性
优缺点
优点 缺点 性能较高,缓存系统通常在内存中操作,IO开销较小。 可能存在缓存失效和节点崩溃等问题,需要额外处理。 可以使用缓存的原子操作确保获取锁的安全性。 需要依赖外部缓存系统,引入了系统的复杂性。 适用于高并发场景,不易成为系统的瓶颈。 其他注意点:
可重入 —— > value中还要存一个count
锁粒度的选择 —— >
超时时间的选择
解决redis单点问题 —— > RedLock
思想:在多个Redis实例上创建相同的锁,使用SETNX获取锁。只有当大部分获取到锁才认为成功
java新版本有价值的更新
Local Variable Type Inference(局部变量类型推断) | JDK 10
编码时不指定类型的情况下,编译时由值的类型推断出来
switch语法糖增强 | JDK14
1
2
3
4
5
6
7int flag = 1;
switch(flag) {
case 1,4 -> System.out.println("hello");
case 2 -> System.out.println("world");
case 3 -> System.out.println("hello world");
default -> System.out.println("haha");
}有点像lambda / js中箭头表达式 ;整体而言更像面向函数编程的思想
Text blocks 文本块 | JDK 15
传统文本换行需要 /n,新版本只需关注文本块中的内容

record关键字
替换Lombok
但是很多类需要builder模式,二者并不兼容
Sealed class 封闭类 | java 17
允许将一个类 或 接口 的集成 / 实现 限制在一组有限的子类中
例如:某个UserService接口只允许 UserServiceImpl实现,就需要用sealed将这个类表述为封闭类,同时使用permits关键字来定制可继承和实现的类有哪些
实现 / 继承的类需要声明为final或者non-sealed
1
2public sealed interface UserService permits UserServiceImpl, UserServiceFinalImpl{
}NullPointerException更多异常信息,能够更准确的定位
Nginx
架构
特点:
事件驱动 & 异步非阻塞
事件驱动:
传统IO模型中,痛点在于用户线程往往需要等待缓冲区数据准备(无论是等文件系统还是网卡),导致一个线程只能处理一个请求
事件驱动意味着主动权倒置:当缓冲区的数据准备好后再占用用户线程
具体实现方式:
异步IO —— AIO
- 当某个IO事件完毕后给用户线程发送一个事件通知
IO多路复用
一个线程检查多个连接的数据是否准备完毕,某个请求的数据完毕后,再通知用户线程执行后续代码【本质实现了异步IO,但并不是由文件系统 / 网卡发起通知,而是委托轮询的线程】
无需异步,无需轮询,无需长连接,而是压榨一个线程
事件驱动机制就是指当有读/写/连接事件就绪时 再去做读/写/接受连接这些事情,而不是一直在那里傻傻的等,也正应了他的名词: 【事件驱动!】,基于事件驱动思想设计的多路复用I/O(如select/poll,epoll),相对于传统I/O模型,达到了异步非阻塞的效果!
Nginx使用IO多路复用
类似的Reactor模型
Proxy Cache(服务器缓存)
Nginx作为反向代理的第一关,可能会将服务器的响应数据存储在本地磁盘
在缓存数据时,还运用零拷贝 & mmap技术使得copy性能大幅提升
模块:
“高内聚 低耦合代表”
常见应用场景:
反向代理
负载均衡
缓存
限流
两种限流方式:
按并发连接数量限流
每个IP最大支持12个连接
按请求速率限流(QPS)
可能限制每秒同一ip最多一秒访问5次
黑/白名单
静态资源服务
动静分离
防盗链
跨域
高可用
…….
核心功能参数调整全都内聚在nginx.conf中
文件解读:
nginx.conf由一个一个指令块组成,用{}界定指令块
分为:全局块,events块,http块,location块,upstream块
1
2
3
4
5
6
7
8
9
10
11
12
13
14全局模块
event模块
http模块
upstream模块
server模块
location块
location块
....
server模块
location块
location块
...
....
压缩:
目前大多数网站都在使用gzip传输HTML、CSS、JS等资源文件
比特币
2008年11月1日,中本聪《白皮书》– 比特币,一种点对点的电子现金系统
去中心化的电子记账系统
传统记账系统由银行中心负责记账,区块链则将账本分布式的、公开的存储在多个节点上
为什么要记账?记账有奖励
比特币
中本聪在08年提出一种机制
每十分钟将账目打包成一个区块,第一个四年每个打包的奖励是4个比特币,之后每四年奖励减半 | 其中,比特币的发行是由机制负责的,并没有中心机构
如此一来,比特币总量大约2100万个,时间越往后奖励越少,表示比特币越珍贵
奖励谁? / 以谁为准?
工作量证明POW —— 挖矿
原理:
每个记账用户在准备将本地账本封装成区块前,手里有一个大字符串,内容是:前块的头部 + 本地账单 + 时间戳 + 个人信息 + 随机数
随机数由记账用户盲猜,目的是使得整个字符串的二次哈希结果满足要求
要求:区块链机制会要求最后的哈希结果只有前n位是0才算是正确答案,而n的取值(difficulty)由机制决定,当前挖矿的算力越高,n越大(计算越难),算力越低,n越小(计算越简单);目的是为了保证可以十分钟左右打包一个区块
举例而言:
假如共有10000台矿机,每台的算力是14T/s(等于1.4 × 10e13次/s),十分钟内能够计算8 × 10e19次,约等于2e66;所以为了在十分钟内大概有一次计算能够命中,n可取66,即要求二次哈希的前66位必须为0
Web3
Web1:【只读】
Web内容是静态的,信息由机构聚合,例如YAHOO,搜狐,新浪
Web2:【可读、可写】
Web2的内容由用户动态生成,数据存储在中心化的服务器中
Web3:【可拥有】
使用区块链技术、智能合约、去中心化、不可篡改…
学科要点:
密码学:密码学是区块链底层安全机制的保障
比特币:
以太坊:去中心化的全球计算机(区块链技术不仅用来记账,还能用于应用)

智能合约:以太坊上运行的程序
开发者可以在以太坊上使用Solidity语言创建运行于EVM上的应用程序(智能合约)
特点:
去中心化
代码即法律 | 无需第三方
无需准入
可组合
智能合约安全
Web3应用——加密钱包
在区块链上,通过加密钱包管理资产,由于没有中心化机构保障资产安全,只通过个人私钥 / 助记词保障资产归属
谁拥有私钥,谁就拥有资产
而公钥就是链上的地址 / 用户名
Web3应用——DEFI
去中心化金融:建立在区块链、智能合约平台上的金融类产品工具
和传统金融相比,智能合约代替中心化银行
Web3应用——NFT
Web3应用——DAO
去中心化自治组织:通过智能合约报纸运转的组织,与公司制相对
密码学基础
科尔霍夫原则
对于一个密码学系统,应当仅有密钥是保密的,其余算法和一切参数都应该是公开的
保密并不意味着数学上不可破解,而只需要现实中不可破解即可
古典加密算法(属于堆成加密)【凯撒密码、维吉尼亚密码】
现代对称加密算法
缺点:双方必须事先共享密钥
非对称加密算法
