BeiDou-Serverの内部構造:Java 21によるMapleStoryサーバーエミュレーションの現代的アプローチ
2000年代後半のクライアントサイドMMORPGの黄金時代を経験した人なら、きっとMapleStoryのことを覚えているだろう。ピーク時には、この2Dグラindingゲーム的巨大なファンコミュニティを形成していた。当時のプライベートサーバーは場当たり的なもので作られていた:OdinMSやHeavenMSのソースコードを引っ張ってきて、Java 6用のパッチを山ほど当て、古びたNavicatで巨大なデータベースダンプを手動インポートし、100人のプレイヤーが接続した途端にクラッシュしないことを祈る——そんな感じだった。
これらのエミュレータの多くは、15年前のレガシーコードに閉じ込められたままだった。BeiDou-Serverプロジェクトの開発者たちは、異なるアプローチを取ることを決めた。Cosmicプロジェクトを基盤として、モダンなテクノロジースタックを使ってサーバーサイドのコードを書き直し、最適化することにした:JDK 21、MySQL 8、SwaggerによるREST API、そして管理用の分離されたNode.jsフロントエンドだ。
BeiDou-Serverのアーキテクチャの構成要素
プロジェクトは2つの主要コンポーネントに分割されている:ゲームロジックとAPIを担当するバックエンドgms-serverと、Webインターフェースgms-uiだ。開発者たちは古いMySQLバージョンのサポートを切った——実行にはバージョン8.0以上が必要だ。
コードを初めて見た時に最も嬉しい驚きは、最初の起動時の定型タスクの自動化だ。サーバーは自動的にDBMS内の必要なスキーマ是否存在をチェックし、テーブルを作成し、初期SQLスクリプトを適用する。もう третьパーティ製のユーティリティをインストールしてデータベースをインポートする必要はなくなった。
バックエンドのアーキテクチャのハイライト
- OpenJDK 21への移行。最新のJavaバージョンを使用することで、古いコンストラクトを排除し、ネットワークパケットの処理やメモリ管理で現代的な言語機能を適用することが可能になった。
- ポート8686上のREST API。開発者たちはSwagger UIを統合しており、サービスの起動直後から利用可能だ。これによりデバッグと外部サービスとの統合が大いに簡素化される。
- エンドポイントのバージョニング。プロジェクトは
ApiConstant.LATEST定数を通じて明確なAPIバージョニングスキームを実装している。新しいアプリケーションバージョンでメソッドが変更されていない場合、重複させる必要はない——ルーティングが自動的にリクエストを現在のコントローラにリダイレクトする。 - 多言語リソースエンジン。サーバーは異なるディレクトリからローカライズされたゲームデータやスクリプトを動的にロードできる(例えば、中国語用の
wz-zh-CNや英語用のscript-en-US)。
Web管理パネルとグラフィックスの処理
インターフェースgms-uiは、Yarnパッケージマネージャーを使用してNode.js v20.15.0で構築されている。古いエミュレータでは管理パネルがサーバー自体の中にSwingフォームの嵐だったのに対し、ここではパネルは完全にWebベースだ。
数千ものアイテムスプライト、モンスター、マップグラフィックスの保存と表示の問題は、シンプルに解決されている。リポジトリをギガバイトのグラフィックアセットで肥大化させることを避けるため、Webパネルはmaplestory.ioサービスの外部APIを通じて直接画像リクエストを行う。
コンテナデプロイと管理
デプロイとコンテナでの作業
以前、Dockerの設定はメインリポジトリに直接置かれていただが、時間の経過とともに作者たちはコンテナ化関連のすべてを別プロジェクトBeiDou-dockerに移動した。GitHub Packagesには готовый образ beidou-server-allがすでに用意されているため、ソースからビルドせずに数分でテスト環境をデプロイできる。
ローカル開発には、標準的なツールセットが必要だ:
- OpenJDK 21
- IntelliJ IDEA 2023.3以降
- MySQL 8 DBMS
- GitとMaven
ビルド済みのサーバーバイナリとクライアントはReleasesセクションで入手でき экспериментальныеビルドを試したい人のために、早期ベータバージョン用の別ブランチも用意されている。
遭遇する可能性のある課題
BeiDou-Serverの主な欠点は言語の壁だ。プロジェクトは中国語を話すコミュニティによって作成されているため、コードコメント、イシューの議論、Wikiページのほとんどは中国語で書かれている。
しかし、Swaggerと明確なディレクトリ構造があれば、言語の知識がなくてもコードのナビゲーションはずっと容易になった。さらに、作者たちはプロジェクトのWikiをコミュニティ編集に完全に開放しているため、ドキュメントは徐々に英語でも補完されている。
このプロジェクトに興味を持つかもしれない人
BeiDou-Serverは、古いオンラインゲームの巨大なレガシーコードを、モダンなスタックを持つ理解しやすいプロジェクトに変換する、熱意ある开发者たちの素晴らしい例だ。
ゲーム開発に興味がある人、MMORPGのネットワークプロトコルがどのように機能するかを探りたい人、JavaでのマルチバージョンREST API組織の実際の例を見たい人、または単に古いゲームにノスタルジーを感じる人——これらのソースコードは確かにチェックする価値がある。
関連プロジェクト