自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(151)
  • 收藏
  • 关注

原创 Spring Boot 默认使用 CGLIB,但CGLIB 无法代理 final 类或 final 方法

所以,Spring Boot 并没有“解决”这个问题,而是把问题清晰地抛给了开发者。首选方案:如果代码可控,移除 final 关键字。这是最简单、最直接的修复方式。备选方案:如果不能移除 final,就为这个类提取一个接口,然后在注入点使用接口,让 AOP 可以通过 JDK 代理工作(但这可能需要你手动将 spring.aop.proxy-target-class 设置为 false,或者进行更细粒度的控制)。终极方案:如果以上都不行,才考虑使用 AspectJ 静态织入。

2025-07-27 01:37:40 579

原创 为什么现在 Spring Boot 默认使用 CGLIB 了?

从 Spring Boot 2.0 开始,默认的代理方式被改为了 CGLIB (spring.aop.proxy-target-class=true)。为了解决这种令人困惑的场景,提供更一致、更可预测的行为,Spring Boot 最终决定拥抱 CGLIB 作为默认选项。这是因为 CGLIB 解决了一个使用 JDK 代理时非常棘手的痛点:代理对象内部方法调用无法触发 AOP 的问题。

2025-07-27 01:35:58 234

原创 AOP中的代理选择

因为从 Spring Boot 2.0 开始,默认统一使用 CGLIB 代理。即使你的类实现了接口,Spring Boot 也优先用 CGLIB。这样做可以解决一些复杂的类型转换问题,让 AOP 的行为更加一致和可预测。在现代 Spring Boot 中,你基本可以不用操心这个选择。

2025-07-27 01:14:37 408

原创 限流组件中的本地缓存没必要搞复杂的内存淘汰机制

令牌桶缓存:按用户ID/IP限流,即使大型应用也就几万到几十万用户。- 黑名单缓存:触发限流的用户是少数,通常只有几百到几千个。- 总数据量:远小于1000个条目的默认限制。- 令牌桶:1分钟TTL,不活跃用户自动清除。- 黑名单:24小时TTL,自动解封。- 数据会自然减少,不会无限增长。1. 数据量天然有限。

2025-07-26 23:20:42 65

原创 Aspect-Oriented Programming 面向切面编程

创建一个Java类,并使用 @Aspect 注解将其声明为一个切面。

2025-07-25 00:35:32 325

原创 nginx有几种日志

访问日志记录了每一个客户端对 Nginx 服务器发起的 HTTP 请求的详细信息。这对于分析用户行为、网站流量、性能监控和故障排查至关重要。错误日志记录了 Nginx 在启动、运行或关闭过程中遇到的所有错误和诊断信息。这是排查 Nginx 自身问题或与后端服务交互问题的首要工具。

2025-07-24 13:48:34 173

原创 线上异常ReadTimeout

异常信息: HTTPConnectionPool(host='47.xxx.xxx.xxx', port=80): Read timed out. (read timeout=3)时间: 2025-07-24 11:32:15。异常类型: ReadTimeout。详情: 调用房源图片识别接口失败。主机: ai-agent-1。

2025-07-24 11:43:47 379

原创 限流、熔断、降级

限流、熔断、降级是构建高可用、高弹性分布式系统的“三驾马车”。它们虽然都用于系统保护,但目的和应用场景各不相同。它们共同的目标是:在系统面临超预期压力或局部故障时,避免整个系统崩溃(即“雪崩效应”),保证核心服务的可用性。我用一个形象的比喻,把你的系统想象成一个大型商场。限流的核心在于 我能处理多少请求?熔断的核心是 防止雪崩效应。降级的核心是 丢车保帅。

2025-07-23 17:03:31 131

原创 ssh-copy-id

