技术复盘:基于 OAuth 2.0 规范的 Spring Boot 鉴权标准化改造
现状与需求在 Hoteler 项目的开发测试阶段,由于原有的登录接口 /token 采用非标设计(自定义 JSON 结构、Header 传参),导致 Swagger UI (SpringDoc) 无法识别认证状态,必须手动复制 Token 并粘贴至 Authorize 框中,测试效率低。
目标:实现符合 OAuth 2.0 Password Grant 规范的接口,对接 Swagger UI 自动鉴权流。
协议参考本次改造主要参考了以下关于 OAuth 2.0 协议实现的标准逻辑:
理解OAuth 2.0
OAuth 2.0 的一个简单解释
OAuth 2.0 的四种方式
GitHub OAuth 第三方登录示例教程
技术实现方案响应报文的标准化(Schema Mapping)OAuth 2.0 规定 Access Token Response 的根路径必须包含 access_token。为兼容原有业务对象 UserToken,采用接口注入方式扩展响应体:
12345678910public interface OAuth2Compatible { @Js ...
在 Spring WebFlux 项目中将 JDBC 迁移到 R2DBC
前言在最近的项目中,我尝试将原本使用 JDBC 的数据访问迁移到 R2DBC,以充分发挥 Spring WebFlux 的响应式优势。在这个过程中,我记录了迁移的理由、步骤、遇到的坑以及一些遗憾,希望对同样做迁移的同学有所帮助。
迁移理由不熟悉 R2DBC在项目最初阶段,我完全没有接触过 R2DBC,对响应式数据库访问不了解,所以直接使用了 JDBC
既然使用 WebFlux,就应该使用非堵塞式语法Spring WebFlux 的核心优势在于非阻塞、异步。JDBC 是阻塞式的,如果在 WebFlux 中使用,会阻塞 Netty 的 EventLoop,导致性能无法提升。迁移到 R2DBC 可以充分利用响应式编程和事件循环模型
迁移步骤示例以 WorkerDao 为例,原先使用 JDBC:12345678910public List<Worker> list() { var sql = "SELECT * FROM workers WHERE id = ? deleted_at IS NULL"; return jdbcTemplat ...
内网环境 K3s 部署实战:从 Zot OCI 托管到 HTTPS 域名解析全记录
前言在内网环境下搭建云原生基础设施时,镜像仓库的认证、OCI 协议的适配以及 Ingress 的路由转发通常是最容易卡壳的地方。本文记录了将应用部署至 K3s 集群,并通过自定义域名实现 HTTPS 访问的全过程。
环境信息
Zot 仓库 (OCI): 192.168.31.220:5000
K3s 节点: 192.168.31.222
服务域名: health-master-dev.damingerdaiinternal.com
标准部署流程镜像仓库与 Helm 认证由于 Zot 采用 OCI 标准存储 Helm Chart,部署前需先在本地终端完成登录:
12# 登录 OCI 注册表echo "YOUR_PASSWORD" | helm registry login 192.168.31.220:5000 -u admin --password-stdin --insecure
配置 K3s 节点免密拉取为了让 K3s 能够拉取私有仓库的镜像,需在 192.168.31.222 节点上配置/etc/rancher/k3s/registries.yaml:
1 ...
从 3 秒白屏到首屏可见 —— 一次基于 Chrome Performance Call Tree 的深度优化复盘
🎯 从 3 秒白屏到首屏可见 —— 一次基于 Chrome Performance Call Tree 的深度优化复盘
一、问题现象
页面首次进入白屏约 3 秒
300 个 Card 同步渲染
每个 Card 内嵌流程图组件
数据量 < 1000
现象不是掉帧,而是:
页面完全不可见,直到 JS 执行完成。
二、使用 Chrome DevTools Performance 分析1️⃣ 录制方式
打开 Performance 面板
录制页面加载过程
停止录制
切换到 Call Tree 视图
三、关键截图分析(Call Tree)
从 Call Tree 中可以看到几个关键点:
🔴 1. 主线程长时间被占用顶部可以看到:
Function call
performWorkUntilDeadline
Run console task
beginWork
说明:
这是一次 React 同步渲染过程。
🔴 2. React 渲染链路非常清晰调用栈结构大致如下:
12345678910performWorkUntilDeadline└── beginWork└─ ...
2025年度总结
2025年度总结对我来说,2025年其实又是一个特别有意义的一年。3月初陪老婆去了一次她心心念念的日本,11月的最后一天,在中介第二次带看的情况,匆匆忙忙的买下上海一套二手房,圆了老婆又一个心愿。
日本之行日本原计划是24年底就去的,但是因为失业,只关心找工作就放弃了。我本身去日本的兴趣不大,但是老婆非常想去就很仓促的时间定下去日本。我们去的是大阪,大概还有一个月的时候就是大阪世博会了,3月份初去还是还好,要是晚了估计人就太多了。
大阪
在大阪玩的很开心,感觉大阪是一个很国际化的大都市,不少西方和东南亚的面孔。就算看上去东亚面孔,也有很大的可能是中国人。我真的在大阪的地铁里听两个中国人可能是仗着日本人听不懂中国话说着非常非常虎狼的词儿。
在大阪住的酒店有个温泉,可以免费去泡澡,没有国内那种搓澡等服务,就是纯粹的泡澡。 水很温和,不是十分烫人,让人感觉到十分舒服,感觉真的可以吸取洗去一声的疲惫。看了酒店的说明,估计这个温泉真的是从山里拉来的真的地下水,比国内所谓温泉但是就是自己烧开水强多了。
在大阪,环球影城应该算得上必打卡点了,加上有一个马里奥馆,还是很值得去的。个人比 ...
Grafana UI 部署与技术复盘报告
Grafana UI 部署与技术复盘报告1. 基础环境
集群环境: K3s (192.168.0.113)
监控套件: kube-prometheus-stack (Helm 部署)
目标: 通过正式域名 grafana.damingerdaint.com 暴露 Grafana UI 页面。
2. 成功方案:Ingress 部署实践由于 K3s 内置的 Traefik 默认已占用 80 端口,采用 Ingress 方案避开了端口冲突,实现了快速上线。
配置实现 (v1 标准写法)123456789101112131415161718192021apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: grafana-ui-ingress namespace: monitoring annotations: traefik.ingress.kubernetes.io/router.entrypoints: webspec: ingressClassName: traefik # 修复 Deprecated ...
轻量级私有镜像仓库选型——Zot 部署与多工具兼容性实测
技术博客:轻量级私有镜像仓库选型——Zot 部署与多工具兼容性实测1. 选型背景在私有化环境构建容器镜像仓库时,传统的 Docker Registry (V2) 缺乏原生 UI,而 Harbor 架构过于臃肿。经过调研,Zot 表现出了极佳的工业属性:单二进制文件、资源占用极低、完全兼容 OCI 规范。
2. 环境说明
部署主机:192.168.0.113
软件版本:zot-linux-amd64:v2.1.14
客户端:Docker (24.0.x), Podman (4.x)
3. 部署要点:权限与配置Zot 的权限管理通过 .htpasswd 实现。实测发现,v2.x 版本对加密算法有特定要求,若使用默认的 MD5 格式,日志会抛出 unsupported hash type 警告。
3.1 权限文件初始化必须使用 Bcrypt 算法生成加密文件,以确保 v2.1.14 能够正确解析。
1234567# 安装工具链sudo apt-get install apache2-utils -y# 生成 Bcrypt 加密文件 (-B 是核心参数)# 账号:admin,密码:12345 ...
实践分享:在 Go 项目中实现一个安全的密码重置流程
实践分享:在 Go 项目中实现一个安全的密码重置流程1. 业务场景在我们的 health-master 项目中,我们需要一个安全且用户体验良好的密码重置功能。用户流程如下:
输入邮箱申请重置 收到邮件链接。
点击链接 页面显示脱敏后的账号(确认没点错)。
输入并提交新密码 链接失效 修改成功。
2. 技术难点与设计方案2.1 数据库建模我们不只是存一个 Token 字符串,而是将“重置请求”看作一个有生命周期的资源。
1234567891011CREATE TABLE tokens ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), user_id UUID NOT NULL, token_hash VARCHAR(64) NOT NULL, -- 存储 SHA-256 哈希值而非明文 category VARCHAR(20) NOT NULL, -- 类型,如 password_reset used_count INT DEFAULT 0, -- 已使用次数 max_uses ...
玩转 K8s 面板:轻量级 Kite 安装全记录 (K3s 篇)
前言在 Kubernetes 运维中,官方的 Dashboard 虽然功能齐全但显得有些沉重。如果你正在寻找一款轻量、现代化、且安装简单的监控面板,Kite 绝对是一个惊喜。本文将详细记录如何在 K3s 环境下安装 Kite,并配置 Ingress 域名访问以及集成 Prometheus 历史监控。
一、 环境准备
集群环境:K3s (自带 Traefik Ingress Controller)
节点 IP:192.168.31.222
目标域名:kite.damingerdaiinternal.com
二、 部署 Kite 核心组件首先,我们直接使用官方提供的清单将 Kite 安装到 kube-system 命名空间下:
12kubectl apply -f https://raw.githubusercontent.com/zxh326/kite/refs/heads/main/deploy/install.yaml
1. 修改服务为 NodePort (可选)为了方便最初的调试,我们可以将 Service 类型修改为 NodePort 并指定端口 32008:
12kubec ...
在 Minikube 上部署 Rancher:避坑指南与实战教程
前言在本地环境(如 Minikube)部署 Rancher 时,最常见的两个问题是资源分配不足和证书签发卡死。本文将记录如何通过宿主机 IP(192.168.31.133)和固定 NodePort(30081)成功搭建 Rancher。
一、 环境准备
宿主机 IP: 192.168.31.133
目标访问端口: 30081
1. 启动 Minikube (关键参数)在 Docker 驱动下,Minikube 运行在容器内。为了让宿主机能直接访问 NodePort,必须在启动时通过 --ports 参数建立隧道映射。
123456# 建议先清理旧环境minikube delete# 启动并映射 30081 端口,分配至少 8GB 内存(Rancher 较重,建议给足)minikube start --cpus 4 --memory 8192 --driver=docker --ports=30081:30081
2. 安装 Helm12curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | ...
