- 博客(211)
- 资源 (6)
- 收藏
- 关注
原创 MySQL 软删除 (Soft Delete) 与唯一索引 (Unique Constraint) 的冲突与解决
本文探讨了MySQL中软删除与唯一性约束的冲突问题及解决方案。当数据被软删除(标记而非物理删除)时,传统唯一索引会导致无法重新创建同名记录。常见方法如联合唯一索引或应用层校验都存在缺陷。作者提出利用MySQL生成列的特性:创建一个虚拟列,仅在未删除时存储原值(触发唯一约束),删除时设为NULL(允许重复)。通过在该列建立唯一索引,完美实现了保留删除记录的同时确保活跃数据的唯一性。文章还提供了SQL实现方案和Spring Data JPA的适配建议,为类似场景提供了最佳实践。
2025-12-04 14:29:12
633
原创 解密 `StringHttpMessageConverter` 如何破坏你的 `Result<T>` 封装
Spring Boot 应用中,当使用 ResponseBodyAdvice 统一封装 API 响应时,返回 String 类型会出现异常,响应变成 text/plain 格式的字符串而非预期的 JSON 结构。
2025-10-27 23:20:35
951
原创 构建优雅的 Spring Boot Starter:Bean 注册与属性绑定的两大机制
本文深入解析了Spring Boot Starter中Bean初始化和配置属性绑定的核心机制,指出最佳实践。1)避免直接在Starter中使用@Component注解,因其依赖组件扫描且不可控;2)推荐使用自动配置机制,通过@AutoConfiguration和条件注解实现按需加载;3)配置属性绑定需配合@ConfigurationProperties和@EnableConfigurationProperties使用,确保条件化注册。文章强调自动配置是Starter开发的唯一推荐方案,能提供可控组件集成方式
2025-10-20 04:31:23
798
原创 构建优雅的 Spring Boot Starter:深入掌握国际化与配置覆盖的最佳实践
在微服务与组件化盛行的时代,Spring Boot Starter 已成为封装通用能力的首选。但一个优秀的 Starter 不仅要功能强大,更应具备良好的灵活性。本文将直面一个经典挑战:如何为 Starter 内的提示与异常信息提供默认的国际化(i18n)支持,同时允许使用它的主应用(Consumer)轻松覆盖这些翻译?我们将深入 Spring `MessageSource` 的核心,揭示其强大的父子级联机制 (Parent-Child Chaining),并提供一套经过实战检验的“可覆盖”国际化方案。
2025-10-19 19:40:21
706
原创 告别混乱,拥抱有序:为什么你的下一个ID生成器应该是ULID,而不是UUID
还在忍受UUID的无序之痛吗?其纯随机性是日志追踪和数据库性能的噩梦。ULID作为现代替代方案,巧妙结合48位时间戳与80位随机数,实现了ID的字典序排序。这不仅让日志分析一目了然,还因其单调递增特性,大幅提升数据库写入性能,避免索引破碎。无论是追踪ID还是数据库主键,ULID都是追求有序与高效的卓越之选。
2025-10-19 04:40:50
5605
原创 告别环境地狱,拥抱“零摩擦”:为什么 Volta + pnpm 是你下一代 Node.js 工作流的终极答案
传统Node.js开发中,频繁手动nvm use以及版本切换导致pnpm等全局工具失效是常见痛点。本文主张用Volta替代NVM,打造自动化、零摩擦的工作流。Volta能根据项目package.json的配置,在你进入目录时自动无感切换Node与pnpm版本,无需任何手动命令。它彻底解耦了工具与Node的绑定,确保团队环境的绝对一致与稳定。结合pnpm的高效依赖管理,这套方案能让开发者彻底告别环境混乱,专注于核心工作。
2025-10-01 02:53:45
2086
原创 LLM:语言的模仿大师,而非世界的理解者——对“幻觉”本质与工程边界的再思考
摘要: 大语言模型(LLM)常被拟人化地比作能“思考”或“创造”的智能体,但其本质是概率预测引擎,缺乏真正的世界认知。这种误读导致应用中产生矛盾:LLM既能展现复杂推理能力,又会犯基本错误。其“幻觉”并非记忆失误,而是统计生成的必然结果。要驾驭LLM,需通过检索增强生成(RAG)、思维链推理(CoT)和情境切换等工程方法,构建外部约束系统,将LLM从语言模仿者转变为可靠工具。核心在于接受其概率本质,以外置逻辑弥补其“世界模型”的缺失,实现可控应用。
2025-09-30 04:56:49
363
原创 解决 `registry.k8s.io` 拉取镜像慢或失败:配置 Docker 代理一劳永逸
本文介绍了如何通过配置Docker全局网络代理解决从registry.k8s.io等国外镜像仓库拉取镜像缓慢的问题。方法包括:创建代理配置文件设置HTTP/HTTPS代理,重载systemd并重启Docker服务,以及验证配置生效。相比手动使用国内镜像源,配置代理能永久生效、适用于所有国外仓库,且部署环境友好。通过简单的四步操作,即可实现稳定快速的镜像拉取,提升开发和运维效率。
2025-08-25 01:38:48
1244
原创 从手动到自动:我的 Kubernetes NFS 存储之旅
Kubernetes存储管理从手动到自动化的实践指南 本文分享了Kubernetes存储管理的实践经验,从静态存储到动态供应的完整解决方案。文章首先介绍了NFS服务器的搭建步骤。然后深入讲解了PV和PVC的静态绑定机制,通过房产中介的比喻形象说明自动匹配逻辑,并对比了手动绑定和自动匹配两种模式的区别。最后,文章将引导读者实现基于StorageClass的NFS动态存储供应,解决手动创建PV的低效问题,充分发挥Kubernetes的自动化优势。整个实践过程循序渐进,适合Kubernetes初学者理解存储管理。
2025-08-25 01:23:05
1301
原创 k8s之 Pod 资源管理与 QoS
本文深入解析Kubernetes Pod资源配置的关键概念,包括资源需求(requests)和限制(limits)的作用区别。资源需求确保Pod获得最低保障资源,影响调度决策;资源限制则防止Pod过度消耗资源。Kubernetes根据这些配置将Pod划分为三种服务质量(QoS)等级:保证型(Guaranteed)、突发型(Burstable)和尽力而为型(BestEffort),它们决定了资源紧张时Pod的终止优先级。
2025-08-23 20:14:16
839
原创 容器安全实践(三):信任、约定与“安全基线”镜像库
本文探讨了容器安全实践中的关键问题与解决方案。针对官方镜像默认以root身份运行的安全隐患,提出通过重构Dockerfile构建安全基线镜像的方法。文章详细展示了如何为Nginx创建非root用户镜像,包括修改配置文件、设置文件权限等具体步骤,并配套Kubernetes的安全部署配置。强调容器安全是一个完整体系,需从镜像构建阶段就开始权限管理,通过信任和约定建立内部的安全基线镜像库。这种安全责任前置的做法,既能确保容器安全,又能简化后续运维流程。
2025-08-23 17:50:29
1042
原创 容器安全实践(二):实践篇 - 从 `Dockerfile` 到 Pod 的权限深耕
本文深入探讨容器安全实践,重点分析runAsNonRoot的本质意义、镜像构建与运行时权限的契约关系。文章指出runAsNonRoot不仅是简单的安全开关,更是彻底放弃root权限的安全理念。在镜像构建环节,强调"构建时用root,运行时用非root"的黄金法则,详细说明Dockerfile中创建非root用户、处理文件权限等关键步骤。最后,提出Kubernetes部署时的安全配置组合拳,强调容器安全是从镜像构建到Pod运行的全生命周期防护过程。
2025-08-23 16:44:47
1009
原创 解密 Kubernetes 权限管理:supplementalGroups 的魔力与 fsGroup 的选择
本文探讨了Kubernetes中supplementalGroups的作用与使用方法。作为Pod安全上下文字段,它允许为容器进程添加额外组ID,使其能够访问主组之外的资源,而无需更改主身份。supplementalGroups作用于进程组列表,不修改文件;而fsGroup则修改挂载卷的文件所有权。建议根据需要组合使用runAsUser、runAsGroup和fsGroup管理数据卷权限,仅对特殊场景使用suppl
2025-08-23 15:55:37
973
原创 容器安全实践(一):概念篇 - 从“想当然”到“真相”
容器安全不能依赖默认配置,共享内核机制使其存在安全风险。默认情况下容器以root用户运行,可能危及宿主机。特权容器(privileged)更危险,几乎等同宿主机root权限。Kubernetes提供了Pod安全策略(PSA)和安全上下文双重防护,建议:1)强制非root用户运行(runAsUser);2)丢弃所有非必要特权(capabilities);3)禁止权限提升;4)使用只读文件系统(readOnlyRootFilesystem)。通过Pod级别通用策略和容器级精细配置,构建深度防御体系。
2025-08-23 15:21:26
2077
原创 告别硬编码:用 Command 和环境变量动态配置 Kubernetes 应用
本文探讨了容器镜像中的ENTRYPOINT和CMD指令与Kubernetes Pod配置中command和args字段的关系,介绍了如何通过环境变量实现灵活配置。文章首先解释了Dockerfile中ENTRYPOINT定义主程序、CMD提供默认参数的作用,以及docker run命令如何覆盖这些设置。随后详细说明了Kubernetes中command覆盖ENTRYPOINT、args覆盖CMD的机制,并提供了多个配置示例。最后强调了使用环境变量解耦配置的最佳实践
2025-08-23 12:51:07
1227
原创 深入理解Kubernetes核心:标签与标签选择器实战解析
Kubernetes标签(Labels)和标签选择器(Label Selectors)是资源编排的核心机制。标签是附加到资源的键值对,用于组织和筛选对象,遵循[前缀/]名称的格式规范。标签选择器分为基于等值关系(如=、!=)和基于集合关系(如in、exists)两种,用于查询符合条件的资源。标签用于程序筛选,而注解用于记录非识别性元数据。掌握标签和选择器是高效管理Kubernetes集群的关键。
2025-08-22 21:32:05
996
原创 k8s标签深度解析:别再混淆 metadata 和 template 了!
Kubernetes YAML文件中顶层metadata.labels和spec.template.metadata.labels的区别: 顶层metadata:标识资源对象本身(如Deployment),用于资源管理和分类 template metadata:定义由控制器创建的Pod的标签,必须包含selector.matchLabels中指定的所有标签。理解这两者的区别对Kubernetes资源管理至关重要。
2025-08-22 21:02:04
926
原创 使用 YAML 文件,如何优雅地删除 k8s 资源?
本文介绍了两种基于文件删除Kubernetes资源的方法:1)kubectl delete -f直接删除YAML文件中定义的资源,操作简单安全;2)kubectl apply --prune通过比较集群状态与本地文件实现同步删除,适用于GitOps场景但需谨慎使用标签选择器。第一种方法适合日常删除操作,第二种更适合自动化集群管理。两种方法各有优势,可根据实际需求选择使用。
2025-08-22 20:19:16
524
原创 深入理解 Kubernetes 网络:四种核心通信模型详解
本文深入解析Kubernetes网络四大核心通信模型:1)同一Pod内容器间通过共享网络命名空间通信;2)Pod间通过CNI插件实现直接通信;3)Pod通过Service的稳定地址访问服务,由kube-proxy提供负载均衡;4)外部流量通过NodePort/LoadBalancer/Ingress访问集群服务。Kubernetes网络遵循"每个Pod拥有唯一IP"原则,确保透明通信,为微服务架构奠定基础。理解这些模型对构建可靠云原生应用至关重要。
2025-08-22 01:02:07
1018
原创 K8s概念之进程、容器与 Pod 的终极指南
本文用通俗比喻解析Kubernetes中进程、容器和Pod的区别:进程是程序执行的实例(如房间里的活动);容器是隔离的运行时环境(如独立房间);Pod则是多个容器的逻辑分组(如整栋房子),共享网络、存储并被统一调度。这三个概念层层嵌套,Pod作为Kubernetes最小调度单元,是应用部署的基本单位。通过"房子"的比喻和对比表格,帮助初学者快速理解这些核心概念的本质差异和相互关系。
2025-08-21 23:49:30
352
原创 告别踩坑:Kubernetes 集群节点的四大核心配置指南
Kubernetes节点配置需重点关注四大核心要素:禁用Swap:避免性能下降和调度误判,需永久修改/etc/fstab;DNS配置:确保内外网域名解析,检查systemd-resolved状态及/etc/resolv.conf;防火墙规则:精准开放K8s所需端口(如6443、10250等),避免全关导致安全风险;时间同步:通过NTP(如chrony)保持节点时间一致,防止证书失效和日志混乱。这些配置是集群稳定运行的基础,需在部署前严格校验。
2025-08-20 19:10:57
512
原创 Ubuntu 主机名:精通配置与管理
本文详细介绍了 Ubuntu 主机名的配置最佳实践是将静态主机名设为完全限定域名(FQDN),如 k8s-node03.ilinux.io。配置分两步:首先,使用现代命令 sudo hostnamectl set-hostname FQDN 设置主机名,该命令会自动更新 /etc/hostname。其次,手动编辑 /etc/hosts 文件,将 FQDN 和短主机名同时映射到 127.0.1.1。遵循此流程可确保主机名在所有网络环境中都能正确解析
2025-08-20 18:43:23
1209
原创 精简 Ubuntu 登录欢迎信息:让你的终端更干净、高效
文章介绍了三种精简 Ubuntu 登录欢迎信息(MOTD)的方法。最推荐的是通过移除 /etc/update-motd.d/ 下特定脚本的执行权限,实现按需精简。如果只想精简 SSH 登录,可修改 /etc/ssh/sshd_config 并设置 PrintMotd no。最后,文章提到一种高级方法:注释掉 /etc/pam.d/sshd 中的 pam_motd.so 行,以完全禁用 MOTD。文章强调,通过这些方法,可将冗长的登录信息变为一个简洁、高效的终端环境。
2025-08-20 18:28:58
416
原创 SLF4J 日志新风尚:Fluent API vs. 传统 API,谁是你的菜?
SLF4J 2.x 引入的 Fluent Logging API 与传统日志记录方式形成对比。传统 API 简洁高效,适用于简单文本日志,通过{}占位符实现延迟格式化。而 Fluent API 采用链式调用,支持结构化日志(JSON格式)、真正的懒加载(避免不必要计算)和动态日志构建,更适合现代日志分析系统.
2025-07-19 20:54:39
1321
原创 Logback 配置的利器:深入理解<property>与<variable>
Logback 的 <property> 定义静态值,可从 XML 或外部文件加载,提升配置复用与可读性。<variable> 更动态,通过 scope 从系统属性或环境变量取值,适应多环境与云原生部署。解析属性时遵循优先级:本地/上下文 > 系统属性 > 环境变量。理解并结合使用两者,能构建灵活且适应性强的 Logback 配置。
2025-07-19 00:00:15
942
原创 Spring Boot 应用优雅停机与资源清理:深入理解关闭钩子
本文探讨了Spring Boot应用实现优雅停机(Graceful Shutdown)的关键机制。重点解析了spring.main.register-shutdown-hook配置项(默认为true)的作用,它决定了Spring Boot是否向JVM注册关闭钩子,确保在收到正常终止信号时能执行清理操作。文章详细介绍了两种实现自定义清理逻辑的方式:监听ContextClosedEvent事件(适用于全局清理)和使用@PreDestroy注解(适用于Bean级清理)。
2025-07-18 09:00:00
1413
1
原创 揭秘 Spring Boot 日志:Logback 配置文件加载顺序的奥秘
这篇博客深入探讨了 Spring Boot 中 Logback 日志配置文件的加载机制。文章详细解析了 AbstractLoggingSystem 的源码,揭示了配置文件(包括 logback.xml 和 logback-spring.xml)是如何被发现和加载的。文中明确了优先级规则:JVM 系统属性最高,其次是 logging.config 属性,然后是支持 Spring Profile 的 logback-spring.xml(优先级高于标准 logback.xml),最后是 Logback 的默认配
2025-07-18 03:12:06
971
2
原创 解决 ubuntu server 24中 SSH 服务修改端口不生效的问题
摘要: Ubuntu Server 24修改SSH端口未生效,因ssh.socket强制监听22端口覆盖配置。解决方案: 禁用干扰:sudo systemctl stop ssh.socket && sudo systemctl disable ssh.socket 重启服务:sudo systemctl restart sshd 验证:ss -tulnp | grep sshd应显示新端口616。 关键点: 必须彻底禁用ssh.socket才能解除22端口占用 检查日志确认无port 22
2025-05-26 01:28:53
1596
3
原创 修复ubuntu server笔记本合盖导致的无线网卡故障
摘要: Ubuntu服务器合盖后网络连接失败,主要因系统休眠策略和无线网卡省电模式导致。解决方案包括:1)修改/etc/systemd/logind.conf设置为合盖不操作;2)关闭无线网卡省电模式。执行命令调整后重启服务,问题解决。若仍异常,需检查网卡驱动兼容性。
2025-05-26 00:08:03
530
1
原创 在 Ubuntu linux系统中设置时区的方案
摘要 本文介绍了在Ubuntu系统中查看和更新时区的详细方法。查看时区可使用timedatectl命令或查看/etc/timezone文件。更新时区推荐使用timedatectl set-timezone命令,也可手动修改/etc/localtime链接和/etc/timezone文件。同时提供了验证时区设置的方法,并针对NTP冲突、硬件时钟干扰等常见问题给出了解决方案。文末还提醒了虚拟机环境下的特殊注意事项,建议修改后重启相关服务并检查系统日志。
2025-05-25 10:37:49
1018
2
原创 Ubuntu 上开启 SSH 服务、禁用密码登录并仅允许密钥认证
本文介绍了在Ubuntu系统上配置仅允许SSH密钥认证的安全方案。主要内容包括:安装OpenSSH服务并设置开机自启;使用ed25519算法生成密钥对;将公钥上传至服务器并写入authorized_keys文件;通过修改sshd_config禁用密码登录;提供验证配置和防火墙设置方法。文中特别强调密钥保管安全,建议在禁用密码前确保密钥登录可用,避免被锁。该方案有效提升了系统安全性,适合22.10及以上版本Ubuntu系统。
2025-05-25 03:45:33
1053
1
原创 Ubuntu Server 24 设置 WiFi 网络的方案
本文详细解析了在 **Ubuntu Server 24 系统中配置无线网络静态 IP 的全流程方案**,重点围绕 **Netplan 配置框架**展开。文章阐述了如何通过编辑 `/etc/netplan/` 下的 YAML 文件定义静态 IP 地址、子网掩码、网关及 DNS,同时集成 WiFi 的 SSID 和密码认证。深入探讨了 `networkd` 与 `NetworkManager` 两种网络渲染器的核心差异,指导用户根据服务器或桌面环境选择适配方案,并强调 **YAML 格式缩进规则**、**接口名
2025-05-25 02:24:40
2860
2
原创 python中http.cookiejar和http.cookie的区别
Python中的http.cookiejar和http.cookies模块功能不同,分别用于客户端和服务器端的Cookie管理。http.cookiejar主要用于HTTP客户端的Cookie存储、发送和接收,支持跨请求的会话管理,适合网络爬虫等场景。其核心类如CookieJar和FileCookieJar支持持久化存储。而http.cookies则用于服务器端解析和生成HTTP协议中的Cookie头,适合Web框架处理单个Cookie。http.cookiejar适合客户端会话维护,http.cookie
2025-05-18 23:56:50
885
原创 httpx[http2] 和 httpx 的核心区别及使用场景如下
httpx 和 httpx[http2] 的主要区别在于对 HTTP/2 协议的支持。基础版 httpx 仅支持 HTTP/1.1,适用于普通 API 调用和轻量级需求,依赖较少。而 httpx[http2] 支持 HTTP/2,需额外安装 h2 等依赖,适用于高性能传输、强制 HTTP/2 的网站、高并发请求和流式传输等场景。HTTP/2 通过二进制分帧、多路复用和头部压缩等技术,显著提升了性能。使用 httpx[http2] 时,需显式启用 HTTP/2,若服务器不支持则会自动降级为 HTTP/1.1。
2025-05-18 23:54:03
663
1
原创 java构建工具之Gradle
任务定义方式,总体分为两大类:一种是通过 Project 中的task()方法,另一种是通过tasks 对象的 create 或者register 方法。//任务名称,闭包都作为参数println "taskA..."task('A',{})//闭包作为最后一个参数可以直接从括号中拿出来println "taskB..."task('B'){//groovy语法支持省略方法括号:上面三种本质是一种task C{//action属性可以设置为闭包task(map,"D");
2025-01-26 23:27:02
1293
原创 java中通过注解实现自定义验证器
本文介绍了如何创建并使用自定义验证注解来校验"YYYY-MM"格式的数据。首先定义了一个@ValidYearMonth注解,指定了验证规则和错误提示信息。然后实现了YearMonthValidator验证器类,通过正则表达式"\d{4}-\d{2}"确保字符串符合年月格式。最后展示了如何在实体类字段上使用该注解进行校验。这种自定义验证方式可以灵活应用于各种格式校验需求,确保数据在持久化前符合业务规则。
2024-03-04 18:11:32
639
1
原创 关于JPA中CascadeType.REMOVE 和 orphanRemoval = true 与软删除逻辑的冲突及解决
本文探讨了JPA中CascadeType.REMOVE和orphanRemoval=true与软删除策略的冲突。两者都会导致物理删除操作,与软删除保留数据的初衷相违背。建议避免使用这两个设置,转而采用业务逻辑手动处理软删除传播或实现自定义删除逻辑。在设计数据模型时需综合考虑实体关系与删除策略的兼容性,以维护数据完整性。最终结论指出这些JPA特性通常不适用于软删除场景,开发者应根据需求选择合适策略。
2024-03-04 12:53:53
713
原创 关于JPA中CascadeType.REMOVE 和 orphanRemoval = true 的区别
关于JPA中CascadeType.REMOVE 和 orphanRemoval = true 的区别
2024-03-04 12:42:57
886
原创 修改angular cli 的默认包管理器
运行 ng new Angular CLI 时默认使用 npm 作为包管理器。在本文中,您将了解如何设置不同的包管理器创建项目。适用于 Angular 版本 6 及更高版本。
2023-11-09 12:27:27
759
jquery-easyui-1.3.2.zip
2020-05-20
jquery-easyui-1.3.0.zip
2020-05-09
jquery-easyui-1.3.4.zip
2020-05-09
jquery-easyui-1.2.6.zip
2020-05-09
JSValidation-1_0b4
2010-07-06
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