将你的本地公钥内容 (id_rsa.pub) 追加写入到远程的 ~/.ssh/authorized_keys 文件中。ssh-copy-id 是一个非常有用的 Shell 脚本命令,它的作用是。:一旦登录成功,它就在远程服务器上执行一小段命令。检查 ~/.ssh 目录是否存在,不存在则创建并设置权限为 700。它本质上就是帮你远程执行了所有必要的手动命令,既方便又不易出错。确保 authorized_keys 文件的权限是 600。的方式连接到 remoteuser@hostname。

2025-07-23 14:07:54 144

原创 ps aux

a 和 x 两个选项结合起来,就能确保你看到。

2025-07-21 10:41:36 327

原创 xhs-auto-post

从ds-r1换成ds-v3-pro 速度提升。

2025-07-21 10:32:31 106

原创 加了pm2,再也不用半夜起来重启被打崩的服务

Nginx配置显示它作为反向代理将请求转发到内部的FastAPI服务,同时添加了一些HTTP头信息和超时设置,还支持WebSocket连接。客户端请求 → Nginx(80端口) → PM2管理的FastAPI(5000端口)

2025-07-18 20:31:39 293

原创 前端一些常见文件

它的核心作用a是:锁定项目所有依赖(包括依赖的依赖)的确切版本,以确保在任何时间、任何机器上 npm install 都能得到完全相同的 node_modules 目录结构。eslint.config.js 是一个用来配置代码检查工具 ESLint 的文件,它的核心作用是:定义一套代码书写规则,然后让 ESLint 自动检查你的代码是否遵守了这些规则。它的核心作用是:告诉 Vite 如何构建和运行你的前端项目。package.json 是一个JSON格式的文件,它描述了你的项目,并管理项目的依赖和元信息。

2025-07-18 11:10:39 193

原创 cors跨域资源共享

前端:单独的服务器/端口/域名下运行后端:独立的服务器/端口/域名下提供API这种分离本质上就创造了"跨域"场景,不是可选的设计决策,而是架构定义的一部分。

2025-07-17 17:22:56 198

原创 为什么喜欢叫index文件

**模块导入**:在Node.js或前端框架中,当导入一个目录时(如`import User from './user'`),系统会自动寻找并导入`./user/index.js`- **网页URL**:访问`http://example.com/users/`时,服务器会自动提供`/users/index.html`文件,无需在URL中显式指定文件名。- **React**:组件通常放在各自的文件夹中,并通过`index.js`导出。- **Node.js**:包的入口点通常是`index.js`

2025-07-17 16:52:19 197

原创 Content-Type 请求头

Content-Type是HTTP请求头的一个重要字段,它告诉服务器客户端发送的数据是什么格式。在前后端通信中,这非常关键。

2025-07-17 16:47:05 136

原创 map.containsKey() 为什么不是contain而是contains

containsKey() 方法之所以用: 让 object.method() 的调用读起来像一个通顺的英文句子 ("The map contains the key.")。: ...s 形式的动词通常表示一个的方法(返回 true/false),而动词原形通常表示一个的方法(会改变对象)。它触及了编程语言命名规范的核心!简单来说,这是遵循了和的结果,目的是为了让代码读起来更像自然语言,从而提高可读性。

2025-07-17 13:39:07 315

原创 一点点dd

logger.info(f"批量处理完成 {len(urls)} 张图片,总用时: {total_time:.2f}秒,平均每张: {total_time/len(urls):.2f}秒")- **批量处理**:3张图片并行处理时间约6.9秒(比串行处理快约50%)- **单图片处理**:平均处理时间约4.5-4.8秒。**实现内容**:将原有串行处理改造为异步并行架构。**实现内容**:优化下载和处理的超时设置。**实现内容**:使用信号量控制并发数量。**实现内容**:添加详细的性能指标记录。

2025-07-16 13:33:12 405

原创 502 & 504

502 错误发生时,表示 nginx 成功连接到了上游服务器(FastAPI应用),但收到了无效响应。504 错误表示 nginx 成功连接到上游服务器,但等待响应的时间超过了配置的超时时间。

2025-07-16 12:13:02 185

