Seneca-Node.JS用のマイクロサービスツールキット。 アプリケーションの基本を処理するプラグインを提供します。 これにより、実際のビジネスロジックに集中できます。 使用するデータベース、コンポーネントの構成方法、依存関係の管理方法について心配する必要はありません。 コードを書き始めてください。
すべてをアクションとして説明します。 アクションは、プロパティのセットに一致するたびに呼び出されます。 呼び出し元のコードは、作業が実行するアクションを認識せず、気にしません。 1つのJavaScriptオブジェクトが非同期で入り、もう1つが終了します。
Seneca.jsではないもの
私は具体的な比較が大好きで、悲しいかな、急いで一般化して、最終的に私を傷つける可能性があります。 これを回避するために、セネカにはないもののリストを以下に示します。
- セネカは「厳格な」フレームワークではありません。 セネカは、お客様にアプリケーションアーキテクチャやアプローチを一切課しません。 すべてのアプリケーションを1つのアクションにまとめたいですか? できます。 わずか5行のコードですべてのアクションを実行したいですか? あなたもできます。 セネカは非常に信頼性が高く、あなたが行うほとんどすべてのアーキテクチャ上の決定で動作します。
Senecaは初心者向けのアプリケーションジェネレーターではありません。 初心者がすぐにアプリケーションを作成するために使用できる「Just Add Water」マジックはありません。 あなたが何をしているのかを知っていれば、セネカは非常に役立ちます。 あなたが何をしているかわからない場合、セネカはあなたのためにあなたの問題を解決しません。 それを使用するプログラマーと同じくらい良いです。
- Senecaは小さなユーティリティライブラリではありません。 Senecaは、lodashのような依存関係のないライブラリのようなものではありません。lodashはプラグインしてアプリケーション全体に散在させることができます。 セネカは非常に枝分かれしていて、フードの下で非常に魅力的です。 Senecaは、サイズの点でHapiとExpressを比較します(gzipで圧縮されたリリースとnode_modulesのディレクトリサイズを比較)。 これは、Senecaがパターンマッチング、アクションの順序、プロセスの相互作用に関連する非常に複雑な問題を解決する必要があると考える場合、非常に合理的です。
それでは、Seneca.jsとは何ですか?
これらの3つのポイントを読んだ今、あなたはおそらくセネカが何であるかについてかなり混乱しています。 このフレームワークを何度も説明し、さまざまな用語やフレーズを使用して、このセネカの定義が最も役立つことを発見しました。
Senecaは、アプリケーションを小さなアクションに分割するツールです。
この定義は、セネカが提供するすべてのものを単純化したものですが、セネカが行うことの中核です。 この定義で唯一のあいまいな用語は、セネカアプリケーションの基本要素である「アクション」という単語と、ツールキットによって提供される最も重要な抽象化です。
アクション
アクションは、JSONオブジェクトによって識別される関数です。 アクションはセネカの中核であり、セネカを使用するには、開発者はJSON識別子によってどこからでも呼び出すことができる小さな関数の観点から考えることができなければなりません。 アクションは、seneca.addメソッドを使用して作成されます。
seneca.add({role:'inventory', cmd:'find_item'}, function(args, done) { const itemId = args.id; // find item using any means necessary const item = byAnyMeansNecessary(itemId); done(null, item); });
アクションには、任意の粒度とJSONテンプレートを設定できます。 アクションは、{application: 'myApp'、達成: 'everything'}から{module: 'addition'、実行: 'onePlusOne'、理由: 'reasons'}です。 すべてのSenecaプラグインに見られる個人的なスタイルと慣習として、アクションを{role: 'namespace'、cmd: 'action'}の形式で保存しようとしています。「namespace」は複数のアクションの論理グループで、「action」は特定の特定したいアクション。
呼び出しアクションは、seneca.actメソッドを使用して実行できます。
seneca.act({role:'inventory', cmd:'find_item', id:'a3e42'}, function(err, item) { if (err) return err; console.log(item); // Perform other actions with item });
同じ役割を持つ1つのファイルに関連アクションを定義することを好みます(たとえば、todo-list.jsファイルにはtodo_list役割を持つすべてのタスクが含まれます)。 原則として、このファイルが150行を超えないようにし、各アクション定義をスクロールせずに読み込めるようにしようとします。 他の人は異なる好みを持っているかもしれませんが、このサイズは私にとって便利です。
なぜ行動するのか?
基本的なセネカ要素の基本的な理解が得られたので、システムをアクション定義とアクションコールに分解することの目標について疑問に思われるでしょう。 ここでの目標は、アプリケーションのコンポーネント間に許容可能な境界を作成し、よりモジュール化されたアーキテクチャについて考えさせ、すべてを1つのメインファイルにドロップしたいという欲求を回避することです。 すぐにわかるように、アプリケーションがアクションに分割された後、セネカはアクションを公開するための豊富なツールをHTTPマイクロサービスとWebサーバーのURLの両方で提供します。
行動の組織
関連するすべてのアクションを1つのファイルに保存する方法については前に述べましたが、これらのアクションを別のファイルのSenecaインスタンスにアタッチする方法については説明しませんでした。 Senecaには、seneca.useメソッドが含まれています。このメソッドは、対応するファイルまたはモジュールを検索し、それをSenecaインスタンスに含めます。 たとえば、すべて在庫に関連するいくつかのアクションがある場合、inventory.jsを作成し、そこですべてのアクションを定義します。
/* inventory.js */ module.exports = function(options) { const seneca = this; seneca.add({role:'inventory', cmd:'find_item', find_item); seneca.add({role:'inventory', cmd:'create_item', create_item); //... other action definitions function find_item(args, done) { const itemId = args.id; // ... perform find done(null, item); } function create_item(args, done) { const itemName = args.name; // ... perform item creation done(null, item); } } /* server.js */ const seneca = require('seneca')(); seneca.use('./inventory.js'); seneca.act({role:'inventory', cmd:'create_item', name:'apple'}, function(err, item) { console.log(item); }
これにより、inventory.jsのsenecaインスタンスへのリンクが取得されることに注意してください。 インスタンスにアクションを追加した後、server.jsでこれらのアクションを呼び出すことができます。 例としてinventory.jsを使用する一般的な形式-上部にあるseneca.addを呼び出し、メソッドを定義します。 これは必須ではなく、実装されているプラグインのいくつかがこの規則に従っています。
Expressとの統合から認証およびデータベースへのアクセスまで、アプリケーションで事前定義されたアクションを実行するために使用できるプラグインは数百あります。 エコシステムは非常に広範囲であり、アクションの操作方法を理解するとすぐにアプリケーションの作成を加速できます。
次のレベル:複数のプロセス
上の例では、ノードserver.jsを使用してアプリケーションを既に実行でき、すべてが1つのプロセスで発生します。
ただし、複数のプロセスを実行する必要がある場合はどうするか。そのうちの1つは単にインベントリアクションを処理し、他のプロセスはそれらを使用します。 NodeJSアプリケーションではプロセス間通信が難しい場合がありますが、Senecaではコードを2回変更するだけでこの動作を実現できます。
Senecaプラグインなどのアクションを使用して、inventory.jsを変更しないままにします。 ただし、2つの新しいファイルを作成します。1つはinventory-service.jsで、seneca.listenを使用してポート10101でサービスを開始し、もう1つはinventory-client.jsで、seneca.clientを使用してサービスにアクセスして使用しますアクション。
/* inventory-service.js */ const seneca = require('seneca')(); seneca.use('./inventory.js'); seneca.listen();
これで、ノードinventory-service.jsを別のプロセスで実行でき、10101ポートでリッスンします。 inventory-client.jsでは、次のように記述できます。
/* inventory-client.js */ const seneca = require('seneca')(); seneca.client(); seneca.act({role:'inventory', cmd:'create_item', name:'apple'}, function(err, item) { console.log(item); } // …
開始ノードinventory-client.jsは、前の例のserver.jsと同じように実行されますが、アプリケーションを複数のプロセスに水平にスケーリングできるようになりました。 これはSenecaを使用する真の利点です。アプリケーションを小さなアクションに分割したため、これらのアクションは異なるファイルまたは異なるプロセスで宣言することもできます。 Web統合に使用可能なプラグインを使用すると、別々のホスト上でもアクションを実行できます。
参照資料
興味があれば、これをすべてExpressと統合し、Dockerでラップしてスケーリングする方法を説明します。