7.Go言語CMS開発実戦:AnQiCMSがIrisフレームワークをベースにした技術アーキテクチャの解析
tag: Go言語,Iris,AnQiCMS,技術構造
category_id: 35

多くの人にAnQiCMSがGo言語で開発されている理由を尋ねられます。この質問には二つの層で答えます:一是Goを選んだ理由、二是Irisフレームワークを選んだ理由。
なぜGo言語を選んだか

パフォーマンス
Goはコンパイル型言語で、コンパイルすると機械コードが生成され、直接実行されます。PHPは解釈型言語で、それぞれのリクエストでコードを解釈する必要があります。コンパイル実行の速度は解釈実行よりも速く、この差は天然のものです。
Goの並行モデルはPHPよりも優れています。PHP-FPMはそれぞれのリクエストでプロセスを作成し、高並行処理では大量のプロセスが作成されます。Goはgoroutineで並行処理を行い、1つのgoroutineは2KBのスタックスペースしか占めません。1つのプロセスは同時に何十万ものgoroutineを動かすことができます。
デプロイメントが簡単です
Goはコンパイルするとバイナリファイルになります。Linuxサーバーに置いて、chmod +xして実行します。PHPをインストールする必要はありません、拡張をインストールする必要もなく、環境変数を設定する必要もなく、Nginxのリバースプロキシを設定する必要もありません(ただし、本番環境では追加することをお勧めします)。
Dockerデプロイメントが簡単で、一行のコマンドで:
docker pull anqicms/anqicms
docker run -p 8080:8080 anqicms/anqicms
メモリ使用量が低い
Goにはゴミ収集メカニズムがあり、手動でメモリを管理する必要はありません。しかし、そのGC効率は多くの言語よりも高く、メモリの回収速度が速く、フラグメントが少ないです。
私が測定したところ、AnQiCMSは常駐メモリが約45MBで、200の並行処理時も約80MBです。同じ並行処理では、PHP-FPMは数百MBから数GBに達します。
クロスコンパイルが簡単
Goはクロスコンパイルをサポートしています。MacでLinuxのバイナリファイルをコンパイルする場合、2つの環境変数で解決できます:
GOOS=linux GOARCH=amd64 go build -o anqicms
これがCI/CDプロセスに非常に便利です。
なぜIrisフレームワークを選んだのか?

GoのWebフレームワークはたくさんあります、Gin、Echo、Beego、Irisが多くの人々に使われています。AnQiCMSはIrisを選んだ理由がいくつかあります:
パフォーマンスが良い
IrisのパフォーマンスはGoフレームワークの中で上位に入っています。公式のベンチマークテストでは、IrisのQPSがGinよりも少し高く、大きな差ではありませんが、CMSを作る場合、ベースが少し速ければ全体も少し速くなります。
機能が豊富
Irisには多くの機能が内蔵されています、ルーティング、ミドルウェア、セッション管理、テンプレートエンジンなどがあります。AnQiCMSは自分で多くのループを作る必要はありません。
ルーティングが柔軟
Irisのルートは正規表現、ワイルドカード、パラメータバインディングをサポートし、柔軟です。AnQiCMSの静的ルールとURLマッピングは、Irisのルートシステムを使用して実現するのが簡単です。
ドキュメントが十分です
Irisのドキュメントは十分で、問題があればドキュメントを確認してほとんどの問題を解決できます。
AnQiCMSのプロジェクト構造

AnQiCMSのプロジェクト構造は非常にクリアで、主なディレクトリ:
anqicms/
├── cmd/ # 入口程序
├── pkg/ # 核心包
│ ├── admin/ # 后台管理
│ ├── app/ # 应用层
│ ├── model/ # 数据模型
│ ├── service/ # 业务逻辑
│ └── web/ # 前台页面
├── template/ # 模板文件
├── static/ # 静态资源
├── uploads/ # 上传文件
└── conf/ # 配置文件
主要なロジックはpkgディレクトリ下にあり、機能モジュールごとに分けられています。この構造はクリアで、メンテナンスが簡単です。
データベース設計