原创 为什么要使用nginx?

针对您之前遇到的502和504错误,这正是因为Nginx作为反向代理在等待FastAPI应用响应时发生的超时问题。解决方法是调整Nginx的超时设置,或者优化FastAPI应用以更快地处理请求。

2025-07-16 11:03:04 160

原创 线上崩溃复盘

图片分类服务使用FastAPI构建,通过nginx反向代理到80端口对外提供服务。

2025-07-16 11:02:25 278

原创 netstat -tlnp | grep 5000

netstat 是一个用于显示网络状态(network statistics)的命令行工具。: 这个命令会从输入中(在这里是 netstat 命令的输出)查找包含字符串 "5000" 的所有行。在大多数系统中,使用此选项需要 root 用户(或使用 sudo)权限,否则可能无法显示进程信息。grep 是一个强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。: 表示显示监听该端口的程序名称(Program Name)和进程ID(PID)。: 表示仅显示 TCP 协议相关的连接。

2025-07-15 22:56:26 367

原创 第二次线上事故

1. 在`download_image`函数中增加对`application/octet-stream`的处理。- 重新启动服务:`uvicorn main:app --host 0.0.0.0 --port 5000`- 某些图片URL返回`application/octet-stream`而不是`image/jpeg`**问题原因推测**:进程可能在某个Gemini API调用处阻塞。- 进程管理:`ps`, `kill`, `nohup`1. **进程管理**:如何排查和处理无响应的服务进程。

2025-07-15 22:50:09 338

原创 僵尸进程Zombie Process

僵死进程就是一个已经死了但还存在的子进程,就是因为他的父进程没有给他收尸孤儿进程就是一个没有父进程的子进程。

2025-07-15 17:53:39 359

原创 解读 top 命令/性能监控工具

example:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

2025-07-15 17:45:42 466

原创 同一个浏览器中把 cookie 1 切换到cookie 2,会导致cookie 1失效

1. **浏览器上下文复用**:当前的实现中,同一个浏览器实例(`CustomBrowser`)在切换账号时会复用同一个浏览器上下文(`BrowserContext`)。logger.info(f"🧹 已清理 {len(xiaohongshu_cookies_to_clear)} 个现有cookies")logger.info(f"✅ 成功设置 {len(playwright_cookies)} 个新cookies到浏览器")这个方法会**直接添加新cookies到同一个浏览器上下文**,而不是替换。

2025-07-11 15:33:23 699

原创 Browser-use

是一个旨在将 Agent 与真实浏览器进行交互的 Python 库,可以轻松实现浏览器自动化。在配合 LLM使用时,browser-use 能够让你的agent发起对网页的访问、操作页面元素、收集信息、执行脚本等,从而扩展 AI 应用的落地场景。

2025-07-03 15:39:21 99

原创 server-rs

一个业务服务之所以能“一直处理请求”,是因为有一个“东西”在背后做着持续监听、接收请求、管理连接等底层工作。我们把这个“东西”统称为“服务器”(软件)“服务器”具体形态的认知——它不再是一个必须独立运行的外部软件,而是可以像乐高积木一样,被直接内嵌到你的项目代码里,让你的项目“天生就是一台服务器”这个理念是永恒不变的。无论是过去、现在还是未来,一个网络服务都需要这个底层的“服务器”来支撑。在与cursor交流中,还是越来越明白了之前 没有管过的一些"常识"server本身这个词就不确指单单这一个东西。

2025-07-02 14:18:39 283

原创 raft-rs

Consensus Module,核心共识算法模块;State Machine,保存用户数据的地方;Transport,用于通信的网络层。log,保存 Raft 日志的地方;

2025-07-01 16:10:17 210

原创 curl -s http://localhost:8080/ | head -3

提取输入内容的前若干行。:指定提取前 3 行。

2025-07-01 12:55:54 185

原创 div标签

标签的作用就是将网页内容划分为不同的区域,无内容含义。<div>

