撕开高并发的底裤:从 Tomcat 源码到 Java 21 虚拟线程,通俗全景解析非阻塞网络模型前言:我们在被哪些“高大上”的概念折磨?在如今的后端开发领域,我们每天都被各种层出不穷的技术名词轰炸:从传统的 Tomcat 线程池调优,到 Netty 的异步事件驱动;从 Spring Cloud Gateway 底层的 WebFlux 响应式流,再到 Go 语言引以为傲的 Goroutine 以及 Java 21/25 震撼登场的虚拟线程(Project Loom)。 为了追求所谓的“高性能”和“高并发”,很多团队强推响应式编程,结果原本清爽的业务代码被改写成了满屏幕的 Mono、Flux、flatMap 和 subscribe。不仅新员工看起代码来像看天书,一旦线上出了 Bug,打印出来的报错堆栈动辄几百行,根本找不到是自己写的哪一行代码出了问题。调试代码时,断点在 IDEA 里疯狂乱跳,直接让人原地崩溃。 高并发的底层真的有这么神秘和复杂吗? 答案是否定的。今天,我们不谈宏观概念,不绕高级术语。将从最基础的操作系统物理世界出发,一层层往上剥离,直奔各大中间件和语言的核心源码 ...
集群架构总览本次部署采用 4 台 CentOS 7 虚拟机,各节点角色分配如下: 12345678910111213141516171819202122graph TB subgraph hadoop01["hadoop01 - NameNode"] NN["NameNode<br>HDFS 主节点"] end subgraph hadoop02["hadoop02 - Secondary NameNode"] SNN["Secondary NameNode<br>HDFS 辅助节点"] end subgraph hadoop03["hadoop03 - ResourceManager"] RM["ResourceManager<br>YARN 资源管理"] end subgraph hadoop04["hadoop04 - History ...
首先需要装好 Docker,CentOS 7 安装 Docker 可点击参考此文章 1234567flowchart LR A[拉取 jaspeen/oracle-11g 镜像] --> B[下载 Oracle 11g 安装包] B --> C[解压到 /root/oracleinstall] C --> D[启动容器并挂载数据卷] D --> E[等待安装完成] E --> F[进入容器配置用户] F --> G[设置密码策略] 下载 Docker Oracle 镜像1docker pull jaspeen/oracle-11g 注:此镜像没有 Oracle 安装包,里面有自动安装数据库的脚本,启动镜像容器时,需要容器卷下有相应的安装包(官网下载),所以大小才 281MB,需要自行下载 Oracle 11g 安装包。 Oracle 官方安装包获取 下载地址:Oracle 11g 官网下载,下载 linux.x64_11gR2_database_1of2.zip 和 linux.x64_11gR2_databa ...
读书笔记
未读第一章 伊甸园你是谁?她(苏菲)想:”我现在是活在这世上,但有一天我会死去。”人死之后还会有生命吗?这个问题猫咪也不会去想,这倒是它的福气。 世界从何而来?生在这个世界上却连”世界从何而来”这样本质的问题都不问一问,实在是对这个世界很不恭敬。 在某一时刻,事物必然曾经从无到有,有开端,如果把开端比作上帝,可万物都由上帝创造的话,那上帝又是谁创造的呢? 注:哲学经典问题——我是谁?我从哪里来?我要到哪里去?未上大学之前谈论起这些问题总是带着玩笑,从未曾好好思考过这些问题,只觉有趣。自大学入学以来,人生就开启了迷茫 1.0 模式(年轻人,迷茫是好事,至少又是一次自我认识、自我剖析的开始),也是在此时自己开始真正去寻找自我,思考和认识自己。感谢《苏菲的世界》,让我受益颇丰,让我真正开始思考起了一些看似平平无奇的人类终极问题。 第二章 魔术师的礼帽要成为一个优秀的哲学家,只有一个条件:要有好奇心。 哲学是什么?假如我自己对马或宝石有兴趣,我也不能期望别人都和我一样。假如我看电视体育节目看得津津有味,就必须忍受有些人认为体育节目很无聊的事实。 每个人都需要食物、爱和关怀,当所有的基本需求都满 ...
Linux
未读近期入手了一台 Raspberry Pi 4 8GB 版,打算为自己未来的新家整个智能家居平台和打造家庭网络做准备。树莓派的作用不多说,懂得都懂,以下记录下自己入手时的基本配置,买的是单主机版本,加上购买的其他基础配件,装好后如下图,真的是极为喜欢,爱不释手。 整体配置流程如下: 123456789flowchart LR A["购买树莓派 + 配件"] --> B["下载 Raspberry Pi OS Lite 镜像"] B --> C["使用 Win32 Disk Imager 烧录至 SD 卡"] C --> D["在 boot 分区创建 ssh 文件"] D --> E["创建 wpa_supplicant.conf 配置 WiFi"] E --> F["插入 SD 卡 + 上电开机"] F --> G["通过手机热点/路由器获取 IP"] G --> ...
Docker 容器技术应用越来越广泛,之前学习了一下 Docker 的使用,瞬间觉得怎么没有早点学会这项技术,这样自己学习其他中间件技术时就可以少折腾很多安装的问题,Docker 大法真香,这里记录一下 CentOS 7 下安装 Docker 过程,防止下次踩坑。官网安装参考 12345678910flowchart LR A[确认 CentOS 版本] --> B[安装 gcc 和 gcc-c++] B --> C[删除旧版本 Docker] C --> D[安装 yum-utils] D --> E[添加阿里云 Docker 镜像源] E --> F[yum 安装 Docker CE] F --> G[启动 Docker 服务] G --> H[配置开机自启] H --> I[配置阿里云镜像加速] I --> J[验证安装完成] 注意:CentOS 7 已于 2024 年 6 月 30 日停止维护(EOL)。 官方已不再提供安全更新和软件包。建议迁移到 Rocky Lin ...
很早之前就遇到了 IDEA 和 cmd 命令行里 Tomcat 日志中文乱码问题,但是 Tomcat log 目录下的 catalina.log 文件却不是乱码,因为各种缘由没有及时去解决,这次做项目用到了 Activiti 工作流,学习过程中,遇到了 bpmn 流程图中文乱码问题,一并解决了这个问题,这里做个简记,防止下次踩坑。 定位结果 症状 原因 解决方案 IDEA 控制台 / Tomcat 日志中文乱码 -Dfile.encoding 被用户级配置覆盖为 GBK 修改用户目录下 idea64.exe.vmoptions Activiti bpmn 流程图中文乱码 IDEA 编码未设为 UTF-8 同上 CMD 启动 Tomcat 中文乱码 Windows CMD 默认使用 GBK 编码 修改注册表或使用 chcp 65001 适用版本说明: 本文基于 IntelliJ IDEA 2019.3 测试,配置路径和原理在 IDEA 2020.x 及更高版本中基本一致。新版 IDEA 可能将 idea64.exe.vmoptions 移至 Help - ...
好记性不如烂笔头,记一篇 IDEA 中搭建 JDK 源码阅读工程的文章,防止下次踩坑,此次 JDK 版本为:1.8.0_261。 为什么要读 JDK 源码阅读 JDK 源码是深入理解 Java 语言的最佳途径之一。通过源码可以了解: HashMap、ConcurrentHashMap 等集合类的底层数据结构与实现细节 JVM 与操作系统交互的机制,如 nio 包中的内存映射文件 java.util.concurrent 包中并发工具类的设计思想 面试中常见的源码分析问题,提升技术深度 前置条件开始搭建之前,确保已具备以下环境: 条件 说明 JDK 版本 1.8.0_xxx(推荐与文章一致,避免兼容性问题) IntelliJ IDEA 2019.x 或更高版本 JDK 9+ 注意事项: JDK 9 引入了模块系统(java.base、java.sql 等模块),源码结构与 JDK 8 有较大差异,不再有统一的 src.zip。如果使用 JDK 9+,可参考 OpenJDK 仓库直接 clone 对应版本的源码,并通过 jigsaw 模块化方式导入。本文方法主要适 ...
Java
未读前几天同事遇到了一个很奇怪的 NullPointerException 异常,看她郁闷的蛮久都没有解决,也帮忙分析了一下,情况大致如下: 看得她一头雾水,在帮其初步分析也没想到是啥问题,因为是批量代码,没有相关文件不好本地测试,让其远程 debug 跟了一下代码,发现还是报空指针异常,最后怀疑是服务器上 jar 包没有更新到,拿下 jar 包反编译后,才恍然大悟(反编译如下图),是自己忽略 Person 类和 Student 类的类型了,一个是 Integer ,一个是 int 基本类型,1.5 之后的 JDK 在编译的时候会有自动拆装箱机制!这里记录一下 Java 中包装类型相关的知识点,做个小总结。 基本类型和包装类Java 中 8 种基本类型对应的包装类型如下表: 基本类型 大小 包装类型 boolean 1 Byte Boolean char 2 Byte Character byte 1 Byte Byte short 2 Byte Short int 4 Byte Integer long 8 Byte Long float 4 By ...
IT技术
未读项目开发中遇到了一个问题:代码中新增了 shell 脚本,打包放到服务器上执行时,因不同 OS 系统换行符不同而导致执行报错。粗略解决后,写篇博客记录一下。 \r 和 \n 区别 符号 名称 ASCII 说明 \r CR (Carriage Return) 0x0D 回车,回到本行的行首 \n LF (Line Feed) 0x0A 换行,到下一行的行首 其历史渊源如下: 在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33)的玩意,每秒钟可以打 10 个字符。但是它有一个问题,就是打完一行换行的时候,要用去 0.2 秒,正好可以打两个字符。要是在这 0.2 秒里面,又有新的字符传过来,那么这个字符将丢失。于是,研制人员想了个办法解决这个问题,就是在每行后面加两个表示结束的字符。一个叫做”回车”,告诉打字机把打印头定位在左边界;另一个叫做”换行”,告诉打字机把纸向下移一行。这就是”换行”和”回车”的来历,从它们的英语名字上也可以看出一二。后来,计算机发明了,这两个概念也就被搬到了计算机上。那时,存储器很贵,一些科学家认为在每行结尾加两个字 ...















