Amazon Smokeフレームワークは、Swiftで書かれたオープンソースの新しい軽量サーバーサイドフレームワークで、RESTライクもしくはRPCライクなサービスの構築を目指している。そのアーキテクチャは使いやすさを重視し、リクエストハンドラーに純粋関数型のプログラミングスタイルを好んでいる。
Amazon Smokeによるサービス作成には、3つのステップが必要になる。
-
受信リクエストをハンドルするオペレーションを定義する。各オペレーションは
OperationInput
と汎用のApplicationContext
を引数にとり、OperationOutput
を同期もしくは非同期で返す関数により定義する。コードは次のようになる。// 同期ハンドラー func handleTheOperation(input: OperationInput, context: MyApplicationContext) throws -> OperationOutput { return OperationOutput() } // 非同期ハンドラー func handleOperationAsync(input: OperationInput, context: MyApplicationContext, responseHandler: (SmokeResult<OutputAttributes>) -> ()) throws { let result = OperationOutput() rensponseHandler(.response(attributes)) }
入力および出力タイプはValidatableCodable
プロトコルに準拠しなくてはならない。これによりvalidate
関数による入力および出力フィールドの検証が可能になる。
-
受信リクエストに対し、オペレーションハンドラーをどのように選択するかを指定する。Smokeは最初から、RESTライクなサービスで使える
StandardSmokeHTTP1HandlerSelector
を提供している。この場合、HTTP verbとURIに基づいて所定のリクエストのハンドラーを選択する。import SmokeOperations public typealias HandlerSelectorType = StandardSmokeHTTP1HandlerSelector<MyApplicationContext, JSONPayloadHTTP1OperationDelegate> public func createHandlerSelector() -> HandlerSelectorType { var newHandler = HandlerSelectorType() newHandler.addHandlerForUri("/theOperationPath", httpMethod: .POST, operation: handleTheOperation, allowedErrors: [(MyApplicationErrors.unknownResource, 400)]) return newHandler }
-
リクエストをデコードし、ハンドラーをディスパッチし、レスポンスをエンコードしてクライアントに送信するため、アプリケーションサーバーを設定する。エンコーディングとデコーディングは、アプリケーションサーバーに引数として渡されるアプリケーションデリゲートの責務だ。Smokeには、JSONリクエストおよびレスポンスのための
JSONPayloadHTTP1OperationDelegate
が含まれている。アプリケーションサーバーには、アプリケーションコンテキストをインスタンス化して渡す責務もある。import Foundation import SmokeHTTP1 import SmokeOperations import LoggerAPI // Enable logging here let operationContext = ... do { try SmokeHTTP1Server.startAsOperationServer( withHandlerSelector: createHandlerSelector(), andContext: operationContext, defaultOperationDelegate: JSONPayloadHTTP1OperationDelegate()) } catch { Log.error("Unable to start Operation Server: '\(error)'") }
Amazon Smokeのキーコンセプトは、アプリケーションコンテキストだ。これは起動時に作られ、可能な限り同時に、全てのハンドラーに渡される。スレッドセーフである必要性をなくして並行動作を簡素化するため、Amazonはこのオブジェクトを強い型付けにしてイミュータブルにすることを推奨している。それ以外は、どんな型であっても構わない。コンテキストを使うことで、出力が入力と渡されたコンテキストにのみ依存する純粋関数として、ハンドラーを書くことができる。これにより、ハンドラーをユニットテストしやすくなる、具体的には、開発環境とデプロイメント環境の差異を隠蔽しやすくなる。これはコンテキストを用いて、開発とデプロイメントで異なる依存性(たとえばモックサービス、乱数生成器など)を渡すことで実現できる。
Amazon SmokeはAppleのSwiftNIO上に構築されており、Swift Package Managerにインテグレートされている。package.swift
に次の依存関係ルールを追加することで、プロジェクトにインクルードすることができる。
dependencies: [
.package(url: "https://github.com/amzn/smoke-framework.git", .upToNextMajor(from: "0.6.0"))
]
SwiftのサーバーサイドフレームワークはSmokeだけではない。他に注目すべきものとして、VaporとKituraがある。Smokeと比べて、VaporとKituraの両者はより連結型のアーキテクチャを持ち、いろいろな意味でNode Express APIを思い出させる。両者ともに、データベースアクセスやセッション、クレデンシャル管理など、より多くのコンポーネントを含んでいる。
Rate this Article
- Editor Review
- Chief Editor Action