一年时间,3万行Go代码,我写了一个博客程序2023-03-21 02:03:26

前言
地址: github.com/go-sonic/so…
Sonic [ˈsɒnɪk] ,Sonic 是一个用 Golang 开发的博客平台。
写这个项目的原因是我自己也是一名博主,喜欢写博客,用过 WordPress 、typecho 、Hexo 、Hugo 等,但是总有一些不满意的地方
Halo 感觉非常不错,典型的 C/S 架构,很符合我这个后端程序员的口味。虽然 Java 是一种高性能的语言,但是缺点是占用内存较多,一些配置较低的主机并不符合要求,Go 的协程天然适合 Web 这种并发场景,并且内存占用极低。而且 Halo 自身也有些小缺陷,比如 For 循环查库,遂决定基于 Go 写一个高性能的博客框架
需要说明的是,Sonic 的灵感来自 Halo ,也借鉴了 Halo 很多优秀的设计,后台管理界面更是直接 Fork 自 Halo 。Sonic 未来的主要目标是快、轻量、优雅的代码,希望能成为 Golang web 的 best practice 之一
预览

博客程序对比
静态 VS 动态
静态的优点 静态博客目前有Hugo、Hexo、Jekyll,动态的且比较知名的则有WordPress、Typecho、Halo

非常轻量,纯文件访问,高性能
可以不需要自己的服务器
安全
方便结合 git 工作流

动态的优点

实时的内容更新
实时的阅读量排行
动态的图片压缩优化
保存点赞评论等用户生成的内容
可以进行数据分析
复杂功能只能是基于动态博客实现,比如付费文章、加密文章

动态博客对比
博客系统语言数据库主题和插件生态Markdown支持Star数量系统配置要求WordPressPHPMySQL/MariaDB非常多否(需要安装插件)16.9K(仅做参考)较低TypechoPHPMySQL/SQLite较多是9.6K非常低HaloJavaMySQL/PostgreSQL较少是25K高(至少1GB内存)GHostNode.jsMySQL较多是42K高(至少1GB内存)JPressJavaMySQL较少是2.5K高
对比几款比较主流的CMS系统,体验比较好的应该是Typecho,但是Typecho使用PHP开发,使用PHP开发的系统,包括WordPress,个人觉得其实槽点比较多:

如果不使用Docker安装,需要先安装PHP环境,以及一大堆PHP扩展,对于非开发人员并不友好。
个人并不喜欢PHP,脚本语言、解释执行,以至于想搞个定时任务都特别麻烦,CGI+FPM的设计也太奇葩。时代在前进,PHP的使用率在降低。(并不是想发起语言之争,以上仅代表我自己的看法)

Halo使用Java开发,比较不错,但是也有我不满意的点:

服务器要安装JRE
内存占用太高。个人博客一般都是运行在配置比较低的小主机上
不支持SQLite(虽然支持H2这种嵌入式数据库,但是官方并不推荐在生产环境使用),需要单独安装MySQL/PostgreSQL,但是个人博客其实并不需要这种比较重的数据库系统,单个文件的SQLite可能才是最好的选择,数据库的备份也特别方便
代码质量比较低,很多For循环查库。
综上,运行Halo需要 Java Run Time + Halo+ MySQL,成本较高

我期望的博客系统应该是:

无需安装任何依赖,如PHP、Java、Nginx、MySQL等
数据库使用 SQLite 这种,不需要单独安装数据库服务
只有一个可执行文件
系统资源占用非常低,即使在256MB的机器上,也可以高速运行

有了上面的几个诉求,我发现目前并没有能满足我要求的开源博客系统,于是决定自己写一个!Golang非常适合作为开发语言,有着高性能、编译产物是一个可执行的二进制程序、编译产物的体积也比较小、生态比较完善等优点。最终,Sonic来了,完美实现了上面的几个诉求:

只有一个二进制程序,无需安装任何依赖
轻量,安装包只有14MB
高性能,文章详情页最高可达 2500 QPS (Intel Xeon Platinum 8260 4C 8G SQLite)
内存占用极低,10MB的内存占用
支持SQLite,方便备份
支持Linux、Windows、Mac OS等操作系统. 并且支持x86、x64、Arm、Arm64、MIPS等指令集

功能

文章管理
分类管理
标签管理
附件管理,支持OSS(MINIO、Google Cloud、AWS、AliYun)
支持多主题(目前有2款主题)
支持自定义页面
菜单编辑
评论管理
日志功能
图库功能
Markdown导入,支持从Hugo、Hexo、Jekyll导入,支持导出文章为Markdown
RSS/Atom支持
SEO优化
支持MySQL/SQLite

代码量
languagefilescodecommentblanktotalGo30428,3459134,53533,793Go Template File372,03301582,191YAML161,662241931,879Markdown117404180924SQL1269028297JSON316002162Docker12001030Shell Script1141520
TODO
目前Sonic还是有些不太完善的地方,后面会将开发重心放在以下几个方面:

插件系统(基于Wasm)
i18n
更多的主题
代码的重构优化,希望能让项目的代码更优雅
PostgreSQL支持

« »