2025-06-30 16:25:14 120

原创 pkill -f xxx

是类 Unix 系统中的进程终止工具,通过。可批量终止符合条件的进程,极大提升效率。需指定进程 ID(PID)不同,在 Linux 系统中,使用。等条件匹配目标进程。

2025-06-25 17:03:20 157

原创 vibe coding

Vibe Coding 是一种全新的编程方式,开发者通过自然语言向 AI 描述需求,由 AI 自动生成代码,其核心理念是。

2025-06-25 10:26:27 85

原创 AI编程开发规范(thinking

我们和cursor沟通,要像两个技术人员之间的对话,你能力不够指导他的情况下,就跟他学习,问他的意见,他除了帮你写代码,还可以跟你讨论问题。如果0-1项目,前三个prompt非常重要。项目里程碑及时保存(dev和main分支。做好test,非常重要。代码及时回滚和多次抽卡。持续发布保存稳定版本。

2025-06-19 10:48:39 102

原创 Linux命令:发现某端口被多个进程占用 & 杀掉这些进程

管道符 `|` 将前一个命令(`lsof -ti:5000`)的输出作为后一个命令(`xargs kill -9`)的输入。`lsof -ti:5000 | xargs kill -9` 用于强制终止占用TCP端口5000的进程。`lsof`(list open files):列出系统中所有打开的文件和网络连接,并显示对应的进程信息。`kill -9`:向指定PID发送`SIGKILL`信号(强制终止进程,无法被阻塞)`xargs`:将标准输入(如`lsof`输出的PID)转换为命令行参数。

2025-06-19 09:54:57 193

原创 if __name__ == ‘__main__‘:

总的来说,`if __name__ == '__main__':` 是Python中一个重要的惯用法,有助于合理地组织模块内的代码执行逻辑,区分模块的不同使用场景,尤其是在代码的开发、测试以及被复用等多个环节都发挥着重要作用。if __name__ == '__main__': 的作用 - **判断脚本是否被直接运行**:通过 `if __name__ == '__main__':` 语句,可以判断一个模块是被直接运行还是被导入。用于判断当前脚本是作为独立程序运行还是被其他模块导入。

2025-06-19 09:42:40 168

原创 IoC到底怎么就解耦合,容易维护了

1. **编译时解耦**:OrderService不需要知道具体使用哪个PaymentService实现。1. **修改成本低**:换个实现只需要改配置,不需要改代码。3. **扩展性好**:新增功能不需要修改现有代码。// OrderService代码完全不需要改变。// 每加一个功能,都要修改这里。

2025-06-18 18:32:00 937

原创 ai 幻觉

算法会生成并非基于训练数据的输出结果,继而被转换器错误解码或不遵循任何可识别的模式。换句话说,它会在给出响应时“产生幻觉”ai幻觉: 感知人类观察者不存在或无法感知的模式或对象,从而产生无意义或完全不准确的输出。

2025-06-17 17:40:38 188

原创 优化。。。

其实就是 如果当时网络波动 网况不好 || 服务正忙 ,可以不急着在这个时候选择多次重试,或许在过一会儿后 网络状况好了 || 流量少了 ,重试成功概率更大。而 我在延时时间上加的这个 随机的时间抖动: 就是为了让多个请求的重试尽量分散均匀一些,这样重试成功率更高,效果更佳。agent项目 tool 调用外部服务时 选择了指数回避的重试机制。指数回避 我第一眼看到 这不就是 tcp重连机制吗。优化点:延迟时间那 加了一个随机的时间抖动。加时间种子: 其实只是一个的时间抖动。

2025-05-15 23:59:26 295 1

原创 ASCII、Unicode、UTF-8 字符编码

最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255,如果要表示更大的整数,就必须用更多的字节。编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。在内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。里,各国有各国的标准,就会不可避免地出现冲突,结果就是,在多语言混合的文本中,显示出来会有乱码。

2025-05-01 17:20:25 407

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除