AnQiCMSはMySQLを使用しています。データベース設計にはいくつかの特徴があります:
モデル化
内容をモデルに基づいて構成し、各モデルに対応するテーブルがあります。記事モデル、製品モデル、ページモデルなど、それぞれ独立したテーブルがあります。この設計は拡張性が高いです。新しいモデルを追加するには、新しいテーブルと新しいフィールドを追加するだけで十分です。
フィールドが設定可能です
カスタムフィールドをサポートしています。各モデルはカスタムフィールドを追加できます。フィールドのタイプには、テキスト、数字、日付、ドロップダウンセレクト、画像などがあります。カスタムフィールドは拡張テーブルに存在し、クエリ時にJOINを行うだけでよいです。
キャッシュメカニズム
ページキャッシュとfragmentキャッシュをサポートしています。テンプレート内でcacheタグを使用してキャッシュ粒度を制御し、個々のモジュールまで詳細に設定できます。
並行処理

Irisの並行モデルはGoのgoroutineに基づいています。各HTTPリクエストはgoroutineで処理され、goroutine間はchannelで通信します。
バックエンド管理とフロントエンドページは独立したルートグループであり、影響し合いません。バックエンドの操作はフロントエンドページを停止させず、フロントエンドの高並行処理もバックエンドを遅らせません。
ログは非同期に書き込まれ、リクエスト処理の速度に影響しません。
セキュリティメカニズム

認証
JWT認証。ユーザーがログイン成功後、JWTトークンが返されます。後続のリクエストはトークンを持ち運び、認証を行います。トークンには有効期限があり、自動で更新することもできます。
パスワードはbcryptで暗号化して保存され、明文でもMD5でもありません。
防護
SQLインジェクション防護:すべてのデータベース操作はパラメータ化クエリを通じて実行され、SQL文字列を結合しません。
XSS防護:ユーザーの入力内容はHTMLエンティティーコーディング後に表示されます。
CSRF防護:フォームリクエストにはCSRFトークンを持ち運び、サーバー側で確認が通過した後に処理されます。
バックエンドドメインホワイトリスト:バックエンドでアクセスを許可するドメインを設定し、バックエンドの不法アクセスを防ぐことができます。
プラグインメカニズム

AnQiCMSはプラグインメカニズムをサポートしています。プラグインはGoで書かれたモジュールやテンプレートファイルでできます。
プラグイン登録:バックエンドの「プラグイン管理」でプラグインファイルをアップロードし、システムが自動的にプラグインリストと依存関係を解析します。
プラグインのライフサイクル:インストール→有効化→アンインストール、各ステージには対応するフック関数があります。
パフォーマンス最適化

静的リソース処理
静的ファイル(CSS、JS、画像)はNginxで直接処理され、AnQiCMSを通さずに処理されます。Nginxの静的ファイル処理能力はアプリケーションサーバーよりも優れています。
データベース最適化
インデックスの設計が適切です。記事テーブル、カテゴリテーブル、タグテーブルには適切なインデックスがあります。リストクエリはインデックスを使用し、全テーブルスキャンを避けます。
キャッシュ戦略
多層キャッシュをサポート:
- ページキャッシュ:整个ページキャッシュ、不変内容に適しています。
- フラグメントキャッシュ:ページの局部的なキャッシュ、カテゴリリスト、ナビゲーションなどに適しています。
- データキャッシュ:単条データキャッシュ、設定情報などに適しています。
Gzip圧縮
レスポンスコンテンツはGzip圧縮をサポートし、伝送ボリュームを減少させます。
要約

AnQiCMSはGo + Irisの技術スタックを選択し、主要な理由はパフォーマンスとデプロイの便利性です。企業のウェブサイト構築にとって、これらの利点は直接低いサーバーコストとシンプルな運用プロセスに変換されます。
コードレベルでは、プロジェクト構造が明確で、データベース設計が合理で、セキュリティメカニズムが整っています。開発能力を持つ企業は、AnQiCMSの上で二次開発を行い、機能を拡張できます。
