- 博客(230)
- 资源 (2)
- 收藏
- 关注
原创 websocket为什么需要在tcp连接成功后先发送一个标准的http请求,然后在当前tcp连接上升级协议成websocket
摘要:WebSocket协议采用HTTP升级机制设计,主要解决三大问题:(1)兼容现有网络基础设施,通过"伪装"成HTTP请求穿透防火墙和代理服务器;(2)防止跨协议攻击,通过严格的握手验证确保安全;(3)无缝集成Web生态,复用HTTP端口、安全模型和认证机制。这种设计既实现了全双工通信的创新,又兼顾了与现有网络环境的兼容性,使WebSocket得以广泛应用。
2025-12-19 15:00:00
651
原创 websocket 协议升级过程中客户端和服务器在背后都干了些啥
WebSocket协议建立连接分为三个阶段:握手阶段、数据交换阶段和连接关闭阶段。在握手阶段,客户端通过HTTP升级请求发起WebSocket连接,服务器验证后返回101状态码确认升级。数据交换阶段采用精简帧结构实现全双工通信,支持文本/二进制数据传输。最后通过关闭帧优雅终止连接。整个过程依赖底层TCP连接,HTTP仅用于初始握手,WebSocket协议则负责高效实时通信。关键点包括安全验证、数据帧封装和全双工交互。
2025-12-19 10:51:38
417
原创 springmvc websocket 的用法
WebSocket 是一种网络通信协议,它实现了客户端(通常是浏览器)与服务器之间的**全双工、双向、长连接**的通信通道。它解决了传统 HTTP 协议在实时通信场景下的痛点:* **HTTP 的短板**:HTTP 协议是**无状态、单向**的。客户端发起请求,服务器响应后连接就关闭。要实现实时数据推送(如聊天消息、实时行情),只能通过低效的“轮询”(客户端不断向服务器发送请求询问是否有新数据),这浪费了大量带宽和服务器资源。* **WebSocket 的优势**:WebSocket 在初次握
2025-12-19 10:36:40
587
原创 sshd除了远程shell外还有哪些功能
SSH(Secure Shell)是一种加密网络协议,主要用于远程登录和安全管理。其核心功能包括:1)交互式Shell访问,通过ssh user@host登录远程服务器;2)远程命令执行,直接运行单条命令;3)SFTP安全文件传输,支持上传下载等操作;4)本地端口转发(-L),将本地端口映射到远程网络;5)远程端口转发(-R),让外部访问本地服务;6)SSH代理转发(-A),安全地通过跳板机连接内网服务器。这些功能通过加密隧道保障数据传输安全,是系统管理和网络运维的重要工具。
2025-12-18 15:58:38
650
原创 go为什么设计成源码依赖,而不是二进制依赖
摘要:Go语言采用源码依赖而非二进制依赖,主要基于以下设计原则:1) 追求简单性和可重复性,确保构建一致性和环境无关;2) 实现强大跨平台编译能力,无需管理多平台二进制文件;3) 提升安全审计透明度,所有依赖源码可见;4) 支持全程序优化和死代码消除;5) 统一依赖管理,避免"依赖地狱"。虽然源码依赖存在首次编译耗时等缺点,但通过缓存机制等优化,其带来的开发效率、可靠性和跨平台优势显著。这一设计体现了Go语言"工程优先"的理念,权衡运行时性能换取开发体验的提升。
2025-12-18 14:50:47
606
原创 不懂数据库索引原理?你写的SQL跑的慢如老牛,就等着挨骂吧
本文深入解析数据库索引原理与优化实践。B+树因其平衡多路搜索特性,在范围查询和排序上完胜哈希表,通过减少磁盘IO显著提升性能。文章提出索引四大原则:最左前缀、避免失效、选择性和覆盖索引,并给出六大优化技巧,包括EXPLAIN分析、联合索引设计、分页优化等。通过血泪案例警示常见错误,如隐式转换、索引顺序错误等。最后强调优化索引是提升数据库性能的关键,建议通过慢查询日志和EXPLAIN持续优化。掌握这些技巧可大幅提升查询效率,从初级迈向高级开发。
2025-12-16 19:30:00
834
原创 不会数据结构?你写的代码正在背后偷偷骂你蠢!
数据结构不是八股文,是内功心法:堆排序能优化TOP-K查询并查集能搞定社交网络关系跳表能在Redis里替代平衡树现在省下的学习时间,将来都会变成:凌晨3点的紧急告警绩效谈话时的尴尬沉默面试时被挂掉的羞辱
2025-12-16 14:58:07
522
原创 vscode是js开发的,为什么能支持golang java等各种语言开发
VS Code通过客户端-服务器架构实现对Java等语言的支持:VS Code作为客户端提供界面交互,而独立的语言服务器(如Java语言服务器)负责深度代码分析。两者通过标准化的语言服务器协议(LSP)通信,使编辑器无需内置语言知识即可获得智能功能。这种架构实现了语言无关性、资源隔离和生态繁荣,调试功能也采用类似的调试适配器协议(DAP)。不同语言社区可开发专属服务器,所有支持LSP的编辑器都能共享这些语言服务。
2025-12-16 14:49:48
537
原创 Linux系统中的socket激活:先创建监听端口,后启动程序
本文深入探讨了Linux系统中systemd的Socket激活特性,详细解析其颠覆传统服务启动模式的核心理念:由systemd预先监听端口,在首个连接请求到达时才启动服务进程,实现按需启动和资源优化。通过配置Python HTTP服务的实战示例,展示了.service和.socket单元文件的创建方法及交互机制。与传统端口绑定方式相比,Socket激活具有启动速度快、资源占用低、可靠性高等优势,特别适合不频繁访问的服务,但也带来配置复杂度增加的代价。文章最后强调该技术将服务提供与端口监听解耦,为系统管理带来
2025-12-14 20:35:16
903
原创 排查java应用内存溢出的工具和方法
Java OOM 错误排查指南 OOM 错误排查需先确定错误类型(堆内存、Metaspace、线程数等),再使用相应工具分析。关键步骤包括:添加JVM参数自动生成堆转储文件,使用MAT分析内存泄漏,检查GC日志。常见原因有内存泄漏、堆设置过小或代码问题。建议配置-XX:+HeapDumpOnOutOfMemoryError参数,这是排查的核心。
2025-12-14 15:26:50
942
原创 深入理解 Linux Namespace:隔离技术的基石
Linux容器技术的核心是Namespace机制,它通过隔离系统资源实现轻量级虚拟化。Linux内核提供8种Namespace类型,分别隔离文件系统、主机名、进程间通信、进程ID、网络、用户权限等资源。系统启动时为每种资源创建初始命名空间,所有进程默认共享这些全局视图。运行时通过clone()、unshare()等系统调用创建新Namespace,使容器进程获得独立资源环境。这种机制让容器既能保持高性能,又具备良好的隔离性和安全性,是理解容器技术的基础。
2025-12-14 10:16:14
608
原创 容器 的 cpu request limit 与 linux cgroups 的关系
Kubernetes 通过对 Cgroups 的精细控制来实现其requests和limits机制。requestslimits下面我们进行详细的分解和解释。
2025-12-14 10:14:29
552
原创 为什么容器镜像通常需要一个操作系统,只打包进去一个可执行文件可以吗
摘要: 容器镜像通常需要基础操作系统(如Ubuntu、Alpine)来提供依赖库、系统工具和标准文件布局,确保应用在隔离环境中正常运行。虽然理论上可以仅打包静态链接的可执行文件(如使用FROM scratch),但这会导致调试困难、构建复杂且缺乏运维工具。基础镜像在易用性、安全性和功能性之间取得平衡,而极简镜像(如Distroless或Scratch)更适合特定场景,需权衡体积与运维成本。推荐折中方案(如Alpine)以兼顾效率与实用性。
2025-12-13 17:17:25
1124
原创 linux用户配置.profile 和 .bashrc 的区别
Linux中profile和bashrc文件的主要区别在于Shell启动模式。profile系列文件(如/etc/profile、~/.bash_profile)在登录Shell时执行,用于设置环境变量和一次性命令;而bashrc文件(如~/.bashrc)在交互式非登录Shell时加载,用于定义别名、函数和Shell选项。最佳实践是将环境变量放在profile文件中,将交互式设置放在bashrc中,并通过在profile中加载bashrc来确保所有设置生效。
2025-12-13 16:48:32
1278
原创 kubectl exec 的底层原理
当你使用 kubectl exec 时,可以这样理解:你不是在启动一个“容器内的进程”,而是在启动一个“拥有容器视角的宿主机进程”。Kubernetes 和容器运行时通过 Linux 命名空间这面“镜子”,让这个外部进程看到了一个完全不同的、属于容器内部的世界。这种基于命名空间的“附身”能力,正是容器技术轻量、高效和可调试性的完美体现。它模糊了容器内外的边界,让我们能从一个更高的维度去观察和管理这些被隔离的环境。
2025-12-13 16:27:24
982
原创 揭秘Kubernetes Pod网络:从veth pair到跨节点通信
本文深入解析了Kubernetes Pod网络通信原理。重点介绍了veth pair作为Pod网络基础组件的作用,它连接Pod与宿主机网络命名空间。同一节点Pod通过网桥实现高效二层通信,跨节点通信则采用Overlay隧道或BGP路由方案。文章详细阐述了两种场景下的数据流转过程,包括路由判断、ARP解析、网桥交换等关键步骤,为理解K8s网络模型和故障排查提供了理论基础。
2025-12-13 16:07:07
478
原创 Docker和容器OCI规范的关系
Docker是容器技术的先驱,推动了容器技术的普及。为避免生态碎片化,Docker牵头成立了OCI组织,制定容器格式和运行时的开放标准。OCI维护镜像规范(image-spec)和运行时规范(runtime-spec),确保不同容器实现的兼容性。如今的Docker完全遵循OCI标准,底层使用runc运行时,成为符合标准的上层产品。这种关系类似于Chrome浏览器遵循W3C标准,OCI标准保障了容器生态的互操作性和健康发展。
2025-12-08 16:49:04
513
原创 通过一个golang简单Demo,彻底搞清楚linux网络隧道通信
本文介绍了如何使用Go语言实现一个基于TUN设备的简易Linux网络隧道。该隧道由服务端和客户端两部分组成,通过TCP连接建立隧道,将TUN设备捕获的网络流量进行转发。实现步骤包括:创建TUN虚拟设备、配置IP地址、通过TCP连接传输数据包,以及双向数据转发功能。服务端监听TCP端口接收客户端流量,客户端则通过隧道将流量路由到服务端网络。该示例需要Linux环境和root权限,可作为点对点VPN的基础实现。文章提供了完整的服务端和客户端代码框架,并说明了运行测试方法。
2025-12-02 10:48:51
832
原创 docker 镜像和分层文件的关系
Docker镜像采用分层文件系统设计,由多个只读层堆叠而成,每个层对应Dockerfile指令。容器运行时会在镜像层之上添加可写层,所有修改通过写时复制机制实现。这种架构通过存储驱动(如overlay2)物理实现,具有三大优势:共享层节省空间、缓存层加速构建、增量传输优化网络。实践验证可通过docker命令查看分层结构,关键要注意大文件处理和跨层删除问题。性能测试显示分层系统可使容器启动速度提升10倍、存储空间节省85%。本质上,Docker镜像=只读层+元数据,容器=镜像层+可写层,实现高效存储、快速部署
2025-06-25 10:27:11
519
原创 docker 分层文件系统和 push 的关系
Docker的分层文件系统是其高效镜像管理的核心机制,与docker push操作紧密相关。镜像由多个只读层堆叠组成,每层通过SHA256标识,不同镜像可共享基础层。docker push时仅上传仓库缺失的层,已存在的层直接复用,实现增量传输。这种设计大幅提升了传输效率(如仅10MB变更时比全量推送节省98%带宽)、存储效率和构建速度。最佳实践包括优化层结构、使用多阶段构建和保持基础镜像一致,充分发挥Docker分层机制在持续集成和微服务中的优势。
2025-06-25 10:26:29
524
原创 算法-动态规划-钢条切割问题
钢条切割问题是一个经典的动态规划问题,目标是切割给定长度的钢条以获得最大收益。通过构建最优子结构,设r[i]为长度i的最大收益,递推公式为r[i] = max(p[j] + r[i-j])。算法自底向上计算收益数组r和切割方案s,时间复杂度O(n²),空间复杂度O(n)。示例演示了n=4时,切割为2+2获得最大收益10的过程,并提供Python实现代码。该方法高效解决任意钢条长度和价格表的最优切割问题。
2025-06-22 23:03:12
704
原创 Shell脚本中变量赋值${VAR:-DEFAULT}的用法
Shell 变量赋值的参数扩展语法摘要: 核心语法: ${VAR:-DEFAULT}:空/未定义时用默认值(不修改VAR) ${VAR:=DEFAULT}:空/未定义时设置默认值(修改VAR) ${VAR:+REPLACE}:非空时替换值 ${VAR:?ERROR}:空/未定义时报错 典型应用: 变量默认值设置 条件参数替换 强制变量检查 支持嵌套和命令替换 注意事项: 含空格需加引号 :=会修改原变量 主流Shell通用 优先使用:-获取默认值,谨慎使用:=修改原变量,复杂场景可嵌套使用。
2025-06-16 15:23:23
764
原创 7种方法提高源码阅读技巧
Reading source code is in the job description of a software developer. However, this experience is not always pleasant. Not everyone would like to read someone else’s code because they find it boring, sometimes frustrating. There are cases when you start r
2025-06-15 21:25:45
752
原创 微服务架构的优点和缺点
微服务架构将复杂系统拆分为独立可部署的小服务,具有五大优势:提升可扩展性、增强故障隔离、提高团队效率、加快部署速度并降低成本。但同时也面临分布式系统复杂性、部署协调困难、测试调试繁琐等挑战。通过实施DevOps实践、建立监控日志系统、优化服务间通信和集中化管理,可以有效应对这些问题。亚马逊、Netflix等企业已成功采用微服务架构,但需根据项目复杂度、团队能力等因素谨慎评估是否采用该架构。微服务的模块化特性使维护更新更高效,是构建现代弹性应用的重要方案。
2025-06-15 20:43:59
1188
原创 一个国外工程师在支付系统中引入kafka的心路历程-How Kafka Saved Our Payment System And Helped Us Scale to 10 Million Users
摘要: 一家公司的支付系统因耦合设计导致性能瓶颈——核心交易流程与邮件、通知等次要服务同步执行,一旦某个环节延迟,整个系统崩溃,用户遭遇重复扣款等问题。团队引入Kafka消息队列进行解耦:支付成功后仅发布事件,由独立消费者异步处理邮件、日志等任务。这一改造使支付响应速度提升,系统稳定性增强,且新增功能只需接入Kafka即可,无需修改核心代码。最终,事件驱动架构支撑了千万级用户规模,赋予团队可扩展性与运维信心。(150字)
2025-06-14 23:35:37
496
原创 深入理解raft算法-Deep Dive into Raft: Consensus Algorithms in Distributed Systems
nextIndexnextIndexOnce the。
2025-06-14 22:56:16
1350
原创 H2数据库中一条insert语句到生成java对象到数据写入磁盘的完整步骤
完整流程示例1. 用户发送 `INSERT` SQL2. 生成 `Insert` 命令对象3. 创建 `Row` 并填充 `Value` 数据4. 更新内存中的 `MVMap`(B+Tree)5. 事务提交时触发: - 写入 WAL 日志(`.trace.db`) - 标记脏页 - 异步线程执行磁盘写入6. 数据最终以分块形式持久化到 `.mv.db` 文件
2025-05-18 10:28:07
1259
原创 H2数据库源码学习+debug, 数据库 sql、数据库引擎、数据库存储从此不再神秘
H2数据库源码采用标准Maven结构,核心模块包括SQL解析与执行、数据库引擎、表结构操作、索引实现、存储引擎等。SQL解析通过递归下降解析器将SQL语句转换为抽象语法树,查询优化由Query类和Optimizer负责。存储引擎采用页式存储和事务日志机制,确保ACID特性。MVCC与事务管理通过TransactionStore和LockManager实现多版本控制和行级锁。索引实现包括B-Tree、哈希索引和MVStore的跳跃表结构。
2025-05-18 10:03:57
763
原创 软件系统的可观测性 Observability
传统监控可能无法覆盖所有异常场景,Observability 允许通过数据关联(如“某时段错误率上升” + “相关日志” + “调用链瓶颈”)快速定位问题。在云原生环境中(如 Kubernetes),服务实例动态扩缩容,Observability 提供实时、细粒度的运行状态视图。现代系统(如微服务、容器化架构)依赖众多组件,问题可能跨服务、跨节点发生,需通过链路追踪和上下文日志快速定位根源。避免过度收集数据(如全量日志),采用采样(Sampling)和聚合(Aggregation)减少存储与分析开销。
2025-05-07 20:09:27
746
原创 扩展正则表达式(Extended Regular Expression,ERE)和基本正则表达式(Basic Regular Expression,BRE)的区别
扩展正则表达式(Extended Regular Expression,ERE)和基本正则表达式(Basic Regular Expression,BRE)是正则表达式的两种语法标准,主要区别在于和。
2025-05-07 19:07:19
402
原创 java Servlet Session 本身局限性&解决方案
Java Servlet 的 Session 机制本身并未被废弃,但在分布式系统(如微服务架构、集群部署)中确实存在局限性。不过,这并不意味着它无法在分布式项目中使用,而是需要结合特定技术手段来解决其扩展性和一致性问题。,但在分布式系统中需通过集中式存储(如 Redis)或框架支持(如 Spring Session)解决扩展性问题。对于追求极致无状态的场景,可转向 Token 方案。技术选型应基于实际需求(性能、维护成本、架构复杂度)权衡。pom.xml 添加依赖。
2025-05-03 19:27:36
452
原创 Spring 事务的底层原理&常见陷阱
动态代理 + 事务管理器 + ThreadLocal 是 Spring 事务的核心。自调用、异常处理、传播行为、数据库支持 是常见陷阱。通过代码审查、日志(如 AbstractPlatformTransactionManager 的 DEBUG 日志)排查问题。
2025-05-03 19:20:28
1237
原创 java整则表达式Matcher类核心方法的用法&案例说明
matches() 检查整个字符串是否完全匹配 验证输入格式(如邮箱)find() 查找下一个匹配的子串 提取字符串中的特定模式group() 获取匹配内容或捕获组 解析结构化文本(如日志)start()/end() 获取匹配位置的索引 高亮显示匹配文本replaceAll() 替换所有匹配的子串 批量文本替换appendReplacement() 流式构建替换结果 复杂替换逻辑lookingAt() 检查字符串开头是否匹配 快速前缀验证
2025-05-02 09:09:05
1200
原创 用java实现一个简单的sql select 解析器,无需第三方依赖,完全从0开始
以下是一个简单的 SQL SELECT 解析器的 Java 实现,支持单表查询和基本条件过滤。代码包含词法分析和语法分析模块,并支持以下语法:SELECT column1, column2 FROM table WHERE column3 = 5public enum TokenType {SELECT, FROM, WHERE,IDENTIFIER, COMMA, STAR, EQUALS,STRING, NUMBER, EOF}public class Token {public final
2025-05-02 04:30:00
2477
原创 Lucene多种数据类型使用说明
存储词项的位置、偏移量信息,支持高亮(Highlighting)。// 定义 String 类型字段(精确匹配):排序、聚合、分组(类似数据库的列式存储)。:允许一个字段存储多个值(如标签、分类)。:精确值匹配(如 ID、状态码、标签)。:范围查询(如价格、年龄)、排序、聚合。// 定义数值字段(IntPoint)// 存储原始值(需额外存储字段)
2025-05-01 21:35:31
1303
原创 Lucene并不是只有倒排索引一种数据结构,支持多种数据结构
Lucene 的核心机制确实以**倒排索引(Inverted Index)**为核心,但它并不是“全部”都依赖倒排索引。Lucene 的索引结构中还包含其他辅助数据结构,用于支持不同的查询场景。,但为了实现完整的搜索功能,它还依赖其他辅助数据结构。因此,Lucene 的索引是多种数据结构的组合,而不仅仅是倒排索引。,用于实现高效的全文搜索。:支持关键词搜索、短语查询、模糊查询等。:记录每个词项出现在哪些文档中(通过。倒排索引是 Lucene 的。
2025-05-01 21:33:18
1082
原创 用spring-boot-maven-plugin打包成单个jar有哪些缺点&优化方案
Fat JAR 的缺点主要集中在 性能开销、维护成本 和 场景适配性 上。建议根据以下场景选择:继续使用 Fat JAR:适合简单应用、快速原型开发或容器化部署(如 Docker + 分层构建)。切换其他方案:若追求极致启动速度 → Spring Native;若需共享依赖 → WAR + Tomcat;若依赖频繁更新 → Docker 分层镜像。
2025-05-01 21:23:26
888
原创 spring-boot-maven-plugin 将spring打包成单个jar的工作原理
核心功能:将 Spring Boot 应用及其依赖打包成一个自包含的 JAR。关键机制:自定义类加载器(JarLauncher)和嵌套依赖结构(BOOT-INF/lib)。优势:简化部署,无需外部 Web 服务器或依赖管理。适用场景:独立运行、容器化部署(Docker)等。
2025-05-01 21:07:20
1583
基于java jdbc 的数据库表结构生成工具 源代码
2024-12-20
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