大家好,我是花花,最近一个月一直在折腾 WAF (Web 应用防火墙) 项目。本来只是个小 Demo,但我硬是靠着 AI 这个 “神队友”,把这个项目的官网、白皮书到 PPT 全部补全了,我感觉我现在也是个独立开发者了~
项目地址在这里,欢迎大家一键三连:https://github.com/HUAHUAI23/RuiQi
最刺激的是,AI 还帮我找到了 Go 代码里的一个性能大坑,优化完效果很棒!整个过程踩了不少坑,也学到不少东西,特别是怎么跟 AI 结对干活。这篇文章就是这些经验的大放送,希望能给你带来启发。
想看我之前怎么用 AI 从零搞出 WAF Demo 的?戳这里👇
我用 Cursor 和 DevBox 业余时间开发了一个 Web 防火墙
好,书归正传。
起初,只是个想法:把 WAF Demo 搞成 “正经产品”
上回说到,我靠 AI 弄了个 WAF 的雏形。但那玩意儿就是个毛坯房,离真正能拿出手的产品还差得远。
所以,接下来的一个月,我的小目标就是:拽上 AI 这个 “苦力”,把这个 WAF Demo 打造成一个五脏俱全独立的产品。
技术上要攻坚,产品形态要完善,连带那些官网、文档什么的 “面子工程” 也得跟上。
而且,我这人就喜欢 “公开处刑”,整个过程我都坚持 “Build in Public”。遇到啥难题、怎么想办法解决的、AI 在里面咋帮我的、最后做成啥样,我都会原原本本地分享出来。
这篇文章将会向大家分享这个 “产品打磨” 阶段的真实经历。你会看到 AI 怎么帮我搞定官网、技术文档这些费时费力的东西,还有最让我兴奋的——AI 怎么帮我把 Go 代码里的一个性能瓶颈给解决了,效果是真的强!
准备好了吗?来看看 AI 时代独立开发者是怎么 “开挂” 的。
WAF 核心功能有了之后,这一个月我主要在给产品 “抛光打蜡”。不光是代码,产品形象、文档、推广材料这些都得跟上。以前独立开发者一个人干这些得累趴下,还得啥都会。现在有了 AI 就可以开挂了,以前得团队干半天的活,现在三下五除二就搞定了。
哪个正经项目还没个官网啊?毕竟是产品的门面。我把现成的资料 (项目 Wiki、更深入的技术文档、README 这些) 一股脑儿都喂给 AI,再告诉它我想要的色调和风格。
重点来了! 我用的是 Cursor 配合 DevBox。写前端 Cursor 最在行了,给它资料和风格要求,它就能从无到有把整个网站写出来,包括架构图也都是 AI 画的。
其次我需要实时预览这个官网,并且可以快速发布,DevBox 刚好就可以解决这个问题。
整个过程,我就动动嘴皮子,然后就是等待 AI 的输出,最后用 DevBox 上线。
来看看效果图:
AI生成的 WAF 项目官网首页,简洁明了
AI画的官网架构图
官网源代码:https://github.com/HUAHUAI23/waf-site
稍微复杂点的技术产品,都得有个技术白皮书,它能深入解释产品的技术原理、架构设计、核心优势等。撰写白皮书需要深厚的技术理解和严谨的写作能力。
我还是把现有的项目资料丢给 AI,然后给它个大纲 (比如摘要、引言、技术背景、架构设计这些章节),要求它写得专业、严谨。AI 很快就能弄出个初稿,结构清晰,文字也通顺。不过,涉及到特别底层或者我自己独创的技术点,AI 有时候会 “理解跑偏”,这时候就得我亲自上手校对、补充,确保技术深度和准确性。
我的经验是:把 AI 当成一个超能的 “初稿枪手”。它负责搭架子、填内容,我就能腾出脑子琢磨核心技术亮点,最后再精修一下。记住,AI 很喜欢 “加戏” (生成大量文字),我们只管 “删戏” (精挑细选),比自己从零开始写轻松多了。
AI帮忙写的技术白皮书,看着还挺专业
在公开分享或进行技术交流时,PPT 也是少不了的,准备一套专业的 PPT 同样需要花费不少时间。
我直接让 AI 根据官网和白皮书的核心内容,快速生成 PPT 大纲和关键文案。告诉它主题、目标受众和期望的关键信息点,AI 就能生成结构化的内容,甚至细化到每一页的大致内容。
我还试了 PopAi (网址在这[1]),这工具真不错!把前面的素材 (白皮书、官网啥的) 喂给它,选个顺眼的模板,它就能把内容给你填进去,并将其渲染到你选的 ppt 模板上。还是那句话:AI 负责 “多”,我负责 “精”。
除了上面那些大部头,项目宣传页、社交媒体的短文案、配图这些小东西,AI 也可以帮忙。
宣传册代码我也开源了:https://github.com/HUAHUAI23/ruiqi-waf-brochure
Demo 地址:https://kmuxmeuhrgvn.sealosbja.site/
总的来说,这个月在完善产品 “门面” 的阶段,AI 帮了我大忙。它让我好像长了三头六臂,啥都能干点。这对于没钱没时间的独立开发者来说,太重要了。
“面子工程” 搞得差不多了,下面该深入代码,进行关键的性能优化了。
WAF 这东西,天天处理那么多高并发请求,性能不行可不行,必须得行。
很多人不认为 AI 具有代码分析与优化能力,但事实胜于雄辩。下面我就挑一个 AI 帮我优化的点细说,实际上 AI 优化的地方不止这一处,AI 的厉害之处在于,它能旁征博引,给你提供一堆方案,还会写测试用例进行 benchmark 测试,用事实证明他的优化是对的。
我的 WAF 里,解析 HTTP 请求头 (Header) 是个常用操作,比如拿真实 IP、检查安全相关的 Header,都得用一个叫 getHeaderValue 的函数。
我一开始用 Go 标准库的 bufio.Scanner 来读 Header,看着还挺简单,结果呢发现这玩意儿在高并发场景下性能是非常拉胯。
AI (和我) 发现的问题主要是:
bufio.Scanner性能问题分析图
内存分配开销大:
每次调用 getHeaderValue,它都会新建 bytes.NewReader 和 bufio.NewScanner 这两个对象。你想想,高并发或者一个请求里要查好几个 Header (比如为了拿真实 IP,可能要试 X-Forwarded-For,X-Real-IP 等一堆),这内存开销累积起来就吓人了。
频繁调用:
就拿获取客户端真实 IP 来说,为了兼容各种代理 (Nginx、HAProxy、Cloudflare 这些),getRealClientIP 函数可能要查 9 个甚至更多的 Header。这意味着一个请求就可能让 getHeaderValue 被调用好几次,开销自然就放大了。
WAF 高频场景下的热点:
WAF 处理每个请求都得解析 Header,所以 getHeaderValue 自然成了性能热点。在这个函数上节省一点开销,在高吞吐量下效果就会被放大很多倍。
我一开始也试着在 bufio.Scanner 的基础上小修小补,结果 AI 分析说,要抓住根本问题——bufio.Scanner 本身带来的额外分配。
AI 直接建议我:别用 bufio.Scanner 了,直接在原始的 Header 字节切片 ([]byte) 上操作,简单粗暴有效。
既然自己搞不定,索性听 AI 的,让它全权负责代码。AI 不仅把优化代码写出来了,连测试用例都配齐了。
AI 的优化思路是这样的:
零额外分配:
直接在输入的 []byte 上搞事情,不创建 bytes.NewReader 和 bufio.NewScanner 这些劳什子,内存分配自然就没了。
预处理目标头:Header 名比较是不区分大小写的,AI 建议先把要找的 Header 名转成小写。解析的时候,读到的 Header 名也转小写再比。这样,目标 Header 名就不用每次都转了。
更快的字符串比较:手动实现字节切片的大小写不敏感比较,或者用 Go 标准库里更底层的字节操作函数,比先把 []byte 转成 string 再用 strings.EqualFold 比要快,还省了转换的开销。
看看代码对比 (优化后的代码是 AI 生成,我验证过了):
// 原始的bufio.Scanner实现(用于性能对比)
funcgetHeaderValueOld(headers []byte, targetHeader string) (string, error) {
s := bufio.NewScanner(bytes.NewReader(headers))
for s.Scan() {
line := bytes.TrimSpace(s.Bytes())
iflen(line) == 0 {
continue
}
kv := bytes.SplitN(line, []byte(":"), 2)
iflen(kv) != 2 {
continue
}
key, value := bytes.TrimSpace(kv[0]), bytes.TrimSpace(kv[1])
if strings.EqualFold(string(key), targetHeader) {
returnstring(value), nil
}
}
return"", nil// 实际应返回 error or specific not found value
}
// AI辅助优化后的 getHeaderValueOptimized 实现
funcgetHeaderValueOptimized(headers []byte, targetHeader string) (string, error) {
// 预处理目标头部为小写,避免重复转换
targetLower := strings.ToLower(targetHeader)
targetBytes := []byte(targetLower)
targetLen := len(targetBytes)
i := 0
for i < len(headers) {
// 找到行的开始
lineStart := i
// 找到行的结束(\n 或 \r\n)
for i < len(headers) && headers[i] != '\n' && headers[i] != '\r' {
i++
}
lineEnd := i
// 跳过换行符
if i < len(headers) && headers[i] == '\r' {
i++
}
if i < len(headers) && headers[i] == '\n' {
i++
}
// 跳过空行
if lineEnd == lineStart {
continue
}
// 在当前行中查找冒号
colonPos := -1
for j := lineStart; j < lineEnd; j++ {
if headers[j] == ':' {
colonPos = j
break
}
}
if colonPos == -1 {
continue// 没有冒号,跳过这行
}
// 提取key(去除前后空格)
keyStart := lineStart
keyEnd := colonPos
// 去除key前的空格
for keyStart < keyEnd && (headers[keyStart] == ' ' || headers[keyStart] == '\t') {
keyStart++
}
// 去除key后的空格
for keyEnd > keyStart && (headers[keyEnd-1] == ' ' || headers[keyEnd-1] == '\t') {
keyEnd--
}
keyLen := keyEnd - keyStart
// 快速长度检查
if keyLen != targetLen {
continue
}
// 手动进行大小写不敏感比较
match := true
for j := 0; j < keyLen; j++ {
c := headers[keyStart+j]
// 转换为小写进行比较
if c >= 'A' && c <= 'Z' {
c = c + ('a' - 'A')
}
if c != targetBytes[j] {
match = false
break
}
}
if !match {
continue
}
// 找到匹配的header,提取value
valueStart := colonPos + 1
valueEnd := lineEnd
// 去除value前的空格
for valueStart < valueEnd && (headers[valueStart] == ' ' || headers[valueStart] == '\t') {
valueStart++
}
// 去除value后的空格
for valueEnd > valueStart && (headers[valueEnd-1] == ' ' || headers[valueEnd-1] == '\t') {
valueEnd--
}
// 返回value
if valueEnd > valueStart {
returnstring(headers[valueStart:valueEnd]), nil
}
return"", nil// 实际应根据需求返回空字符串或错误
}
return"", nil// Header not found, 实际应返回 error or specific not found value
这个直接操作字节的优化,比原来用 bufio.Scanner 的内存分配和对象创建少多了,简直就是 AI 辅助 Go 代码优化的典范。
光说不练假把式,优化效果得看数据。AI 不仅给了方案,还给我写性能测试 (Benchmark) 来验证。
根据 AI 的指引,我为优化前 (getHeaderValueOld) 和优化后 (getHeaderValue) 的函数编写了 Go 语言的基准测试代码,模拟了不同的 HTTP Header 场景,特别是包含了多次出现 X-Forwarded-For 的复杂情况。
结果一出来,我惊了:
核心性能 PK - 查单个 Header
查多个 Header 场景 (模拟拿真实 IP)
1. 针对 X-Forwarded-For
的优化效果
2. 最惨的情况 (要找的 Header 在最后面)
3. XFF 专用快速通道 (额外优化)
4. 内存分配专项测试
🏃♂️ 跑得更快了
💾 内存开销更少了
🔄 分配次数也少了
⚡️ 特殊优化
所有数据都是拿 Go 的 Benchmark 实打实跑出来的,测试代码覆盖了 5 个不同维度的场景,童叟无欺。
这次我能精准优化 Go 的 HTTP 头解析,那是有原因的,主要靠下面这几招:
策略上:
getHeaderValue
这个高频热点函数,集中火力优化。bufio.NewScanner
、bytes.NewReader
这些对象和调用它们的方法。技术上:
Scanner
,自己写了个更高效的字节级解析逻辑。[]byte
数据上查找、分割、比较,避免了转 string
的开销。通过这次 Go 函数的优化,我算是彻底服了 AI 在解决具体技术难题时的能力。
它不仅能分析代码、找出性能问题,还能给出突破性的优化方案,甚至教你怎么验证。我一个独立开发者,没人帮我 Code Review,也没专业的性能分析团队,AI 简直就是我的技术大腿、最佳拍档!
这一个月折腾 WAF 产品,特别是跟 AI 深度合作,这个过程不光完善了产品本身,也让我对 AI 有了全新的认识。
一开始我对 AI 的感受更多是担忧——担心 AI 的进步会最终替代开发者的工作。但这两个月下来,AI 一次又一次帮我解决问题、提高效率,我彻底想通了:AI 不是来抢饭碗的,它是来给我递 “金饭碗” 的,是个能把我的能力放大好几倍的超级工具。
但是想跟 AI 高效合作,得有点技巧:
ask
模式适合快速查点东西、生成小代码片段,而 agent
模式在处理复杂项目结构或者多步骤任务时更牛。像 DevBox 这种开发环境管理工具跟 AI 结合起来,AI 建议个环境配置啥的,DevBox 就能帮我快速搞定,AI 的建议和实际操作无缝对接,迭代起来非常快。AI 虽然牛,但也不是万能的。在打磨产品、跟 AI 合作的过程中,我也踩了不少坑:
从这些坑里,我学到了:
AI 本身发展也快得很,跟它合作的过程充满了不确定性。得保持开放心态,不断尝试新工具、新方法,在实践中学习怎么更好地利用 AI。
通过这次折腾,我深刻感觉到,AI 给独立开发者,特别是那些可能编程经验没那么丰富,但有好点子、执行力强的人,带来了前所未有的机会。
AI 降低了很多以前需要大量专业知识和时间的门槛:
可以预见,在 AI 的持续赋能下,未来会有更多由个人或小团队创造出来的高质量产品。关键在于,开发者怎么转变思路,把 AI 当成一个聪明的 “合伙人”,学会怎么跟它高效协作,然后把省下来的精力投入到更有创造性、更需要人类智慧的地方——比如,发现真正有价值的问题,进行深度思考。
当然,我的 WAF 产品之路还没结束,后面还会继续完善安全规则、优化用户体验,当然,也会分享怎么在 Sealos 上用这个 WAF 保护你的网站和应用。
文章来自微信公众号 “ Sealos “,作者 花花
【开源免费】AutoGPT是一个允许用户创建和运行智能体的(AI Agents)项目。用户创建的智能体能够自动执行各种任务,从而让AI有步骤的去解决实际问题。
项目地址:https://github.com/Significant-Gravitas/AutoGPT
【开源免费】MetaGPT是一个“软件开发公司”的智能体项目,只需要输入一句话的老板需求,MetaGPT即可输出用户故事 / 竞品分析 / 需求 / 数据结构 / APIs / 文件等软件开发的相关内容。MetaGPT内置了各种AI角色,包括产品经理 / 架构师 / 项目经理 / 工程师,MetaGPT提供了一个精心调配的软件公司研发全过程的SOP。
项目地址:https://github.com/geekan/MetaGPT/blob/main/docs/README_CN.md
【开源免费】LangGPT 是一个通过结构化和模板化的方法,编写高质量的AI提示词的开源项目。它可以让任何非专业的用户轻松创建高水平的提示词,进而高质量的帮助用户通过AI解决问题。
项目地址:https://github.com/langgptai/LangGPT/blob/main/README_zh.md
在线使用:https://kimi.moonshot.cn/kimiplus/conpg00t7lagbbsfqkq0