一年時間,3萬行Go代碼,我寫了一個博客程序
前言
地址: github.com/go-sonic/so…
Sonic [?s?n?k] ,Sonic 是一個用 Golang 開發(fā)的博客平臺。
寫這個項目的原因是我自己也是一名博主,喜歡寫博客,用過 WordPress 、typecho 、Hexo 、Hugo 等,但是總有一些不滿意的地方
Halo 感覺非常不錯,典型的 C/S 架構,很符合我這個后端程序員的口味。雖然 Java 是一種高性能的語言,但是缺點是占用內存較多,一些配置較低的主機并不符合要求,Go 的協(xié)程天然適合 Web 這種并發(fā)場景,并且內存占用極低。而且 Halo 自身也有些小缺陷,比如 For 循環(huán)查庫,遂決定基于 Go 寫一個高性能的博客框架
需要說明的是,Sonic 的靈感來自 Halo ,也借鑒了 Halo 很多優(yōu)秀的設計,后臺管理界面更是直接 Fork 自 Halo 。Sonic 未來的主要目標是快、輕量、優(yōu)雅的代碼,希望能成為 Golang web 的 best practice 之一
預覽
博客程序對比
靜態(tài) VS 動態(tài)
靜態(tài)的優(yōu)點 靜態(tài)博客目前有Hugo、Hexo、Jekyll,動態(tài)的且比較知名的則有WordPress、Typecho、Halo
- 非常輕量,純文件訪問,高性能
- 可以不需要自己的服務器
- 安全
- 方便結合 git 工作流
動態(tài)的優(yōu)點
- 實時的內容更新
- 實時的閱讀量排行
- 動態(tài)的圖片壓縮優(yōu)化
- 保存點贊評論等用戶生成的內容
- 可以進行數(shù)據(jù)分析
- 復雜功能只能是基于動態(tài)博客實現(xiàn),比如付費文章、加密文章
動態(tài)博客對比
博客系統(tǒng) | 語言 | 數(shù)據(jù)庫 | 主題和插件生態(tài) | Markdown支持 | Star數(shù)量 | 系統(tǒng)配置要求 |
WordPress | PHP | MySQL/MariaDB | 非常多 | 否(需要安裝插件) | 16.9K(僅做參考) | 較低 |
Typecho | PHP | MySQL/SQLite | 較多 | 是 | 9.6K | 非常低 |
Halo | Java | MySQL/PostgreSQL | 較少 | 是 | 25K | 高(至少1GB內存) |
GHost | Node.js | MySQL | 較多 | 是 | 42K | 高(至少1GB內存) |
JPress | Java | MySQL | 較少 | 是 | 2.5K | 高 |
對比幾款比較主流的CMS系統(tǒng),體驗比較好的應該是Typecho,但是Typecho使用PHP開發(fā),使用PHP開發(fā)的系統(tǒng),包括WordPress,個人覺得其實槽點比較多:
- 如果不使用Docker安裝,需要先安裝PHP環(huán)境,以及一大堆PHP擴展,對于非開發(fā)人員并不友好。
- 個人并不喜歡PHP,腳本語言、解釋執(zhí)行,以至于想搞個定時任務都特別麻煩,CGI FPM的設計也太奇葩。時代在前進,PHP的使用率在降低。(并不是想發(fā)起語言之爭,以上僅代表我自己的看法)
Halo使用Java開發(fā),比較不錯,但是也有我不滿意的點:
- 服務器要安裝JRE
- 內存占用太高。個人博客一般都是運行在配置比較低的小主機上
- 不支持SQLite(雖然支持H2這種嵌入式數(shù)據(jù)庫,但是官方并不推薦在生產環(huán)境使用),需要單獨安裝MySQL/PostgreSQL,但是個人博客其實并不需要這種比較重的數(shù)據(jù)庫系統(tǒng),單個文件的SQLite可能才是最好的選擇,數(shù)據(jù)庫的備份也特別方便
- 代碼質量比較低,很多For循環(huán)查庫。
- 綜上,運行Halo需要 Java Run Time Halo MySQL,成本較高
我期望的博客系統(tǒng)應該是:
- 無需安裝任何依賴,如PHP、Java、Nginx、MySQL等
- 數(shù)據(jù)庫使用 SQLite 這種,不需要單獨安裝數(shù)據(jù)庫服務
- 只有一個可執(zhí)行文件
- 系統(tǒng)資源占用非常低,即使在256MB的機器上,也可以高速運行
有了上面的幾個訴求,我發(fā)現(xiàn)目前并沒有能滿足我要求的開源博客系統(tǒng),于是決定自己寫一個!Golang非常適合作為開發(fā)語言,有著高性能、編譯產物是一個可執(zhí)行的二進制程序、編譯產物的體積也比較小、生態(tài)比較完善等優(yōu)點。最終,Sonic來了,完美實現(xiàn)了上面的幾個訴求:
- 只有一個二進制程序,無需安裝任何依賴
- 輕量,安裝包只有14MB
- 高性能,文章詳情頁最高可達 2500 QPS (Intel Xeon Platinum 8260 4C 8G SQLite)
- 內存占用極低,10MB的內存占用
- 支持SQLite,方便備份
- 支持Linux、Windows、Mac OS等操作系統(tǒng). 并且支持x86、x64、Arm、Arm64、MIPS等指令集
功能
- 文章管理
- 分類管理
- 標簽管理
- 附件管理,支持OSS(MINIO、Google Cloud、AWS、AliYun)
- 支持多主題(目前有2款主題)
- 支持自定義頁面
- 菜單編輯
- 評論管理
- 日志功能
- 圖庫功能
- Markdown導入,支持從Hugo、Hexo、Jekyll導入,支持導出文章為Markdown
- RSS/Atom支持
- SEO優(yōu)化
- 支持MySQL/SQLite
代碼量
language | Files | code | comment | blank | total |
Go | 304 | 28,345 | 913 | 4,535 | 33,793 |
Go Template File | 37 | 2,033 | 0 | 158 | 2,191 |
YAML | 16 | 1,662 | 24 | 193 | 1,879 |
Markdown | 11 | 740 | 4 | 180 | 924 |
SQL | 1 | 269 | 0 | 28 | 297 |
JSON | 3 | 160 | 0 | 2 | 162 |
Docker | 1 | 20 | 0 | 10 | 30 |
Shell Script | 1 | 14 | 1 | 5 | 20 |
TODO
目前Sonic還是有些不太完善的地方,后面會將開發(fā)重心放在以下幾個方面:
- 插件系統(tǒng)(基于Wasm)
- i18n
- 更多的主題
- 代碼的重構優(yōu)化,希望能讓項目的代碼更優(yōu)雅
- PostgreSQL支持
作者:GoSonic
鏈接:https://juejin.cn/post/7179097961811411001